0x01 文件上傳漏洞
文件上傳漏洞顧名思義就是用戶上傳一個可執(zhí)行的腳本文件,獲得了執(zhí)行服務器端命令的能力。通常,文件上傳是getshell最常用、最直接的方式了。但是,文件上傳本身是一個正常的業(yè)務需求,因此問題在于如何安全的上傳。
0x02 文件上傳的觸發(fā)條件
上傳的文件被Web容器解釋執(zhí)行
用戶能夠從web頁面訪問到被上傳的文件(直接或間接)
用戶上傳的文件通常不能被網站程序壓縮、修改內容
0x03 從防御的角度看上傳
通常防御文件上傳漏洞是分幾個點的,大體上就以下幾方面
1. 客戶端javascript校驗
在瀏覽加載文件,但還未點擊上傳按鈕時變彈出對話框,內容可能是“只允許上傳xxx后綴名的文件”之類的,而此時并沒有發(fā)送數據包。
繞過方法:
- 關閉瀏覽器的javascript功能
- 用burp抓包改后綴名
2. 檢測MIME 類型
· 客戶端判斷:
$_FILES['myfile']['type'] == 'image/jpeg'
· 服務端判斷:
$fileinfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($fileinfo, $file_true_name);
繞過方法:
- 用burp抓包,修改Content-Type
3. 檢查內容
服務器端會讀取上傳的文件然后判斷文件內容時候有<?php之類的
繞過方法:
<script language="php">eval($_POST['cmd']);</script>
- 如果檢查文件頭的話就就可以找張真正的圖片然后用winhex在圖片的末尾寫php代碼
4. 檢查文件擴展名
一般檢查文件擴展名為最直接有效的方法,通常是基于白名單或者黑名單來實現的。
黑名單繞過
- 可以使用能夠被解析的其他文件擴展名
jsp jspx jspf
asp asa cer aspx
php phtml php3 php4 php5 PHP phtm
exe exee
特殊文件名繞過
比如在上傳的時候改成test.asp.或者test.asp_(下劃線為空格,這里方便大家看用下劃線表示了),這種命名方式在windows下是不允許的,繞過驗證后windows系統(tǒng)自動去掉后面的點和空格,但要注意Unix/Linux是沒有這個特性的。00截斷
有的時候可能會遇到服務器端把后綴名已經定好了,而恰好別的地方有一個可以任意讀取php文件的服務,這個時候可以把圖片馬上傳后在這里查看,查看的時候用%00把后面的.php給截斷就好了.htaccess文件攻擊
配合名單列表繞過,上傳一個自定義.htaccess文件,即可輕松繞過各種檢測。解析漏洞繞過
這類漏洞直接配合上傳一個代碼注入過的非黑名單文件即可,再利用解析漏洞即可
白名單繞過
%00截斷
跟之前說的很像,就是上傳一個比如shell.php%00.jpg,服務器檢測后綴名是.jpg,但實際上已經被截斷了。解析漏洞利用
這類漏洞直接配合上傳一個代碼注入過的白名單文件即可,再利用解析漏洞.htaccess文件攻擊
配合名單列表繞過,上傳一個自定義.htaccess文件,即可輕松繞過
0x04 與文件上傳息息相關的解析漏洞
- IIS5.x-6.x解析漏洞
?使用iis5.x-6.x版本的服務器,大多為windowsserver2003,網站比較古老,開發(fā)語句一般為asp;該解析漏洞也只能解析asp文件,而不能解析aspx文件。
?目錄解析(IIS6.0),只要文件夾有asp的話,該目錄下所有文件都會當作asp來解析,www.xxx.com/xx.asp/xx.jpg(xx.asp要存在)
?www.xxx.com/xx.asp;.jpg服務器默認不解析;號后面的內容,因此xx.asp;.jpg便被解析成asp文件了。(xx.asp;.jpg為上傳文件)
- IIS的PUT上傳
?PUT是在WebDav中定義的一個方法,允許用戶上傳文件到指定目錄。
?在許多WebServer中都默認禁用了此方法,或者對上傳做了嚴格限制。但在IIS中,如果目錄支持寫權限,同時開啟了WebDav,就會支持PUT,再結合MOVE方法,可Getshell。
- apache解析漏洞
?Apache解析文件的規(guī)則是從右到左開始判斷解析,如果后綴名為不可識別文件解析,就再往左判斷。比如test.php.owf.rar“.owf”和”.rar”這兩種后綴是apache不可識別解析,apache就會把test.php.owf.rar解析成php?www.xxxx.xxx.com/test.php.php123
?Apache的httpd.conf的AddHandler php5-script .php這時只要文件名里包含.php即使文件名是test2.php.jpg也會以php來執(zhí)行。(配置錯誤)
- nginx解析漏洞(Nginx<8.03)
?當cgi.fix_pathinfo開啟時(為1)
?當訪問www.xx.com/phpinfo.jpg/1.php時,會將phpinfo.jpg當做php進行解析
?其中1.php是一個不存在的文件
0x06 參考
某大佬的PPT
文件上傳框架