文件上傳漏洞
文件上傳漏洞是指由於程序員在對用戶文件上傳部分的控制不足或者處理缺陷,而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件。這里上傳的文件可以是木馬,病毒,惡意腳本或者WebShell等。“文件上傳”本身沒有問題,有問題的是文件上傳后,服務器怎么處理、解釋文件。如果服務器的處理邏輯做的不夠安全,則會導致嚴重的后果。
webshell
WebShell就是以asp、php、jsp或者cgi等網頁文件形式存在的一種命令執行環境,也可以將其稱之為一種網頁后門。攻擊者在入侵了一個網站后,通常會將這些asp或php后門文件與網站服務器web目錄下正常的網頁文件混在一起,然后使用瀏覽器來訪問這些后門,得到一個命令執行環境,以達到控制網站服務器的目的(可以上傳下載或者修改文件,操作數據庫,執行任意命令等)。 WebShell后門隱蔽較性高,可以輕松穿越防火牆,訪問WebShell時不會留下系統日志,只會在網站的web日志中留下一些數據提交記錄。
web C/S模式文件上傳流程
- 客戶端JavaScript檢測(通常檢測文件擴展名)
- 服務器端MIME類型檢測(Content-Type內容檢測)
- 服務器端目錄路徑檢測(檢測跟path參數相關的內容)
- 服務器端文件擴展名檢測(檢測跟文件extension相關的內容)
- 服務器端文件內容檢測(惡意代碼檢測)
文件上傳檢測
客戶端JavaScript檢測
在文件上傳第一步,客戶端會對准備上傳的文件進行檢測,一般會對文件的類型進行限制,比如只允許上傳jpg、png、gif等文件,防止攻擊者直接上傳惡意代碼文件。
繞過方法:這個繞過其實比較簡單,我們只需要更改木馬問價的文件后綴為允許的文件類型,然后burp抓包,在報文中更改上傳的文件名后綴為php等可以解析的文件類型就可以。下面這個就是一個例子:
文件上傳類型檢測
MIME類型檢測
服務器端會對客戶端上傳的文件的Content-Type字段的值進行檢測,如果其類型為白名單允許的,那么能夠上傳,否則失敗。比如網站有MIME類型檢測的話,直接上傳php木馬文件必然失敗,只能上傳白名單中的文件類型。
繞過方法:burp截取上傳文件的數據包,更改Content-Type字段的值即可。
目錄路徑檢測
目錄路徑檢測,一般就檢測路徑是否合法,但稍微特殊一點的都沒有防御。
繞過:
1.%00、0x00截斷繞過
/fckeditor264/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=fuck.php%00file.jpg HTTP/1.0
s1awwhy.php.jpg 改為 s1awwhy.php0x00jpg,當文件系統讀取到0x00或者%00時,會認為文件已經結束
文件擴展名檢測
服務器端可能會根據自己設定的黑白名單對客戶端提交的文件擴展名進行判斷,如果上傳的文件擴展名是黑名單里面所限制的,則不允許提交,否則正常上傳。
例如,.php被禁用,那么就可以在php后面加上一個任意文件名后綴。s1awwhy.php------>s1awwhy.php.abc
文件內容檢測
服務器端可能會對文件頭部進行檢測,可以通過在一句話木馬前面加上文件頭部,從而實現繞過。
htaccess攻擊
方法 1 :
.htaccess文件調用php的解析器其解析另一個文件名包含“s1awwhy”的文件,從而實現木馬文件的解析。.htaccess文件內容如下:
<FilesMatch "hack"> SetHandler application/x-httpd-php </FilesMatch>
攻擊方法:上傳.htaccess文件,然后上傳文件名包含hack的木馬文件。
方法 2 :將.jpg文件當做.php文件來解析
.htaccess文件內容如下:
AddType application/x-httpd-php .jpg
攻擊方法和方法1一樣。
[ACTF2020 新生賽]Upload
首先進入題目可以看到可以上傳文件,基本可以猜出是文件上傳。
試了一下,有文件名擴展過濾,只能上傳圖片,jpg、gif、png
看一下源碼,發現有客戶端JavaScript檢測。
繞過這個客戶端檢測有兩種方法。
- 方法 1 :火狐瀏覽器直接刪除客戶端檢測代碼,然后上傳webshell文件
- 方法 2 :burp抓包更改文件擴展名
先構造一個惡意文件,先用phtml文件試一下。
方法 1 :
刪除瀏覽器客戶端檢測代碼,直接上傳phtml文件
發現直接能夠上傳成功,並且有文件路徑。能夠訪問,上傳成功。
可以用菜刀進行連接,也可以傳參得到flag。
方法 2 :
更改文件名后綴繞過客戶端檢測,然后抓包更改文件名,上傳phtml文件。
上傳成功。之后的步驟和方法 1 一樣了,用菜刀連接或者傳參拿flag。