前面我們說(shuō)到了黑客入侵(黑客是如何攻破
防火墻入侵電腦的?),主要是因?yàn)檎业搅宋覀?a target=_blank>服務(wù)器的文件解析漏洞。文件解析漏洞是指 Web 容器(Apache、nginx、iis 等)在解析文件時(shí)出現(xiàn)了漏洞,以其他格式執(zhí)行出腳本格式的效果。從而,黑客可以利用該漏洞實(shí)現(xiàn)非法文件的解析。那么,比較常見的文件解析漏洞有哪些?我們應(yīng)該如何防護(hù)呢?這里
河姆渡匯總了一些服務(wù)器對(duì)文件的解析常見漏洞,希望能對(duì)您有幫助。
一、Apache解析漏洞
1、多后綴
在 Apache1.x,2.x 中 Apache 解析文件的規(guī)則是從右到左開始判斷解析, 如果后綴名為不可識(shí)別文件解析, 就再往左判斷。因此可以上傳一個(gè) test.php.qwea 文件繞過(guò)驗(yàn)證且服務(wù)器依然會(huì)將其解析為 php。Apache 能夠認(rèn)識(shí)的文件在 mime.types 文件里:
修復(fù)方案:
后綴驗(yàn)證盡量使用白名單的方式,這樣即使使用不存在的后綴名,也無(wú)法繞過(guò)。
2、配置問(wèn)題導(dǎo)致漏洞
1、如果在 Apache 的 conf 里有這樣一行配置 AddHandler php5-script .php 這時(shí)只要文件名里包含 .php 即使文件名是 test2.php.jpg 也會(huì)以 php 來(lái)執(zhí)行。
2、如果在 Apache 的 conf 里有這樣一行配置 AddType application/x-httpd-php .jpg即使擴(kuò)展名是 jpg,一樣能以 php 方式執(zhí)行。
修復(fù)方案
1、apache 配置文件,禁止 .php. 這樣的文件執(zhí)行,配置文件里面加入
<Files~“.(php.|php3.)”>
Order Allow,Deny
Deny from all
Files>
2、用偽靜態(tài)能解決這個(gè)問(wèn)題,重寫類似.php.*這類文件,打開 apache 的 httpd.conf 找到LoadModule rewrite_module modules/mod_rewrite.so把 # 號(hào)去掉,重啟 apache, 在網(wǎng)站根目錄下建立 .htaccess 文件,代碼如下:
<IfModulemod_rewrite.c>
RewriteEngine On
RewriteRule .(php.|php3.) /index.php
RewriteRule .(pHp.|pHp3.) /index.php
RewriteRule .(phP.|phP3.) /index.php
RewriteRule .(Php.|Php3.) /index.php
RewriteRule .(PHp.|PHp3.) /index.php
RewriteRule .(PhP.|PhP3.) /index.php
RewriteRule .(pHP.|pHP3.) /index.php
RewriteRule .(PHP.|PHP3.) /index.php
IfModule>
3、罕見后綴
Apache 配置文件中會(huì)有.+.ph(p[345]?|t|tml)此類的正則表達(dá)式,被當(dāng) php 程序執(zhí)行的文件名要符合正則表達(dá)式,否則就算 Apache 把某文件當(dāng) php 程序,php 自己不認(rèn)它,也是無(wú)用。
也就是說(shuō)php3,php4,php5,pht,phtml也是可以被解析的。
我在本地測(cè)試只有php3可以,應(yīng)該是配置文件的問(wèn)題,不過(guò)我并沒(méi)有找到對(duì)應(yīng)的正則表達(dá)式配置文件。
.htaccess
一般來(lái)說(shuō),配置文件的作用范圍都是全局的,但 Apache 提供了一種很方便的、可作用于當(dāng)前目錄及其子目錄的配置文件—— .htaccess(分布式配置文件)要想使 .htaccess 文件生效,需要兩個(gè)條件:一是在 Apache 的配置文件中寫上:AllowOverrideAll若這樣寫則 .htaccess 不會(huì)生效:AllowOverrideNone
二是 Apache 要加載 mod_Rewrite 模塊。加載該模塊,需要在 Apache 的配置文件中寫上:LoadModulerewrite_module/usr/lib/apache2/modules/mod_rewrite.so若是在 Ubuntu 中,可能還需要執(zhí)行命令:sudoa2enmod rewrite配置完后需要重啟 Apache。
.htaccess 文件可以配置很多事情,如是否開啟站點(diǎn)的圖片緩存、自定義錯(cuò)誤頁(yè)面、自定義默認(rèn)文檔、設(shè)置 WWW 域名重定向、設(shè)置網(wǎng)頁(yè)重定向、設(shè)置圖片防盜鏈和訪問(wèn)權(quán)限控制。但我們這里只關(guān)心 .htaccess 文件的一個(gè)作用—— MIME 類型修改。
如在 .htaccess 文件中寫入:
AddTypeapplication/x-httpd-phpxxx
就成功地使該 .htaccess 文件所在目錄及其子目錄中的后綴為 .xxx 的文件被 Apache 當(dāng)做 php 文件。
另一種寫法是:
<FilesMatch"shell.jpg">
SetHandlerapplication/x-httpd-php
FilesMatch>
該語(yǔ)句會(huì)讓 Apache 把 shell.jpg 文件當(dāng)作 php 文件來(lái)解析。
二、Nginx 解析漏洞
1、PHP CGI 解析漏洞
Fastcgi 協(xié)議分析 && PHP-FPM 未授權(quán)訪問(wèn)漏洞 && Exp 編寫
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
當(dāng)訪問(wèn) xx.com/phpinfo.jpg/1.php 這個(gè) URL 時(shí),$fastcgi_script_name 會(huì)被設(shè)置為phpinfo.jpg/1.php,然后構(gòu)造成 SCRIPT_FILENAME 傳遞給 PHP CGI。
Nginx 默認(rèn)是以 CGI 的方式支持 PHP 解析的,普遍的做法是在 Nginx 配置文件中通過(guò)正則匹配設(shè)置 SCRIPT_FILENAME。
當(dāng)訪問(wèn) xx.com/phpinfo.jpg/1.php 這個(gè) URL 時(shí),$fastcgi_script_name 會(huì)被設(shè)置為phpinfo.jpg/1.php,然后構(gòu)造成 SCRIPT_FILENAME 傳遞給 PHP CGI,但是 PHP 為什么會(huì)接受這樣的參數(shù),并將 phpinfo.jpg 作為 PHP 文件解析呢?
這就要說(shuō)到 fix_pathinfo 這個(gè)選項(xiàng)了。 如果開啟了這個(gè)選項(xiàng),那么就會(huì)觸發(fā)在 PHP 中的如下邏輯:
PHP 會(huì)認(rèn)為 SCRIPT_FILENAME 是 phpinfo.jpg,而 1.php 是 PATH_INFO,所以就會(huì)將 phpinfo.jpg 作為 PHP 文件來(lái)解析了
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一種手法:上傳一個(gè)名字為 test.jpg,以下內(nèi)容的文件:
PHPfputs(fopen('shell.php','w'),'');?>
然后訪問(wèn) test.jpg/.php, 在這個(gè)目錄下就會(huì)生成一句話木馬 shell.php
這個(gè)解析漏洞其實(shí)是 PHP CGI 的漏洞,在 PHP 的配置文件中有一個(gè)關(guān)鍵的選項(xiàng) cgi.fix_pathinfo 默認(rèn)是開啟的,當(dāng) URL 中有不存在的文件,PHP 就會(huì)向前遞歸解析。
這個(gè)往前遞歸的功能原本是想解決 /info.php/test 這種 URL,能夠正確解析到 info.php。
在 Nginx 配置 fastcgi 使用 php 時(shí),會(huì)存在文件類型解析問(wèn)題。其實(shí)可以說(shuō)它與 Nginx 本身關(guān)系不大,Nginx 只是作為一個(gè)代理把請(qǐng)求轉(zhuǎn)發(fā)給 fastcgi Server,PHP 在后端處理這一切。因此在其他 fastcgi 環(huán)境下,PHP 也存在此問(wèn)題,只是使用 Nginx 作為 Web Server 時(shí),一般使用 fastcgi 的方式調(diào)用腳本解釋器,這種使用方式最為常見。
防御方法
1)使用 Apache、IIS 等成熟久經(jīng)考驗(yàn)的服務(wù)器軟件,在動(dòng)態(tài)語(yǔ)言的支持上,Nginx 還是太年經(jīng)了。你應(yīng)該也偶爾會(huì)見到有些網(wǎng)站掛掉了顯示個(gè) nginx 錯(cuò)誤出來(lái),卻極少見網(wǎng)站掛掉顯示不是 nginx 的(未備案,過(guò)期欠費(fèi) 等等除外)。
2)上傳目錄、靜態(tài)資源(CSS/JS/圖片等)目錄,都設(shè)置好屏蔽 PHP 執(zhí)行權(quán)限。例如使用 Apache 服務(wù)器的
在相應(yīng)目錄下放一個(gè) .htaccess 文件,里面寫上:
<FilesMatch"(?i:\.php)$">
Denyfromall
FilesMatch>
3)可以不提供原圖訪問(wèn),所有圖片輸出時(shí)都經(jīng)過(guò)程序處理,也可以在上傳
存儲(chǔ)時(shí)就處理一遍根本不保存原圖;
4)圖片使用不同的服務(wù)器,這樣可以與業(yè)務(wù)代碼數(shù)據(jù)完全隔離,即使圖片服務(wù)器被黑了,也不會(huì)泄漏多少信息;
5) cgi.fix_pathinfo=0 慎用,除非你十分確定該服務(wù)器上的所有項(xiàng)目都不會(huì)因此而無(wú)法運(yùn)行。
2、空字節(jié)代碼執(zhí)行漏洞
舊版本(0.5.,**0.6.,0.7,0.8<=0.7.65<=0.8.37)。通過(guò)利用此漏洞,攻擊者可以導(dǎo)致服務(wù)器使用 PHP 的 FastCGI 作為 PHP 的服務(wù)器上執(zhí)行任何公開訪問(wèn)的文件。
惡意用戶發(fā)出請(qǐng)求http://example.com/file.ext%00.php就會(huì)將 file.ext 作為 PHP 文件解析。
如果一個(gè)攻擊者可以控制文件的內(nèi)容(即:使用頭像上傳形式)其結(jié)果是執(zhí)行任意代碼。Ngnix 在遇到 %00 空字節(jié)時(shí)與后端 FastCGI 處理不一致,導(dǎo)致可以在圖片中嵌入 PHP 代碼然后通過(guò)訪問(wèn) xxx.jpg%00.php 來(lái)執(zhí)行其中的代碼。
修復(fù)
1、禁止在上傳文件目錄下執(zhí)行 php,在 nginx 虛擬機(jī)配置或者 fcgi.conf 配置加如下代碼:
if($request_filename~*(.*)\.php) {
set$php_url$1;
}
if(!-e$php_url.php) {
return403;
}
2、升級(jí)到最新版本的 nginx
三、IIS5.x-6.x 解析漏洞
使用 iis5.x-6.x 版本的服務(wù)器,大多為 windows server 2003,網(wǎng)站比較古老,開發(fā)語(yǔ)言一般為 asp;該解析漏洞也只能解析 asp 文件,而不能解析 aspx 文件。
1、目錄解析(6.0)
形式:
www.xxx.com/xx.asp/xx.jpg
原理:
服務(wù)器默認(rèn)會(huì)把 .asp,.asa 目錄下的文件都解析成 asp 文件
文件解析(6.0)
形式:
www.xxx.com/xx.asp;.jpg
原理:
服務(wù)器默認(rèn)不解析;號(hào)后面的內(nèi)容,因此 xx.asp;.jpg 便被解析成 asp 文件了。
解析文件類型
有的網(wǎng)站在上傳檢測(cè)中會(huì)用"黑名單"方法 ,但是 IIS6.0 默認(rèn)的可執(zhí)行文件除了 asp 還包含這三種 :
/test.asa
/test.cer
/test.cdx
iis 為什么會(huì)把 asa,cdx,cer 解析成 asp 文件?
原因是這四種擴(kuò)展名都是用的同一個(gè) asp.dll 文件來(lái)執(zhí)行。
修復(fù)
1)目前尚無(wú)微軟官方的補(bǔ)丁,可以通過(guò)自己編寫正則,阻止上傳xx.asp;.jpg類型的文件名。
2)做好權(quán)限設(shè)置,限制用戶創(chuàng)建文件夾。
2、IIS7.5解析漏洞
IIS7.5 的漏洞與 nginx 的類似,都是由于 php 配置文件中,開啟了 cgi.fix_pathinfo,而這并不是 nginx 或者 iis7.5 本身的漏洞。
跟 nginx 解析漏洞一樣,要在 php.ini => cgi.fix_pathinfo=1 開啟的情況才會(huì)產(chǎn)生。
可以配合操作系統(tǒng)文件命名規(guī)則,上傳不符合 windows 文件命名規(guī)則的文件名
test.asp.
test.asp(空格)
test.php:1.jpg
test.php:: $DATA
會(huì)被 windows 系統(tǒng)自動(dòng)去掉不符合規(guī)則符號(hào)后面的內(nèi),然后再配合這個(gè)解析漏洞來(lái)執(zhí)行文件。
2、%00截?cái)?br />
條件:php 版本 < 5.3.4
filename=test.php%00.txt
1、上傳時(shí)路徑可控,使用 00 截?cái)?br />
2、文件下載時(shí),00 截?cái)嗬@過(guò)白名單檢查
3、文件包含時(shí),00 截?cái)嗪竺嫦拗?主要是本地包含時(shí))
4、其它與文件操作有關(guān)的地方都可能使用 00 截?cái)唷?br />
三、其他
在 windows 環(huán)境下,xx.jpg[空格] 或 xx.jpg. 這兩類文件都是不允許存在的,若這樣命名,windows 會(huì)默認(rèn)除去空格或點(diǎn),黑客可以通過(guò)抓包,在文件名后加一個(gè)空格或者點(diǎn)繞過(guò)黑名單.若上傳成功,空格和點(diǎn)都會(huì)被 windows 自動(dòng)消除,這樣也可以 getshell。這種方法可以配合文件解析漏洞從而產(chǎn)生更大的殺傷力。