CVE
Note
MCL
poc
deserialize
registerFont in FontMetrics.php in Dompdf before 2.0.1 allows remote file inclusion because a URI validation failure does not halt font registration, as demonstrated by a @font-face rule.
affact Dompdf (, 2.0.1]
Dompdf is a popular library in PHP used for rendering PDF files from HTML.
將物件轉化為可以儲存與傳輸的格式,Ex: json, string
php 中的 serialize
python3 中的 json.dumps 與 pickle.dumps
將序列化後的資料轉回物件型態
php 中的 unserialize
python3 中的 json.loads 與 pickle.loads
但如果資料是可控的,有機會造成在 deserialize 回物件時呼叫 magic function,當 function 與 arguments 都可控的情況下會造成 RCE
一種打包格式,是將 php code 與其他資源打包進 PHAR 文件中,當 php 解析此種文件時,會進行反序列化
在DomPdf v1.2.1
CVE-2022-28368
曾揭露了一項 RCE 漏洞,成因是DomPdf
有個選項是允許使用者使用遠端的字型檔,若是有打開且引用了外部字型檔,會讓字型檔的 cache 留在 server 電腦中,但是他卻沒對字型的安全性做驗證,導致一項任意上傳的漏洞,而檔案會以 [font_name]_[font_weight]_[md5(src:url)].[ext]
這樣的形式存在於 /vendor/dompdf/dompdf/lib/fonts/
中
patch
patch 的方式是檔案尾巴加上.ttf
那還是可以任意上傳到 server,那如果我們上傳 phar://
類型的檔案是不是就能 RCE ?
可惜在 CVE-2021-3838
中就已經先提出過這項問題了
在 Helpers::getFileContent()
下載文件之前,會先驗證 protocal 是否在 $allowedProtocols
裡面,如果檢查失敗,會記錄一條警告消息,並且 return
而不會處理該文件
但真的檢查下去卻發現,在 registerFont()
中卻缺少了錯誤的 return,代表說我們又能使用 phar://
了
那我們接下來看 Helpers::getFileContents()
我們可以先觸發 Helpers::encodeURI
讓檔案存在 server 的 disk 中,再觸發 file_get_contents
將檔案 include 進去達成反序列化
data://
上傳phar://
執行反序列化