文件上傳漏洞
文件上傳漏洞就是用戶上傳一個可執行的文件腳本,并通過腳本獲得執行服務器端命令的的能力。
上傳的文件可以是:
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,阻止遠程文件包含漏洞