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

前言

最近筆者忙著衝刺 OSCP Lab,過程中發現了一個有趣的小東西:PHP Wrapper

其中有個特別讓人眼睛一亮的東東:data://

那時候我心裡想,data:// ... 怎麼長得跟之前看到的瀏覽器支援的內嵌資源格式:「data:有 87% 相似?

結果這個念頭就剛好戳中我的強迫症,忍不住想把兩者好好整理、比較一下

PHP 示意圖


👾 PHP wrapper 的 data:// 危險在哪?

什麼是 PHP 的 data://

  1. 它是 PHP 官方提供的「虛擬檔案協定」

  2.  讓你可以用「字串」來模擬成一個「檔案」給 PHP 讀取。

  3.  會被 include()file_get_contents()fopen() 等函數當成檔案來處理

為什麼危險?

本來 PHP 讀的是「伺服器上的檔案」。攻擊者卻可以透過 LFI 等漏洞,把 data:// 這種「假的檔案」塞進去。最後讓 PHP 讀取、甚至「執行」這些字串內容。


舉例來說:


include('data://text/plain;base64,PD9waHAgZXZhbCgnY2F0IC9ldGMvcGFzc3dkJyk7ID8+');

這行會讓 PHP 執行這段 base64 編碼過的惡意 PHP 程式碼


本質上的風險:

  1.  原本應該只能從硬碟讀的檔案,卻被攻擊者用 data:// 偷渡進來。

  2.  不用上傳檔案、不用寫入磁碟,光靠一段字串,就能讓伺服器乖乖幫忙執行惡意程式碼。

💣 Client 端的 data: URL 危險在哪?

什麼是 Client 的 data: URL
  1.  是瀏覽器支援的內嵌資源格式

  2.  可以用來嵌入圖片、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>


本質上的風險:

  1.  破壞了「資源要來自可信網站」這個前提。

  2.  瀏覽器會無差別地「解讀」這些 data: URL。

  3.  很多網站 CSP 沒設好,導致 data: 被濫用。

為什麼這兩個「性質不同」但「都危險」?

PHP data:// 與 Client Data 比較

總結

data:// 這種「字串包裝成內容」的機制,本身沒錯,但當系統預設信任了這種來源,攻擊者就有機會在錯誤的地方「塞字串 -> 執行/渲染」,這才是它們危險的本質。

 

參考資源

HackTheBox Academy

留言

這個網誌中的熱門文章

資安基礎惡補 - 網路篇 - DNS

SSL/TLS 協定知多少 - 基礎篇

About Me - 關於我的一切