名字很像,傷害不同: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 讀取、甚至「執行」這些字串內容。
舉例來說:
這行會讓 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 -> 偽裝下載檔案誘騙點擊。
2. phishing、CSP 繞過、fake login UI。
舉例來說:
這會直接讓瀏覽器執行 <script>alert('Hacked')</script>
。
本質上的風險:
- 破壞了「資源要來自可信網站」這個前提。
- 瀏覽器會無差別地「解讀」這些 data: URL。
- 很多網站 CSP 沒設好,導致 data: 被濫用。
為什麼這兩個「性質不同」但「都危險」?
總結
data:// 這種「字串包裝成內容」的機制,本身沒錯,但當系統預設信任了這種來源,攻擊者就有機會在錯誤的地方「塞字串 -> 執行/渲染」,這才是它們危險的本質。
參考資源
HackTheBox Academy
留言
張貼留言