概述
檔案上傳源碼分析
注:
client check和MIME type的d.php為
getimagesize的php.php為
client check
d.php為一句話木馬,先試試上傳d.php,提示不符合要求。
猜測是前端檢測,将d.php重命名為d.jpg,上傳,抓包,再将filename改為d.php,上傳成功。并且傳回路徑。
連接配接試試,成功執行。
代碼分析
跟進js的checkFileExt函數,可得知此函數是檢查字尾名。但是前端的内容使用者很多都可以僞造,一定不要在重要位置相信前端傳來的值。以上方法就可以繞過。
再看看後端的邏輯吧
跟進upload_client函數,這個後端沒做什麼過濾。
MIME type
MIME type檢測是檢測Content-type,上傳d.php,抓包,将Content-type的内容改為image/jpeg。上傳成功,傳回路徑。
連接配接,執行成功。
代碼分析
跟進upload_sick函數,其中的$_FILES[$key][‘type’] 檔案的 MIME 類型,需要浏覽器提供該資訊的支援,例如"image/gif",但是這個資訊可以僞造。
getimagesize
getimagesize() 函數将測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像檔案的大小并傳回圖像的尺寸以及檔案類型及圖檔高度與寬度。繞過此函數需要制作圖檔馬。
上傳回顯字尾名不對
試試00截斷?(隻有部分伺服器有這個漏洞)
回顯上傳的是假圖檔,感覺事情有點不對。。。前面已經制作了圖檔馬,我們上傳的就是圖檔檔案鴨。
回去看了下,發現copy指令時應該把.jpg檔案放在前面才行,這樣新生成的.jpg的二進制頭資訊才是jpg檔案的頭資訊。
上傳成功。再結合前面的檔案包含漏洞,執行成功。
代碼分析
跟進upload函數
後端做了嚴格的審查,隻有結合前面的檔案包含漏洞才可以實際利用。其實很多漏洞都不是單獨利用的,多個漏洞一起利用會有意想不到的效果
修複
轉這裡:web常見漏洞原理,利用,防禦(思路
1.前端js腳本檢測字尾名
繞過:burp抓包修改檔案字尾名
2.後端白名單和黑名單檢測
黑名單檢測:測試後端檢測規則,進行繞過;利用系統解析漏洞。
白名單檢測:00截斷繞過(特定版本下)
3.Content-Type檢測過濾
繞過:burp抓包修改content-type
4.getimagesize()函數檢測是否的正常的圖檔大小
繞過:将木馬寫入圖檔裡(copy /b 1.jpg+1.php 2.jpg)
5.圖檔二次渲染
6.檔案重命名