2011-04-17 104 views
10

我敢肯定的是,這個問題的答案是沒有,但我似乎無法找到一種方法,簡單地轉化<>&lt;&gt;不能完全反映塊和持久性XSS。轉義< and >足以阻止XSS攻擊嗎?

我不是在談論CSRF。

如果這不阻止XSS,你能提供一個如何繞過這個防禦的例子嗎?

回答

6

在屬性中使用不受信任的字符串時(引用"),您需要將"轉義爲&quot

否則,你可以很容易地注入JavaScript。例如,<a href="{{str}}">str是例如" onmouseover='something-evil'"

+0

在後一種情況下,使用URL編碼,而不是HTML實體;在這種情況下''''變成了'%22' – 2011-04-17 21:07:30

+1

你不能只對一個*整個* URL進行URL編碼,因爲這也會中斷查詢字符串 – ThiefMaster 2011-04-17 21:22:06

+0

啊,所以轉義「,<, and >會阻止簡單的響應。寫入(輸入)隱藏,但如果我有一個現有的腳本塊或用直接用戶輸入構建DOM元素,其中< and >不是輸入運行所必需的,我仍然是脆弱的。 – 2011-04-17 22:12:06

3

不,這還不夠。請記住,XSS不僅僅是HTML中的不可信數據,您還可以在JavaScript和CSS中找到它。考慮一下這種情況,比如「var myVar = [input];」你可以用這個[輸入]值做任何類型的惡意事情,而不用走近尖括號。在XSS備忘單中有更多的例子:http://ha.ckers.org/xss.html

你已經在標籤中提到了ASP.NET;你想要看的是[AntiXSS library][1]。抓住這一點,並使用適當的輸出編碼:

Encoder.CssEncode() 
Encoder.HtmlEncode() 
Encoder.HtmlAttributeEncode() 
Encoder.JavaScriptEncode() 

等等等等。絕對沒有理由嘗試在.NET中做自己的字符替換。

4

號下面是兩個例子,其中逸出<>'"&是不夠的:

實施例1:

<a href="{{myUrl}}"> 

XSS攻擊:

myUrl = "javascript:alert(1)" 

例2:

<script>var page = {{myVar}};</script> 

XSS攻擊:

myVar = "1;alert(1)" 

,從而防止攻擊的方式參見https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

+0

如果您使用的是AngularJS,這不僅適用? – michaelsnowden 2015-06-25 00:39:20

+1

@michaelsnowden我在示例中使用了{{}}語法,但是任何模板庫都可能容易受到這些攻擊 – priomsrb 2015-06-25 00:54:33