由于篇幅有限,本文就不去剖析漏洞原理,直接告知payload插入点,来展现盲注的用法(如有需要可自行寻找各方大佬的研究文章)。
注入点:
http://localhost/Joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=[payload]
BooleanBase
二分法
优点:
比遍历穷举快
缺点:
容易被封ip
速度慢
原理解析
常用函数:
left(x,y) // 从x的最左侧开始截取前y位
ascii(substr((sql),1,1))=num // 从sql语句返回的字符串的第一位开始,截取字符串的一长度,将其转换成ascii编码,然后与num比较
ord(mid((sql),1,1))=num // ord()==ascii()
regexp ‘^[a-z]’ // 在某些情况下,用正则表达式还是很方便的!
最后只需要将手工测试的过程转换成python用代码自动化实现
实战
直接上代码吧
DNSLOG
优点:
简单,不需要像二分法一样繁琐地一个个遍历
快速(相对于二分法而言)
缺点:
局限于Windows环境下(UNC路径)
Mysql版本>=5.5.53就要检查Secure_file_priv这个全局变量是否为空(若为NULL,则不可用,详见)
原理解析
找了国外的paper研究了一波,不懂的就来一波疯狂乱查,然后拿个小本本记下来~~
虽然大概明白是个什么意思,但是计网的dns知识(明年这个时候才学),我。。。有点晕~
然后自己似懂非懂地画了张利用dnslog进行sql盲注的原理流程图,如有不对,感谢各位大佬指正:
UNC路径:UNC为网络(主要指局域网)上资源的完整Windows 2000名称。格式:\servername\sharename,其中servername是服务器名。sharename是共享资源的名称。目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:\servername\sharename\directory\filename。(转自百度)
所以payload里面的四个’\\‘和两个’\\’经过转义后再通过concat函数拼接,就形成了\test.karmaof.me\123的UNC路径。
一开始自己搭建测试环境的时候遇到各种玄学问题……
实战
源码的$query里面带了一层mysqli的escape函数对单双引号等字符进行转义,所以对于dnslog的复现不是很有利,所以我就把过滤去掉了。
但是实践的时候又发现了问题:
查询是正常的,但是,并没有解析到dns记录
然后就做了个愚蠢的试验:
配合报错注入里面的查询,却可以解析到dns记录
后来看到作者用sqlmap跑的payload(DUAL表是一张虚拟表),发现用了一波case when,然后一样可以得到dns记录
但是这里有个疑问就是,尽管后面的句子不会执行,但是else后面的语句一定要加union查询,不加的话,是截获不了dns记录的。
估计审一波代码就可以知道为什么了 。◕‿◕。
所以就去搜了一波CASE WHEN然后发现它又是一个功能比较强大的东东:)
参考资料
OBB注入
DNSLOG利用
笔记: Data Retrieval over DNS in SQL Injection Attacks
TimeBase
前段时间看到do9gy@长亭科技大佬发的一篇文章,就赶紧学一波新型盲注技巧
sleep()
benchmark()
不推荐使用
笛卡尔积
(这是一个线代的概念??我怎么好像没有印象了……)
百度一波:
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 。
为了防止表明重复可能导致不必要的错误,所以一般都会用表别名来区别:
get_lock()
这个只演示原理吧,虽然延时精准,但是利用条件也很苛刻~~(需要使用mysql_pconnect函数来连接数据库)
session 1
session 2
参考资料
MySQL时间盲注五种延时方法 (PWNHUB 非预期解)
ErrorBase
floor()+count()+group by
(万能)
exp()
bigint
(Mysql Version >=5.4.45)
extractvalue()
(Mysql Version >=5.1.5)
与updatexml类似
updatexml()
(Mysql Version >=5.1.5)
updatexml最多只能显示32位,超过长度可以配合substr()
UpdateXML(xml_target, xpath_expr, new_xml)
第一个参数是含xml文档格式的字符串
第二个参数是xpath表达式,我们就是在这个参数上作文章:)
第三个是需要替换成的xptah表达式
name_const()
NAME_CONST(name,value)
生成名为name的列,并把value赋值过去,如果存在
重点标注的x可以换成其他字母,但是不能不填以及填数字。Every derived table must have its own alias不填会报错table需要别名。后来本地测试了一下:
就明白为什么了!
参考资料
Error Based SQL Injection Using EXP
BIGINT Overflow Error Based SQL Injection
本文作者:*KarmA@D0g3,本文属FreeBuf原创奖励计划,未经许可禁止转载**
领取专属 10元无门槛券
私享最新 技术干货