2019-10-22——文件上傳漏洞&文件包含漏洞

文件上傳漏洞

文件上傳漏洞就是用戶上傳一個可執行的文件腳本,并通過腳本獲得執行服務器端命令的的能力。

上傳的文件可以是:

1、web腳本語言

? ? ? ? 要求:上傳的文件可以被web容器解釋執行,文件上傳后的目錄要是web容器所覆蓋的路徑;

? ? ? ? ? ? ? ? ? ? 上傳的文件可以被用戶從web上訪問。

2、Flash的策略文件crossdomain.xml:控制flash在該域下的行為

3、病毒或木馬文件:誘使用戶或管理員下載執行

4、釣魚圖片或包含了腳本的文件:在瀏覽器中作為腳本執行(低版本IE中,會把上傳的惡意圖片當做HTML執行,控制瀏覽器跳轉到指定釣魚網站。IE 8 中有了增強的MIME Sniff緩解此問題)

繞過文件上傳檢查的方法:

大部分安全檢測方式都是通過判斷后綴名

1、00截斷:手動修改上傳過程的post包,將文件名修改為xxx.php[\0].JPG,[\0]相當于16進制字符串0x00,截斷之后的文件為xxx.php

還有的會通過判斷上傳文件的文件頭來驗證文件類型

2、偽造合法文件頭,將真實的php等腳本代碼附在合法的文件頭后,仍需要通過php來解釋此文件圖片(后綴是.php)

3、修改Content-Type:image/jpeg;image/png;image/gif等允許上傳類型對應的MIME值

常見Web Server攻擊特性:

1、Apache

從后往前解析文件名,直至遇到一個Apache認識的文件類型。

比如.rar是合理的文件上傳,上傳xxx.php.rar.rar.rar,由于Apache不認識.rar這個文件類型,因此會一直遍歷后綴到.php,然后認為是一個php文件,從而導致腳本攻擊。

2、IIS

(1)存在“;”截斷,也就是說文件名為abc.asp;xx.jpg,會被解析為abc.asp

(2)處理文件夾擴展名出錯,導致/*.asp/目錄下的所有文件都作為asp進行解析

(3)支持PUT功能(WebDav中定義的一個方法),允許用戶上傳文件到指定路徑。

首先使用PUT上傳一個指定的文本文件,最后通過MOVE改寫為腳本文件

3、Nginx

Nginx配置fastcgi使用PHP時,或存在文件類型解析問題

訪問http://www.xxx.com/path/test.jpg/noexist.php時,test.jpg會被當做php解析。noexist.php是不存在的文件。

設計安全的文件上傳功能:

1、判斷文件類型(后綴白名單,文件頭)

對圖片的處理,可以使用壓縮函數或者resize函數,破壞圖片中可能存在的HTML代碼。

2、文件上傳目錄設置為不可執行

將上傳的文件獨立存儲,作為靜態文件處理

3、使用隨機數改寫文件名和文件路徑

4、單獨設置文件服務器域名

利用瀏覽器的同源策略


文件包含漏洞

代碼注入的一種方式,常見的導致文件包含的函數:include(),include_once(),require(),require_once(),fopen(),readfile()等

以上述函數包含的文件,都將作為php代碼執行,不論包含的到底是什么類型的文件

要想成功利用文件包含漏洞,滿足下面兩個條件:

1、include()等函數通過動態變量的方式引入需要包含的文件。

2、用戶能控制該動態變量

本地文件包含

常見的敏感信息路徑:

Windows系統

c:\boot.ini // 查看系統版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存儲Windows系統初次安裝的密碼

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼

c:\windows\php.ini // php 配置信息

Linux/Unix系統

/etc/passwd // 賬戶信息

/etc/shadow // 賬戶密碼文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網站配置

/usr/local/app/php5/lib/php.ini // PHP相關配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

如果是輸入的文件名拼接特定后綴組成的文件名,需要進行截斷,截斷方式包括00截斷,長度截斷(windows OS,點號需要長于256;linux OS 長于4096:./././././././././)和點號截斷(windows OS,點號需要長于256:.......)

設置open_basedir,防止目錄遍歷,跨目錄讀取文件,限制在某個特定目錄下PHP能打開的文件。

可以使用burpsuit獲取對應的payload(scanner)

本地文件包含利用技巧:

1、包含用戶上傳的文件(結合文件上傳漏洞,如果用戶上傳的文件中包含PHP代碼,這些代碼被include()加載之后將會執行)

2、包含data://或php://input等偽協議

(1) http://www.XXXX.com/test2.php?page=php://filter/read=convert.base64-encode/resource=xxx.php??

訪問URL,讀取PHP文件,即可得到經過base64加密的文件內容,解密即可。

(2) php://input:寫入php文件,使用時必須開啟 allow_url_include。

用法:?file=php://input 數據利用POST傳過去。

file_get_contents()就要想到用php://input繞過

(3)data://(讀取文件):和php偽協議的input類似,碰到file_get_contents()來用;

(4)phar://:這個參數是就是php解壓縮包的一個函數,不管后綴是什么,都會當做壓縮包來解壓。

用法:?file=phar://壓縮包/內部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬文件壓縮后,改為其他任意格式的文件都可以正常使用。 步驟: 寫一個一句話木馬文件shell.php,然后用zip協議壓縮為shell.zip,然后將后綴改為png等其他格式。?

3、包含session文件(要求攻擊者可以控制session文件的內容,默認session放在/temp/sess_SESSIONID)

4、包含日志文件,web server的access_log里記錄了客戶端的請求信息,在error_log里記錄了出錯請求。日志文件目錄/user/local/apache/conf/httpd.conf

5、包含/proc/self/environ,這樣的包含并不需要猜測被包含文件的位置,這個文件里都是web進程運行時的環境變量,大多數都是用戶可控制的,可以在User-Agent中注入代碼

6、包含上傳的臨時文件,PHP創建的臨時文件,往往處于PHP允許訪問的目錄范圍,在php.ini的upload_tep_dir中定義,臨時文件的文件名是隨機的,可以暴力猜解獲取臨時文件名

遠程文件包含

設置allow_url_include為off,阻止遠程文件包含漏洞

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文件上傳漏洞是指用戶上傳了一個可執行的腳本文件,并通過此腳本文件獲得了執行服務器端命令的能力。這種攻擊方式是最為直...
    付出從未后悔閱讀 1,176評論 0 4
  • 0x01 文件上傳漏洞 文件上傳漏洞顧名思義就是用戶上傳一個可執行的腳本文件,獲得了執行服務器端命令的能力。通常,...
    Pino_HD閱讀 1,920評論 0 0
  • 什么是文件上傳漏洞? 文件上傳漏洞是指由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷,而導致的用戶可以越過其...
    Smi1e_閱讀 24,836評論 0 24
  • 一、初步認識 1.上傳功能:網站上各種可以上傳文件,圖片的地方可以被用作上傳點進行非法上傳 2.上傳原理:在前端代...
    楠昭閱讀 1,668評論 1 11
  • 文件上傳漏洞 常見的漏洞分類服務器配置不當導致文件上傳開源編輯器存在上傳漏洞本地文件上傳限制可以上傳被繞過服務器端...
    二潘閱讀 17,246評論 2 3