一次字符串拼接的sql注入实战
2020-10-21 11:50:06 Author: xz.aliyun.com(查看原文) 阅读量:215 收藏

在某次漏洞挖掘的过程中,发现了一个比较有意思的bool注入。在常规的and和or构造payload不能用的情况下,最后利用了字符串拼接的方法实现了注入。

注入点在account处。利用单引号稍稍测试即可发现输出的不同之处。


尝试闭合的时候,发现平时用的好好的payload都不管用了,死活闭合不上。见图。
这里有个小waf可以用注释+换行的方法过掉


按理来说这里应该是可以闭合上的才对。但是直接报了个参数错误(后面多次测试后猜测应该是sql句子语法报错的时候返回的错误提示信息)
or不行那就用and试试。图一已经确定了admin账号是存在的,测试一下。发现仍旧闭合不上


这里试着去掉等号直接采用account=admin'and'aaa的方式进行闭合看看能不能闭合上,仍旧失败。


这里猜想了一下后端是不是过滤了关键字导致了and和or之类的关键字被过滤。尝试双写


仍旧失败。这里我就只能认为后端是不是有什么奇怪的操作以至于闭合一直不成功。

歇了好几天,我又一次打开这个网站(毕竟到嘴的肥肉不能轻易放过)
想到之前我也挖到过这个系统老版本的注入,当时的DBMS用的是Oracle,但是当时的payload已经不起作用。
前面第一次输入account=admin的时候,根据回显可以判断admin账号是存在的。
于是就想着试试看能不能利用拼接操作,让数据库执行一下拼接的句子。
可以看到,这个account=adm'||'i'||'n的payload成功的闭合了


随后灵机一动,将i这里换成CHR(105)看看执行的结果。


没有问题!那这样的话,就可以根据回到平时构造payload的路上,想办法在'i'这里替换我们的payload,并且让最后的结果仍旧为字母i,即可读取到数据。

这里稍微构思了一下,最后采用了 account=adm'||CHR(ASCII(SUBSTR()))||'n的形式来构造。
只要用ASCII函数将SUBSTR截取的字符的ASCII码值取出后,适当加减一些数字,使得CHR的参数等于105,即可知道原本的字符是什么。

用bp爆破了一下user的首位字母,如下。

成功爆破出了第一位。那么接下来就可以写个脚本跑数据了。跑了一下当前的用户,结果见图

由于笔者对ORACLE的了解有限,如果文章中有什么不当之处,还请师傅们多多指正。本篇也只是在常规的and和or不可用的情况下,偶然想到的一种绕过方法,在其他DBMS下并未进行测试。


文章来源: http://xz.aliyun.com/t/8396
如有侵权请联系:admin#unsafe.sh