0x00 概述
文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,並通過此腳本文件獲得了執行服務器端命令的能力。文件上傳這個功能本身沒有問題,有問題的是文件上傳后,服務器怎么處理、解釋文件。如果服務器的處理邏輯不夠安全,就會導致上傳的文件被web容器解釋執行,從而造成嚴重的后果
0x01 客戶端js檢測檢測繞過
- 檢測原理
在客戶端通過如下的javascript代碼來檢測用戶提交的文件是否合法:
1 <script type="text/javascript"> 2 function checkFile() { 3 var file = document.getElementsByName('upload_file')[0].value; 4 if (file == null || file == "") { 5 alert("請選擇要上傳的文件!"); 6 return false; 7 } 8 //定義允許上傳的文件類型 9 var allow_ext = ".jpg|.png|.gif"; 10 //提取上傳文件的類型 11 var ext_name = file.substring(file.lastIndexOf(".")); 12 //判斷上傳文件類型是否允許上傳 13 if (allow_ext.indexOf(ext_name) == -1) { 14 var errMsg = "該文件不允許上傳,請上傳" + allow_ext + "類型的文件,當前文件類型為:" + ext_name; 15 alert(errMsg); 16 return false; 17 } 18 } 19 </script>
- 如何判斷是否是客戶端js檢測
1、選擇一個.php后綴的文件,同時使用burpsuite進行抓包

2、點擊上傳,可以看到還沒有數據經過burpsuite,瀏覽器就已經彈出警示框,說明數據還沒有發送給服務器,程序就判斷出來文件類型不對,因此就可以得出結論這個是通過客戶端進行的本地文件檢測

- 繞過方法
由於用來驗證文件合法性的js程序在我們客戶端,所以對於我們來說,這個驗證程序是可控制的,能夠很輕易的就繞過,具體能夠繞過的方法如下:
1. 添加允許上傳的文件類型,使自己想要上傳的會見類型為合法
-這是一個簡單的上傳頁面

-在上傳按鈕處單擊右鍵,選擇審查元素選項

-打開瀏覽器控制台,瀏覽html源碼,找到用來驗證的js腳本

-修改js腳本,將自定義的文件類型后綴添加進去

-成功上傳:

2、刪除對js驗證腳本的調用,使其不能對上傳的文件類型做檢測,從而達到繞過
-同樣的通過審查元素,查看到form表單的內容,form的開始標簽為<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">,
其中的onsubmit="return checkFile()的作用就是當點擊上傳按鈕的時候,就會觸發js驗證腳本,所以將這一部分刪除,變可以成功繞過檢測

3、利用burpsuite抓包,修改文件類型進行繞過
-首先將我們想要上傳的惡意腳本的后綴更改為符合要求的文件類型后綴
如:webshell.php -> webshell.jpg
-當點擊上傳的時候使用burp進行抓包,將名字的后綴改回.php,以便上傳至服務器能夠正確解析

-成功上傳

0x02 服務器端MIME類型檢測繞過
- 檢測原理
當用戶上傳文件到服務器端的時候,服務器端的程序會獲取上傳文件的MIME類型,然后用這個獲取到的類型來和期望的MIME類型進行匹配,如果匹配不上則說明上傳的文件不合法。服務端檢測MIME類型的代碼如下:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')){ ...//判斷過后對文件處理的進一步操作 }
- 繞過方法
因為服務端檢測的是文件的MIME類型,而對這個MIME類型的的值的獲取是通過HTTP請求字段里的Content-Type字段 ,所以繞過的方法就是通過修改Content-Type的值,比如修改為image/jpeg;image/png;image/gif等等允許上傳類型對應的MIME值
0x03 黑名單繞過
- 檢測原理
文件類型根據黑名單來檢測的原理就是:服務器程序根據一份文件后綴名的名單來判斷是否允許當前文件上傳到服務器,只要上傳的文件的類型能夠和這個黑名單里面的類型匹配,那么就禁止該文件上傳
![]()
- 繞過方法
1. 文件名大小寫繞過
用像AsP, pHp之類的文件名繞過黑名單檢測
2. 名單列表繞過
用黑名單里沒有的名單進行攻擊,比如黑名單里沒有asa或cer之類
3. 特殊文件名繞過
比如發送的 http包里把文件名改成 test.asp. 或 test.asp_(下划線為空格),這種命名方式
在windows系統里是不被允許的,所以需要在 burp之類里進行修改,然后繞過驗證后,會
被windows系統自動去掉后面的點和空格,但要注意Unix/Linux系統沒有這個特性。
4.0x00截斷繞 過5. .htaccess文件攻擊
6. 解析調用/漏洞繞過
0x04 白名單繞過
...
0x05 服務端文件類容檢測繞過
- 檢測原理
0x06 web應用程序解析繞過
1. Apache解析漏洞
解析:test.php.(任意不屬於黑名單且也不屬於Apache解析白名單的名稱),比如test.php.lala
描述:一個文件名為test.x1.x2.x3的文件,apache會從x3的位置開始嘗試解析,如果x3不屬於apache能夠解析的擴展名,那么apache會嘗試去解析x2,直到能夠解析到能夠解析的為止,否則就會報錯
2. IIS解析漏洞
解析 :test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php
描述:I IS6.0在解析asp格式的時候有兩個解析漏洞,一個是如果目錄名包含".asp"字符串,
那么這個目錄下所有的文件都會按照asp去解析,另一個是只要文件名中含有".asp;"
會優先按asp來解析
IIS7.0/7.5是對php解析時有一個類似於Nginx的解析漏洞,對任意文件名只要在URL
后面追加上字符串"/任意文件名.php"就會按照php的方式去解析;
3. Nginx解析漏洞
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php
描述:目前Nginx主要有這兩種漏洞,一個是對任意文件名,在后面添加/任意文件名.php
的解析漏洞,比如原本文件名是test.jpg,可以添加為test.jpg/x.php進行解析攻擊。
還有一種是對低版本的Nginx可以在任意文件名后面添加%00.php進行解析攻擊。


