文件上傳漏洞
文件上傳功能在web應用系統很常見,比如很多網站注冊的時候需要上傳頭像,附件等等。當用戶點擊上傳按鈕后,后台會對上傳的文件進行判斷,比如是否是指定的類型、后綴名、大小等等,然后將其按照設計的格式重命名后存儲在指定的目錄,如果說后台對上傳的文件沒有進行任何的安全判斷或者判斷的條件不夠嚴謹,則攻擊者可能會上傳一些惡意的文件,比如一句話木馬,從而導致服務器權限被獲取。
防范文件上傳漏洞的方法
-
驗證文件類型、后綴名、大小
-
驗證文件的上傳方式
-
對文件進行一定復雜的重命名
-
不要暴露文件上傳后的路徑
-
等等
進入第一關
提示我們只允許上傳圖片
但是我們打開F12看到
這里的JS調用了一個checkFileExt的方法
這個方法在后面也找得到,大致的意思就是判斷文件的擴展名是不是為jpg、png、gif
我們知道這種前端的限制只能起到輔助作用,起不到實質性的作用
我們只需要把之前那個input標簽的onchange的屬性刪除,讓上傳的時候觸發不了這個方法
就可以達到我們上傳的目的
然后我們上傳我們的php一句話木馬
訪問路徑,測試一下我們的一句話是否能執行
第二個欄目是考MIME的
什么是MIME可以百度一下
php里有一個$_file函數來獲取請求頭里面的Content-Type
因此,我們只需要用抓包修改請求頭里Content-Type的值
就可以繞過驗證
第三個欄目—getimagesize
getimagesize()這個函數返回結果中有文件大小和文件類型,如果用這個函數來獲取類型,從而判斷是否是圖片的話,會存在問題
我們可以偽造圖片頭
我們先普及一下基礎知識
先查看一下他們的圖片頭
用linux的xxd命令
發現png圖片的頭部十六進制都一樣
那我們可以用windows的cmd命令把一張圖片和一個php文件合起來變成一個文件
安排一手
選擇兩個文件
合成一個新的文件叫xxx.png
表面上看還是這個圖片
我們把xxx丟進kali看看
發現前面還是正常的圖片,但是在最后跟上了我們的一句話木馬
還需要了解的是
PHP的文件包含
include在發現錯誤的時候會繼續執行后面的代碼
當遇到我們的png的時候,會一直往下讀取,執行到我們的一句話的時候就會正確執行
上傳的時候我發現在21行會報錯
測試后把這半條代碼刪除就可以正常上傳
成功上傳了我們的xxx.png
我們來訪問一下
發現可以正常訪問
但是,他是一個png
那么我們要這么才能讓他執行里面的php代碼呢
就要用到我們之前的文件包含漏洞
那就要讓本地文件包含漏洞找到我們的png圖片
發現我們上傳的文件在這個文件夾之下那么我們就可以拼湊出
unsafeupload/uploads/7043985d85e8876ad12573844907.png
來進行測試,看看網站是否能找到我們的png
反正就是大概猜測在哪個目錄能訪問我們圖片所在的路徑
../../unsafeupload/uploads/7043985d85e8876ad12573844907.png
經測試我們可以用這個路徑訪問到我們的phpinfo
往下拉就能看到