2014-01-21 90 views
0

在閱讀Eric Lawrence的this article之後,我看到了這個測試頁http://www.enhanceie.com/test/xss/,它模擬了Reflective XSS Protection的用法。反射式XSS保護 - 澄清?

現在,根據google chromium

XSS過濾器檢查一個腳本,是關於一個網頁 上運行,是否也存在在獲取該網頁請求。如果請求中存在 腳本,這很明顯地表明 Web服務器可能已被誘騙反映該腳本。

所以,如果我上傳到服務器:

<script>alert("bang! script injection\n"+document.cookie);</script> 

和瀏覽器也看到它在通過URL請求:

http://webdbg.com/test/xss/Hello.asp?txtName=%3Cscript%3Ealert%28%22bang%21+script+injection%5Cn%22%2Bdocument.cookie%29%3B%3C%2Fscript%3E 

話,就說明這個錯誤(控制檯):

XSS審計員拒絕執行 'http://webdbg.com/test/xss/Hello.asp?txtName=%3Cscript%3Ealert%28%22bang%21+script+injection%5Cn%22%2Bdocument.cookie%29%3B%3C%2Fscript%3E' 中的腳本,因爲它的源代碼在請求中找到。由於服務器既沒有發送'X-XSS-Protection'也沒有發送'Content-Security-Policy'頭部,因此審計員啓用了 。

可是招潮蟹告訴我,頁面的確得到了腳本運行

enter image description here

問:

至於對付XSS的解決方案是html編碼解碼,

我應該如何將這兩種解決方案結合起來使用

我的意思是我可以使用html編碼和腳本永遠不會運行在我的網頁,或者,我可以使用這個頭...?

我很困惑。

+0

就像一個說明,有一些攻擊利用瀏覽器中的XSS過濾器,通過附加到查詢字符串的腳本片段,攻擊者_不想在受害者站點中運行。 – SilverlightFox

回答

3

但菲德勒不顯示我的頁面沒有得到腳本運行

不,不。 Fiddler向您顯示服務器將腳本發送回瀏覽器。它完全不會告訴你瀏覽器對腳本做了什麼。

由於解決處理,XSS是HTML編碼/解碼

這就是一個解決方案(也是最簡單的,最好的,如果你不需要讓用戶提交任何類型的HTML) 。

如何/何時合併這兩種解決方案?

你應該通過編碼實體編碼你的HTML任何用戶輸入,而忽略出現在一些瀏覽器,因爲不是所有的瀏覽器有他們,所以你不能依賴他們防XSS過濾器。

我的意思是,我可以用HTML編碼和腳本就從來沒有在我的網頁運行

只有編碼用戶輸入(因爲它是不可信的)。不要編碼自己編寫的腳本,因此可以信任。

0

編碼和解碼是XSS漏洞最可靠的解決方案。確保你編碼的正確的上下文。即如果受污染的數據被插入到javascript中,則調用javascript編碼器而不是html編碼器。 ESAPI有一個你需要的所有編碼器的好庫。

此外,一些瀏覽器現在支持帶有標題的內容安全策略設置,這些標題也有助於對抗XSS。這裏是一篇文章http://www.html5rocks.com/en/tutorials/security/content-security-policy/

不要依賴瀏覽器過濾器,因爲你不能確定你的用戶將在他們的瀏覽器中具有該功能。始終清理數據。

0

簡單的HTML編碼足以防止XSS。如果用戶輸入xss字符,則它們將被編碼,但字母數字字符將保持原樣。

除此之外,您可以在jsp頁面中使用核心jstl庫的標籤。

+0

編碼不是唯一的解決方案。一個更加安全的環境會消毒(通常拒絕需要消毒的請求是最安全的路線),然後編碼輸出。 – TheMonarch

0

更好地給出例子,而不是寫作。

反射XSS POC

<?php 
/** 
* @Author Vaibs 
* 
*/ 
$cookie_name = "user"; 
$cookie_value = "John Doe"; 
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day 
if (isset($_REQUEST['Submit'])) { //check if form was submitted 
    $input = isset($_REQUEST['appid']) ? $_REQUEST['appid'] : "";//get input text 
    echo "Input from client is reflected back as -> : " . $input; 
} 
?> 

<html> 
<body> 
<form> 
    <input type="text" name="appid"/> 
    <input type="submit" name="Submit"/> 
</form> 
</body> 
</html> 

如何避免? 答:最簡單的是使用PHP函數urlencode。

<?php 
/** 
* @Author Vaibs 
* 
*/ 
$cookie_name = "user"; 
$cookie_value = "John Doe"; 
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day 
if (isset($_REQUEST['Submit'])) { //check if form was submitted 
    $input = isset($_REQUEST['appid']) ? $_REQUEST['appid'] : "";//get input text 
    echo "Input from client is reflected back as -> : " . urlencode($input); 
} 
?> 

<html> 
<body> 
<form> 
    <input type="text" name="appid"/> 
    <input type="submit" name="Submit"/> 
</form> 
</body> 
</html> 

區別在於第二代碼中使用的urlencode函數的使用。