2011-01-07 83 views
5

假設我有一個使用Latin1或某種默認英語編碼的Web應用程序。我想要將應用程序更改爲使用UTF-8或其他語言編碼。你能否證明這個改變會引入XSS?可以通過更改語言編碼來引入XSS嗎?

這不是一個PHP的具體問題,但在PHP中可以顯示一個案例,其中htmlspecialchars($var,ENT_QUOTES);容易受到XSS的影響,而htmlspecialchars($var,ENT_QUOTES,'UTF-8');則不是。

回答

1

RFC 3629

10.安全考慮

的UTF-8需要實施者考慮 他們 如何處理非法的UTF-8序列的安全方面。它是 可以想象,在某些情況下,攻擊者通過發送一個不是由UTF-8語法允許的不是 的八位字節序列,就能夠利用不謹慎的UTF-8解析器。

特別微妙此 攻擊的形式可以針對 解析器執行 安全關鍵的有效性檢驗 針對其 輸入的UTF-8編碼的形式來進行,但解釋某些非法 八位位組序列爲字符。對於 例如,當作爲單 八位組序列00編碼的解析器可能禁止 NUL字符,但錯誤地 允許非法 兩個八位字節序列C0 80和解釋 它作爲一個NUL字符。另一個例子可能是解析器,它禁止八位位組序列2F 2E 2E 2F(「/../」),但允許非法的 八位位組序列2F C0 AE 2E 2F。這 最後的利用實際上已被用於 廣泛的病毒在2001年攻擊Web 服務器;因此,安全威脅是非常真實的。

因此,確定您的數據有效的UTF-8至關重要。

但是一旦你完成了這個工作,與編碼相關的安全問題就會變得很小。所有的HTML特殊字符都是ASCII格式,ISO-8859-1等UTF-8格式完全兼容ASCII。 htmlspecialchars將按照您的預期行事。

對非ASCII兼容編碼有更多關注。例如,在GB18030中,ASCII字節0x30及以上可能發生在多字節字符的編碼中。 HYPHEN字符(U + 2010)編碼爲A9 5C,其中包含ASCII反斜槓。這使得正確處理反斜槓轉義變得更加困難,邀請SQL injection

4

這是一個愚蠢的例子,通過誤用htmlspecialchars從你的意圖。

<?php 
$s = htmlspecialchars($_GET['x'], ENT_QUOTES); 
$s_utf8 = htmlspecialchars($_GET['x'], ENT_QUOTES, 'UTF-8'); 

if(!empty($s)) 
    print "default: " . $_GET['x'] . "<br>\n"; 

if(!empty($s_utf8)) 
    print "utf8: " . $_GET['x'] . "<br>\n" 
?> 

提交任何XSS負載並添加無效的UTF-8字節,例如,對無效UTF-8字節序列

http://site/silly.php?x=<script>alert(0)</script>%fe

htmlspecialchars箍架和返回一個空字符串。打印$_GET值是一個明顯的漏洞,但我確實有一點要說明。

簡而言之,你將得到Latin1和UTF-8的逐字節檢查,所以我不知道一個語言相關的例子,其中htmlspecialchars將在一個編碼中錯過危險字節,但不會另一個。

我的例子的要點在於,在更改編碼方案時,您的問題更一般化(也可能有點太模糊)以適應XSS的危險。當內容開始處理不同的多字節編碼時,開發人員可能會根據strchr(),strlen()或類似的檢查來驗證過濾器,這些檢查不是多字節感知的,並且可能會受到有效載荷中%00的阻礙。 (嘿,一些開發者仍然堅持使用正則表達式來解析和消毒HTML。)

原則上,我認爲問題中的兩個示例行在切換編碼方面具有相同的安全性。在實踐中,仍然有很多方法可以用模糊編碼來彌補其他錯誤。

+0

+1,很有意思。 – rook 2011-01-08 00:46:20

+0

我想我可以提出的另一點是「知道你的錯誤處理」 - 它可以非常棘手地處理無效的字節代碼或被意外的行爲感到驚訝。 – Mike 2011-01-08 10:22:43

相關問題