文件上傳漏洞總結
什么是文件上傳漏洞
文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。這種攻擊方式是最為直接和有效的,“文件上傳”本身沒有問題,有問題的是文件上傳后,服務器怎么處理、解釋文件。
文件上傳流程
通常一個文件以 HTTP 協議進行上傳時,將以 POST 請求發送至 web 服務器
web 服務器接收到請求后並同意后,用戶與 web 服務器將建立連接,並傳輸 data
而一般一個文件上傳過程中的檢測如下圖紅色標記部分
常見文件上傳檢測以及繞過
客戶端 javascript 檢測 (通常為檢測文件擴展名)
這類檢測通常在上傳頁面里含有專門檢測文件上傳的 javascript 代碼,最常見的就是檢測擴展名是否合法
繞過方式:
1 前端修改允許的類型
2 burp抓包修改
3 禁用javascript(例如火狐瀏覽器就有禁用JS功能)
服務端檢測繞過(MIME 類型檢測)
主要是檢測Content-Type: 字段
繞過方法:
burp抓包修改Content-Type: 為允許的字段
Content-Type: image/gif
Content-Type: image/png
Content-Type: image/jpeg
(我曾經看到過一個博客,他上傳的文件會給你重命名后綴,好像就是檢測的Content-Type,通過修改這個成php,最后他成功上傳了php文件)
服務端檢測繞過(文件擴展名檢測)
黑名單檢測,黑名單的安全性比白名單的安全性低很多,攻擊手法自然也比白名單多
一般有個專門的 blacklist 文件,里面會包含常見的危險腳本文件
繞過方法:
1 文件名大小寫繞過
用像 AsP,pHp 之類的文件名繞過黑名單檢測
2 名單列表繞過
用黑名單里沒有的名單進行攻擊,比如黑名單里沒有 asa 或 cer 之類
3 特殊文件名繞過
比如發送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划線為空格),這種命名方式
在 windows 系統里是不被允許的,所以需要在 burp 之類里進行修改,然后繞過驗證后,會
被 windows 系統自動去掉后面的點和空格,但要注意 Unix/Linux 系統沒有這個特性。
4 htaccess 文件
配合名單列表繞過,上傳一個自定義的.htaccess,就可以輕松繞過各種檢測
5 寫入方法
首先名字為1.php:jpg,會寫入一個1.php的空文件,然后再上傳一個文件,然后修改名字為3.<<<
這樣就會把我們這個文件的內容寫入到我們上傳的那個1.php空文件中
參考:https://www.waitalone.cn/php-windows-upload.html
6 00截斷繞過上傳
1.php .jpg 空格二進制20改為00
還有一些圖片木馬之類的,需要結合文件包含漏洞來解析。
文件頭檢測
iis解析漏洞
1 目錄解析
以*.asp命名的文件夾里的文件都將會被當成ASP文件執行。
2 文件解析
*.asp;.jpg 像這種畸形文件名在“;”后面的直接被忽略,也就是說當成 *.asp文件執行。
IIS6.0 默認的可執行文件除了asp還包含這三種 *.asa *.cer *.cdx
3 默認解析
.asp .aspx .ashx .asa .cer這是系統默默認的后綴名
Apache解析漏洞
Apache 是從右到左開始判斷解析,如果為不可識別解析,就再往左判斷。比如xxx.php.rar對apache來說rar是不可解析的,所以就會解析成xxx.php
nginx解析漏洞
開啟cgi:SCRIPT_NAME FASTCGI:
www.xx.com/a.jpg/.php(任何不存在文件)-----可以解析為.php文件
a.jpg:<?php phpinfo();?>
a.php%00.jpg----解析為a.php
修復建議
上傳文件的存儲目錄禁用執行權限
文件的后綴白名單,注意0x00截斷攻擊
不能有本地文件包含漏洞
及時修復web上的代碼
升級web server
不是很全,但是基本的應該就有了。