常见的上传绕过以及解析漏洞
通常一個文件以HTTP協議進行上傳時,將以POST請求發送WEB服務器,WEB服務器接收到請求并同意后,用戶與WEB服務器將建立連接,并傳輸data。
常見上傳檢測規則
A. 客戶端javascript檢測(通常為檢測文件拓展名)
B. 服務端MIME類型檢測(檢測Content-Type內容)
C. 服務端目錄路徑檢測(檢測跟path參數相關的內容)
D. 服務端文件名拓展名檢測(檢測跟文件estension相關的內容)
E. 服務器文件內容檢測(檢測內容是否合法或含有惡意代碼)
客戶端檢測
客戶端檢測通常在上傳頁面里含有專門檢測文件上傳的JavaScript代碼。最常見的就是檢測拓展名是否合法。
判斷方式:
在瀏覽加載文件,但還未點擊上傳按鈕時便彈出對話框,內容如:只允許上傳.jpg/.jpeg/.png后綴名的文件,而此時并沒有發送數據包。
繞過辦法
服務端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中。
$FilePath = C:/wamp/www/uploadfile/eval.php_.jpgmove_uploaded_file($_FILES[“upload_file”][“tmp_name”], $FilePath)
在執行move_uploaded_file的這個函數時底層操作調用類似于C語言。遇到0x00會自動截斷,真實寫入的地址應該是C:/wamp/www/uploadfile/eval.php
服務端文件名拓展檢測
基于黑名單檢測:
黑名單的安全性比白名單的安全性低很多,攻擊手法自然也比白名單多。一般有個專門的blacklist,里面包含常見的危險腳本文件。
繞過辦法
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文件幻數檢測就要在文件開頭寫上下圖的值:
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 格式的時候有兩個解析漏洞.
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解析漏洞
總結
以上是生活随笔為你收集整理的常见的上传绕过以及解析漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http头部注入
- 下一篇: Web安全之XSS漏洞