文件上傳漏洞
文件上傳漏洞就是用戶上傳一個可執(zhí)行的文件腳本,并通過腳本獲得執(zhí)行服務器端命令的的能力酷誓。
上傳的文件可以是:
1披坏、web腳本語言
? ? ? ? 要求:上傳的文件可以被web容器解釋執(zhí)行,文件上傳后的目錄要是web容器所覆蓋的路徑呛牲;
? ? ? ? ? ? ? ? ? ? 上傳的文件可以被用戶從web上訪問刮萌。
2驮配、Flash的策略文件crossdomain.xml:控制flash在該域下的行為
3娘扩、病毒或木馬文件:誘使用戶或管理員下載執(zhí)行
4、釣魚圖片或包含了腳本的文件:在瀏覽器中作為腳本執(zhí)行(低版本IE中壮锻,會把上傳的惡意圖片當做HTML執(zhí)行琐旁,控制瀏覽器跳轉(zhuǎn)到指定釣魚網(wǎng)站。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推姻、判斷文件類型(后綴白名單,文件頭)
對圖片的處理框沟,可以使用壓縮函數(shù)或者resize函數(shù)藏古,破壞圖片中可能存在的HTML代碼。
2忍燥、文件上傳目錄設置為不可執(zhí)行
將上傳的文件獨立存儲拧晕,作為靜態(tài)文件處理
3、使用隨機數(shù)改寫文件名和文件路徑
4梅垄、單獨設置文件服務器域名
利用瀏覽器的同源策略
文件包含漏洞
代碼注入的一種方式厂捞,常見的導致文件包含的函數(shù):include(),include_once(),require()靡馁,require_once()欲鹏,fopen(),readfile()等
以上述函數(shù)包含的文件臭墨,都將作為php代碼執(zhí)行貌虾,不論包含的到底是什么類型的文件
要想成功利用文件包含漏洞,滿足下面兩個條件:
1裙犹、include()等函數(shù)通過動態(tài)變量的方式引入需要包含的文件尽狠。
2椎组、用戶能控制該動態(tài)變量
本地文件包含
常見的敏感信息路徑:
Windows系統(tǒng)
c:\boot.ini // 查看系統(tǒng)版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存儲Windows系統(tǒng)初次安裝的密碼
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼
c:\windows\php.ini // php 配置信息
Linux/Unix系統(tǒng)
/etc/passwd // 賬戶信息
/etc/shadow // 賬戶密碼文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網(wǎng)站配置
/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()加載之后將會執(zhí)行)
2鹿蜀、包含data://或php://input等偽協(xié)議
(1) http://www.XXXX.com/test2.php?page=php://filter/read=convert.base64-encode/resource=xxx.php??
訪問URL,讀取PHP文件服球,即可得到經(jīng)過base64加密的文件內(nèi)容茴恰,解密即可。
(2) php://input:寫入php文件斩熊,使用時必須開啟 allow_url_include往枣。
用法:?file=php://input 數(shù)據(jù)利用POST傳過去。
file_get_contents()就要想到用php://input繞過
(3)data://(讀取文件):和php偽協(xié)議的input類似粉渠,碰到file_get_contents()來用分冈;
(4)phar://:這個參數(shù)是就是php解壓縮包的一個函數(shù),不管后綴是什么渣叛,都會當做壓縮包來解壓丈秩。
用法:?file=phar://壓縮包/內(nèi)部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 壓縮包需要是zip協(xié)議壓縮,rar不行淳衙,將木馬文件壓縮后,改為其他任意格式的文件都可以正常使用。 步驟: 寫一個一句話木馬文件shell.php箫攀,然后用zip協(xié)議壓縮為shell.zip肠牲,然后將后綴改為png等其他格式。?
3靴跛、包含session文件(要求攻擊者可以控制session文件的內(nèi)容缀雳,默認session放在/temp/sess_SESSIONID)
4、包含日志文件梢睛,web server的access_log里記錄了客戶端的請求信息肥印,在error_log里記錄了出錯請求。日志文件目錄/user/local/apache/conf/httpd.conf
5绝葡、包含/proc/self/environ深碱,這樣的包含并不需要猜測被包含文件的位置,這個文件里都是web進程運行時的環(huán)境變量藏畅,大多數(shù)都是用戶可控制的敷硅,可以在User-Agent中注入代碼
6、包含上傳的臨時文件愉阎,PHP創(chuàng)建的臨時文件绞蹦,往往處于PHP允許訪問的目錄范圍,在php.ini的upload_tep_dir中定義榜旦,臨時文件的文件名是隨機的幽七,可以暴力猜解獲取臨時文件名
遠程文件包含
設置allow_url_include為off,阻止遠程文件包含漏洞