任意檔案上傳漏洞
先來幾個一句話木馬看看
<%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引數執行系統命令
漏洞原理
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系統這種方法不行,
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檔案來執行,
只有php5.3以下和apache聯動才會有module模式,會出現這種漏洞 ?1)如果在Apache的conf里有這樣一行配置AddHandler php5-script.php,這時只要檔案名里包含.php,即使檔案名是test2.php.jpg也會以PHP來執行, 2)如果在Apache的conf里有這樣一行配置AddType application/x-httpd-php.jpg,即使擴展名是jpg,一樣能以PHP方式執行,2.IIS 6.0決議漏洞
(1). 目錄決議:
創建一個.asp的檔案夾,IIS 5.x-6.x版本的服務器,會將該檔案夾下的所有檔案(不管檔案后綴是什么)都會當做asp檔案來決議, (2). 檔案決議: 服務器默認不決議分號;后面的內容,我們將需要上傳的木馬檔案名修改為 test.asp;.jpg ,上傳以后,就會保存為test.asp檔案,從而進行決議,拿到webshell , (3). IIS 6.0 默認的可執行檔案后綴除了 .asp ,還有 .asa .cer .cdx3. 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.不能存在本地檔案包含漏洞:如果存在本地檔案包含漏洞,攻擊者就可以上傳任意的檔案,再結合本地檔案包含漏洞,去執行上傳的檔案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/424924.html
標籤:其他
上一篇:R:如何在多列中迭代總和?
下一篇:CSRF跨站請求偽造漏洞分析
