XSS 攻擊時怎麼繞過 htmlspecialchars 函數呢?


xss攻擊很多場景下htmlspecialchars過濾未必能奏效。

場景1:

源碼如下:

&
&

htmlspecialchars默認配置是不過濾單引號的。只有設置了:quotestyle 選項為ENT_QUOTES才會過濾單引號,如果此時你的輸出為

那麼仍然會繞過htmlspecialchars()函數的檢查,從而造成一個反射型的xss。

場景2:

僅僅用htmlspecialchars函數的地方錯用了該函數導致的xss,源碼如下:

&
&

場景3:客戶端造成的htmlspecialchars失效:

Opera瀏覽器跨域字符集繼承漏洞

此類漏洞已經不是單憑htmlspecialchars函數就能防禦的了。

上面3個場景僅僅只是較為常見的,還有一些別的場景可能會導致htmlspecialchars失效。尤其是各種編碼轉換、富文本、進入資料庫再取出資料庫這些地方等等。

最後,建議題主結合實際場景,去進行不同的環境測試,最後得出是否能繞過的結論。:)


繞不過。

所謂繞過就是挑程序員忘記正確轉碼的地方下手。

注意並非htmlspecialchars就萬事大吉,不同的地方需要不同的轉碼。所以所謂繞過htmlspecialchars也可能指那個漏洞點用htmlspecialchars轉碼壓根不正確。詳見:DOM-based XSS 與 存儲性XSS、反射型XSS有什麼區別? - 賀師俊的回答


看來我要小心使用htmlspecialchars了


具體繞過與否要看場景。

官網是這麼說的,對於單引號的轉義必須加上第二個參數ENT_QUOTES。

舉個栗子:

上面的htmlspecialchars沒有指定第二個參數。

當指定第二個參數時,

可以看到,不指定第二個參數會漏掉單引號,如果恰好在html標籤內輸出,完全可以閉合或者自己構造一個屬性,如直接構造一個on事件執行js。漏洞的例子:

HotCRP中的代碼:

實驗一下,這裡不用JavaScript偽協議也行。


不懂php 如果是類似jinjia2里safe標籤那種的話,那則無法繞過。畢竟人家就是用來sanitize用戶輸入的,而這正是防範xss的最常見手段。


安全開發技術課程-XSS跨站腳本攻擊漏洞及解決辦法XSS跨站腳本攻擊漏洞及解決辦法


推薦閱讀:

XSS 攻擊有哪些黑魔法?
如何評價 XSS 在黑客攻防中的地位或重要性?
Content Security Policy (CSP) 是什麼?為什麼它能抵禦 XSS 攻擊?

TAG:互聯網 | 網路安全 | 黑客Hacker | XSS | 計算機病毒 |