- 前端繞過
- 服務端驗證繞過
- 編輯器漏洞
- 配合解析漏洞突破上傳
通常一個文件以HTTP協議進行上傳時,將以POST請求發送WEB服務器,WEB服務器接收到請求並同意後,用戶與WEB服務器將建立連接,並傳輸data。
常見上傳檢測規則
A. 客戶端javascript檢測(通常爲檢測文件拓展名)
B. 服務端MIME類型檢測(檢測Content-Type內容)
C. 服務端目錄路徑檢測(檢測跟path參數相關的內容)
D. 服務端文件名拓展名檢測(檢測跟文件estension相關的內容)
E. 服務器文件內容檢測(檢測內容是否合法或含有惡意代碼)
客戶端檢測
客戶端檢測通常在上傳頁面裏含有專門檢測文件上傳的JavaScript代碼。最常見的就是檢測拓展名是否合法。
判斷方式:
在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png後綴名的文件,而此時並沒有發送數據包。
- 利用burpswite之類的代理工具。
- 修改webshell後綴類型爲允許上傳類型。
- 抓包攔截將其後綴名改爲對應服務器可以解析的後綴名。
繞過辦法
服務端MIME檢測服務端MIME類型檢測也就是檢測Content-Type的內容。下面是一段測試模擬代碼:
我們將request包的Content-Type修改:
圖片類型:
服務端目錄路徑檢測
- 一般是檢測保存路徑是否合法,但一般都沒有防禦。檢測跟path參數相關的內容。
- 漏洞成因是因爲對目錄路徑的檢測不夠嚴謹而導致可以用0x00截斷的方式來進行攻擊。
- 0x00截斷:上傳文件的時候,當系統文件讀到(0x00)時,會認爲文件已經結束。利用00截斷就是利用WEB應用對文件上傳的路徑過濾的不嚴格,產生0x00上傳截斷漏洞。
繞過辦法
通過抓包截斷將 eval.php.jpg 換成 eval.php_jpg(下劃線爲0x00)。在上傳文件時系統文件遇到0x00。會認爲文件已經結束。從而將eval.php.jpg的內容寫入到eval.php中。
_FILES[“upload_file”][“tmp_name”], $FilePath)
在執行move_uploaded_file的這個函數時底層操作調用類似於C語言。遇到0x00會自動截斷,真實寫入的地址應該是C:/wamp/www/uploadfile/eval.php
服務端文件名拓展檢測
基於黑名單檢測:
黑名單的安全性比白名單的安全性低很多,攻擊手法自然也比白名單多。一般有個專門的blacklist,裏面包含常見的危險腳本文件。
繞過辦法
- 文件名大小寫繞過(AsP, pHp等等)
- 黑白名單繞過(php、php2、php3、php5、phtml、asp、aspx、ascx、ashx、cer、asa、jsp、jspx)cdx,
- 特殊文件名繞過修改數據包裏的文件名改爲 test.php. 或者 test.asp_ (下劃線是空格)由於這種命名格式在windows系統裏是不允許的。所以在繞過上傳之後windows系統會自動去掉 點和空格。Unix/Linux系統沒有這個特性。
- 0x00截斷繞過
- htaccess文件攻擊(結合黑名單攻擊)
- 解析繞過
0x00截斷繞過
文件名後綴就一個%00字節,可以截斷某些函數對文件名的判斷。在許多語言函數中,處理字符串的函數中0x00被認爲是終止符。
例如:
網站上傳函數處理xxx.php%00.jpg時,首先後綴名是合法的jpg格式,可以上傳,在保存文件時,遇到%00字符丟棄後面的jpg,文件後綴最終保存的後綴名爲xxx.php
.htaccess文件攻擊
.htaccess文件攻擊即結合黑名單攻擊服務器的 .htaccess文件 。
通過move_uploaded_file函數把自己寫的 .htaccess文件覆蓋掉服務器上的這樣就可以解析定義名單了。
.htaccess文件用處:
通過.htaccess文件調用php解釋器去解析一個文件名中只要包含“haha”這個字符串的任意文件,無論你文件名是什麼樣子,只要包含”haha”這個字符串,都可以被以php的方式來解析。
.htaccess文件內容:
<FilesMatch “haha”>
SetHandler application/x-httpd-php
</FilesMatch>
服務端文件內容拓展檢測
如果文件內容檢測設置得比較嚴格,那麼上傳攻擊將變得非常困難。也可以說它是在代碼層檢測的最後一道關卡。如果它被突破了,就算代碼層的漏洞,也可以結合解析漏洞進行攻擊。
- 文件幻數檢測 jpg(JFIF) gif(GIF89a) png(%PNG)
- 文件相關信息檢測(文件頭加一些圖片信息中間夾雜攻擊代碼)
- 文件加載檢測(調用API或者函數進行文件加載測試 php的 gd庫)
文件幻數檢測繞過
主要是檢測文件內容開始處的文件幻數,比如圖片類型的文件幻數如下:要繞過jpg文件幻數檢測就要在文件開頭寫上下圖的值:
gif文件:GIF89a
png文件:%PNG
製作圖片馬
cmd下執行:
copy /b 1.jpg+2.php=3.jpg
Apache解析漏洞
test.php.aaa.bbb.ccc任意不屬於黑名單且不屬於Apache解析白名單之內的後綴名。
說明
一個文件名爲test.php.aaa.bbb.ccc的文件,Apache會從ccc的位置往php的位置開始嘗試解析 ,如果ccc不屬於Apache能解析的後綴名,那麼Apache就會嘗試去解析bbb,這樣一直往前嘗試,直到遇到一個能解析的拓展名爲止。
WampServer2.0All Version (WampServer2.0i / Apache 2.2.11) [Success]
WampServer2.1All Version (WampServer2.1e-x32 / Apache 2.2.17) [Success]
Wamp5 All Version (Wamp5_1.7.4 /Apache 2.2.6) [Success]
AppServ 2.4All Version (AppServ - 2.4.9 /Apache 2.0.59) [Success]
AppServ 2.5All Version (AppServ - 2.5.10 /Apache 2.2.8) [Success]
AppServ 2.6All Version (AppServ - 2.6.0 /Apache 2.2.8) [Success]
IIS 解析漏洞
- test.asp/任意文件名 | test.asp;任意文件名 | 任意文件名/任意文件名.php
IIS6.0 在解析 asp 格式的時候有兩個解析漏洞.
- 一個是如果目錄名包含".asp 、.asa、.cer"字符串,那麼這個目錄下所有的文件都會按照 asp 去解析。eg: “test.asp/1.jpg”
- 另一個是隻要文件名中含有".asp;、.asa;、.cer;會優先按 asp 來解析
eg:
“1.asp;.jpg”
IIS7.0/7.5是對php解析時有一個類似於Nginx的解析漏洞, 對任意文件名只要在URL後面追加上字符串"/任意文件名.php"就會按照 php 的方式去解析
eg:”http://www.target.com/upload/1.jpg/1.php”
- IIS6.0 (Win2003 SP2 + IIS6.0) [Success]
- IIS7.0 (Win2008 R1 + IIS7.0) [Success]
- IIS7.5 (Win2008 R2 + IIS7.5) [Success]
Nginx 解析漏洞
任意文件名/任意文件名.php | 任意文件名%00.php
目前 Nginx 主要有這兩種漏洞:
-
一個是對任意文件名,在後面添加/任意文件名.php的解析漏洞,比如原本文件名是 test.jpg,可以添加爲 test.jpg/x.php 進行解析攻擊。
eg: “http://www.target.com/upload/1.jpg/1.php” -
一種是對低版本的 Nginx 可以在任意文件名後面添加%00.php進行解析攻擊。
• Nginx 0.5.*
• Nginx 0.6.*
• Nginx 0.7 <= 0.7.65
• Nginx 0.8 <= 0.8.37
• 以上Nginx容器器的版本下,上傳⼀一個在waf白名單之內擴展名的⽂文件1.jpg,然後以1.jpg%00.php進行請求。
• Nginx 0.8.41 – 1.5.6:
• 以上Nginx容器器的版本下,上傳⼀一個在waf白名單之內擴展名的⽂文1.jpg,然後以1.jpg%20%00.php進行請求
總結
輕量級的檢測繞過攻擊
- 繞過javascript對後綴名的檢測
- 繞過服務端對http requst包MIME類型的檢測
- 繞過文件內容幻術頭的檢測
路徑/拓展名檢繞過
1. 黑名單繞過
- 文件名大小寫繞過
- 名單列表繞過
- 特殊文件名繞過
- 0x00截斷繞過
- .htaccess文件攻擊
- Apache解析漏洞
- IIS解析漏洞
- Nginx解析漏洞
2. 白名單繞過
- 文件名後綴0x00截斷繞過
- PHP文件包含漏洞
- IIS解析漏洞
- Nginx解析漏洞