文件上傳漏洞詳細解析


參考文章


一、漏洞介紹

文件上傳漏洞是web安全中經常用到的一種漏洞形式。是對數據與代碼分離原則的一種攻擊。上傳漏洞顧名思義,就是攻擊者上傳了一個可執行文件如木馬,病毒,惡意腳本,WebShell等到服務器執行,並最終獲得網站控制權限的高危漏洞。


二、漏洞原理

程序員在開發任意文件上傳功能時,並未考慮文件格式后綴的合法性校驗或者是否只在前端通過js進行后綴檢驗。這時攻擊者可以上傳一個與網站腳本語言相對應的惡意代碼動態腳本,例如(jsp、asp、php、aspx文件后綴)到服務器上,從而訪問這些惡意腳本中包含的惡意代碼,進行動態解析最終達到執行惡意代碼的效果,進一步影響服務器安全。


三、漏洞危害

  • 上傳漏洞與SQL注入或 XSS相比 , 其風險更大
  • 上傳的文件是Web腳本語言,服務器的Web容器解釋並執行了用戶上傳的腳本,導致代碼執行。
  • 上傳的文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在該域下的行為。
  • 上傳的文件是病毒、木馬文件,黑客用以誘騙用戶或者管理員下載執行。
  • 上傳的文件是釣魚圖片或為包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執行,被用於釣魚和欺詐。
  • 攻擊者可以直接上傳一個webshell到服務器上 完全控制系統或致使系統癱瘓。

四、利用前提

  1. 應有文件上傳功能
  2. 對上傳文件類型檢測有漏洞
  3. 或檢測文件類型的邏輯有漏洞(如,先保存文件,在檢測文件類型)

五、利用流程

一般來說文件上傳過程中檢測部分由客戶端javascript檢測、服務端Content-Type類型檢測、服務端path參數檢測、服務端文件擴展名檢測、服務端內容檢測組成。但這些檢測並不完善,且都有繞過方法。

1、判斷上傳漏洞點

多見於頭像上傳處

2、獲得文件上傳的url

使用mentra的firebug查找元素,或F12

3、測試防御類型

1.前端js檢測

繞過方法:
禁用javasrcipt即可

2.后端檢測檢測文件類型

a.檢測content-type

檢測原理:
后端獲取http請求包的Content-Type參數,判斷上傳文件類型

繞過方法:
抓包將content-type改為允許上傳類型格式,即可成功上傳

b.檢測文件頭判斷文件類型

檢測原理:
使用getimagesize()函數來獲取文件的MIME類型,此時檢測的不是數據包中的content-type,而是圖片的文件頭,常見的圖片文件頭如下:

gif(GIF89a) : 47 49 46 38 39 61 
jpg、jpeg : FF D8 FF 
png : 89 50 4E 47 0D 0A

繞過方法:
當上傳php文件時,可以使用winhex、010editor等十六進制處理工具,在數據最前面添加圖片的文件頭,從而繞過檢測

3.后端檢測文件拓展名

a.黑名單檢測

檢測原理:
使用擴展名黑名單來限制上傳文件類型

繞過方法:
1)使用一些特殊擴展名來繞過
php可以用php3、php4、php5代替
2)大小寫混淆繞過
3)在文件名加.(空格,點,空格),利用windows特性繞過
4)在文件名加::$data繞過

b.白名單檢測

檢測原理:
要求只能是特定擴展名的文件才能上傳

繞過方法:
使用%00截斷文件名來上傳,(注意:GET型可以對%00自動解碼,但POST型不能,需要在二進制中修改
如果目標還存在文件包含漏洞,那么就可以上傳圖片馬再文件包含來拿shell

4.后端檢測文件內容

a.文件內容替換

檢測原理:
在后端處理上傳的文件時,會將將文件中的敏感字符替換掉。
參考代碼

<?php
$path = "./uploads";
$content = file_get_contents($_FILES['myfile']['tmp_name']);
$content = str_replace('?', '!', $content);
$file = $path . '/' . $_FILES['myfile']['name'];

if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file)) {
        file_put_contents($file, $content);
        echo 'Success!<br>';
} else {
        echo 'Error!<br>';
}
?>

繞過方法:
根據實際過濾的字符來判斷,(一般不會限制所有敏感字符,因為還要兼顧圖片上傳)

b.圖片二次渲染

檢測原理:
后端調用了php的GD庫,提取了文件中的圖片數據,然后再重新渲染,這樣圖片中插入的惡意代碼就會被過濾掉了

繞過方法:
比較過濾前后文件內容,一般不會全部過濾。
比較使用php-gd轉換之前和之后的gif圖像,並搜索它們之間的任何相似性,因此,如果我在原始文件中找到相似的部分,則在使用php-gd轉換后也保留了該部分然后我可以在那部分注入我的PHP代碼並獲得RCE

5.條件競爭

該漏洞形成邏輯:
網站允許上傳文件,然后檢查上傳文件是否包含webshell、是否是指定的文件類型。如果不是,那么刪除該文件。在刪除之前訪問上傳的php文件,從而執行上傳文件中的php代碼。

繞過方法:
先進行文件上傳,后進行判斷與刪除。利用時間差進行webshell上傳。
競爭條件代碼舉例:

<?php
	fputs(fopen('shell.php','w'),'<?php @eval($\_POST\["cmd"\])?>');
?>

判斷是否刪除

import requests  
while true:  
	requests.get(”路徑“)

六、漏洞修復

1、系統運行時

  1. 文件上傳的目錄設置為不可執行。只要web容器無法解析該目錄下面的文件,即使攻擊者上傳了腳本文件,服務器本身也不會受到影響,因此這一點至關重要。
  2. 判斷文件類型。在判斷文件類型時,可以結合使用MIME Type、后綴檢查等方式。在文
    件類型檢查中,強烈推薦白名單方式,黑名單的方式已經無數次被證明是不可靠的。此外,對於圖片的處理,可以使用壓縮函數或者resize函數,在處理圖片的同時破壞圖片中可能包含的HTML代碼。
  3. 使用隨機數改寫文件名和文件路徑。文件上傳如果要執行代碼,則需要用戶能夠訪問到這個文件。在某些環境中,用戶能上傳,但不能訪問。如果應用了隨機數改寫了文件名和路徑,將極大地增加攻擊的成本。再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將因為重命名而無法攻擊。
  4. 單獨設置文件服務器的域名。由於瀏覽器同源策略的關系,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。
  5. 使用安全設備防御。文件上傳攻擊的本質就是將惡意文件或者腳本上傳到服務器,專業的安全設備防御此類漏洞主要是通過對漏洞的上傳利用行為和惡意文件的上傳過程進行檢測。惡意文件千變萬化,隱藏手法也不斷推陳出新,對普通的系統管理員來說可以通過部署安全設備來幫助防御。

2、系統開發時

  1. 系統開發人員應有較強的安全意識,尤其是采用PHP語言開發系統。在系統開發階段應充分考慮系統的安全性。
  2. 對文件上傳漏洞來說,最好能在客戶端和服務器端對用戶上傳的文件名和文件路徑等項目分別進行嚴格的檢查。客戶端的檢查雖然對技術較好的攻擊者來說可以借助工具繞過,但是這也可以阻擋一些基本的試探。服務器端的檢查最好使用白名單過濾的方法,這樣能防止大小寫等方式的繞過,同時還需對%00截斷符進行檢測,對HTTP包頭的content-type也和上傳文件的大小也需要進行檢查。

3、系統維護時

  1. 系統上線后運維人員應有較強的安全意思,積極使用多個安全檢測工具對系統進行安全掃描,及時發現潛在漏洞並修復。
  2. 定時查看系統日志,web服務器日志以發現入侵痕跡。定時關注系統所使用到的第三方插件的更新情況,如有新版本發布建議及時更新,如果第三方插件被爆有安全漏洞更應立即進行修補。
  3. 對於整個網站都是使用的開源代碼或者使用網上的框架搭建的網站來說,尤其要注意漏洞的自查和軟件版本及補丁的更新,上傳功能非必選可以直接刪除。除對系統自生的維護外,服務器應進行合理配置,非必選一般的目錄都應去掉執行權限,上傳目錄可配置為只讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM