来Track安全社区投稿~
千元稿费!还有保底奖励~(https://bbs.zkaq.cn)
在挖漏洞时,使用 xia sql 插件发现一个注入点,经过测试发现存在 waf 拦截记录一下。
在查询中发现单引号是空白页面,在加一个单引号,显示空数据,但是有回显,初步判断 pname 存在 SQL注入。
1'order by 9--
无回显,1'order by 8--
有回显,所以为 8 列。
像这种有回显、无回显,只能选择盲注,第一反应是时间盲注,那就要看是什么数据库,根据 asp 我们选择 mysql、sqlserver 数据库,不同的数据库,延时语句不一样。
mysql:sleep()
sql server:waitfor delay 0:0:8
但是输入 1'if(length(database())=6,sleep(3),0)--
报错回显 502,说明存在 waf 拦截,经过测试 waf 拦截了 sleep()这个函数,那就避开 sleep()
函数,先测试其他函数benchmark()
,也被拦截。
在使用 length()
判断数据库名称的长度时,没有 502,返回空白页面,说明 WAF 没有拦截,但是语法错误,怎么会错呢?
想了半天,应该时 SQL server 数据库,不支持 length()、database()函数,使用 len()、db_name()函数测试。
len()函数计算正确和错误,回显数据不一致,说明猜测正确,数据库类型为 SQL server。
那就先测出 db_name()
数据库名称的长度。爆破出数据库名称长度为 15 位。
使用 sql server 数据库中的waitfor delay '0:0:8'
,发现还是被拦截,想到 db_name()和 len()没有被拦截,那就使用 substring()、ascii()函数一个一个计算数据库的字符。
?pName=1%27%20or%20ascii(substring(db_name(),1,1))>100--
,使用二分法判断
?pName=1'or ascii(substring(db_name(),1,1))=104--
,最后判断出 db_name 第一个字符为 104-----h
。
一个一个测是不可能的,直接写一个简单脚本跑一下。直接拿到数据库名称。
数据库得到了,接下来就按部就班的测试表的名称,计算第一个表的长度。
1'or%20len((select%20top%201%20name%20from%20sys.tables))%3D10--
第一个表的长度是 18,接下来就按部就班的使用脚本跑就可以。
所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.
原文始发于微信公众号(掌控安全EDU):挖洞日记 | 记一次MSSQL注入绕waf过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论