挖洞姿勢:特殊的上傳技巧,繞過PHP圖片轉換實現遠程代碼執行(RCE)

http://www.freebuf.com/articles/web/54086.html


我使用了一個特殊的圖片上傳技巧,繞過PHP GD庫對圖片的轉換處理,最終成功實現了遠程代碼執行。

事情是這樣的。當時我正在測試該網站上是否存在sql注入漏洞,不經意間我在網站個人頁面發現了一個用於上傳頭像的文件上傳表單。開始時我並沒指望在上傳功能處發現漏洞,但我決定試試。

我上傳了一個圖片文件,通過截斷http數據包,修改jpg圖片的文件名後綴爲php,然後繼續上傳。我驚訝的居然上傳成功了,我幾乎不敢相信這麼簡單的漏洞居然存在。於是我複製了圖片url並且在瀏覽器上打開。進入我眼簾的是圖片的二進制代碼,這意味着圖片以php解析了,並根據響應包裏的content-type以text/html格式返回。

我現在要做的是在jpg文件中注入php代碼以進行遠程代碼執行,於是我嘗試將代碼<? phpinfo(); ?>寫入圖片的EXIF頭裏,但是悲劇的是再次上傳發現php代碼沒有被執行。

在本機進行了測試,結果仍然無效——代碼沒有被執行

14183523579339.png!small

在上傳到服務器後,EXIF裏的代碼都被刪除了,應用通過p_w_picpathcreatefromjpeg()函數調用了PHP GD庫(GD庫,是php處理圖形的擴展庫),對圖片進行了轉換。那麼如果不將代碼注入EXIF頭而是注入到圖片裏呢?

14183612065039.png!small

本機測試通過,但當我上傳“1.jpg”到服務器上,返回以下結果:

14183612973618.png!small

報錯上寫着“文件必須是合法的圖片(.gif, .jpg, .jpeg, 或.png)”,我驚歎於應用是怎麼判斷圖片不合法的。我又測試了一些其他jpg文件,結果發現修改任何一個圖片字符都會引起php-gd庫的錯誤判斷,進而造成上傳失敗。

接下來我又使用gif圖片進行了同樣的操作,結果是:圖片上傳成功了,但是圖片中的php代碼完全被刪除了。

雖然這看起來不可思議,但是我不能放棄,因爲現在距離成功利用遠程代碼執行(RCE)只有一步之遙,我必須繞過p_w_picpathcreatefromgif()函數。我對圖片的處理和php GD庫的運行知之甚少,可是這不影響我使用一些傳統***測試方法。

我想到一個方法:對比兩張經過php-gd庫轉換過的gif圖片,如果其中存在相同之處,這就證明這部分圖片數據不會經過轉換。然後我可以注入代碼到這部分圖片文件中,最終實現遠程代碼執行。連我自己都佩服我的機智!

14183627164961.jpg!small

如圖,我用十六進制編輯器打開圖片文件,找到了php轉換前後仍然保持相同的十六進制串“3b45d00ceade0c1a3f0e18aff1”並修改它爲<?phpinfo()?>。

141836185868.png!small

保存圖片,上傳到服務器:

14183620882590.jpg!small

我的PHP代碼被執行了,我最終成功實現了遠程代碼執行。

POC圖片下載地址:

icon_rar.gifPOC.rar 密碼freebuf


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章