名字很像,傷害不同:data:// & data: 分別在 PHP 和瀏覽器的危機

前言 最近筆者忙著衝刺 OSCP Lab,過程中發現了一個有趣的小東西: PHP Wrapper 。 其中有個特別讓人眼睛一亮的東東: data:// 。 那時候我心裡想, data:// ... 怎麼長得跟之前看到的 「 瀏覽器支援的 內嵌資源格式 」 :「 data: 」 有 87% 相似? 結果這個念頭就剛好戳中我的強迫症,忍不住想把兩者 好好整理、比較一下 。 👾 PHP wrapper 的 data:// 危險在哪? 什麼是 PHP 的 data:// 它是 PHP 官方提供的「虛擬檔案協定」 。 讓你可以用「字串」來模擬成一個「檔案」給 PHP 讀取。 會被 include() 、 file_get_contents() 、 fopen() 等函數當成檔案來處理 。 為什麼危險? 本來 PHP 讀的是「伺服器上的檔案」。 攻擊者卻可以透過 LFI 等漏洞,把 data:// 這種「假的檔案」塞進去。 最後讓 PHP 讀取、甚至「執行」這些字串內容。 舉例來說: include('data://text/plain;base64,PD9waHAgZXZhbCgnY2F0IC9ldGMvcGFzc3dkJyk7ID8+'); 這行會讓 PHP 執行這段 base64 編碼過的惡意 PHP 程式碼 。 本質上的風險: 原本應該只能從硬碟讀的檔案,卻被攻擊者用 data:// 偷渡進來。 不用上傳檔案、不用寫入磁碟,光靠一段字串,就能讓伺服器乖乖幫忙執行惡意程式碼。 💣 Client 端的 data: URL 危險在哪? 什麼是 Client 的 data: URL 是瀏覽器支援的 內嵌資源格式 。 可以用來嵌入圖片、HTML、PDF、CSS 等等。 常見例子: < img src = "data:image/png;base64,...." /> 為什麼危險? 1. 攻擊者可以把惡意內容藏在 data: URL 裡面 。 例如: data:text/html;base64,xxxx -> 直接夾帶 XSS 攻擊內容。 data:application/octet-stream;base64,xxxx -...