用帝國軟件做網站的心得成品網站seo
文章目錄
- 一、環(huán)境簡介
- 一、Apache與php三種結合方法
- 二、Apache解析文件的方法
- 三、Apache解析php的方法
- 四、漏洞原理
- 五、修復方法
一、環(huán)境簡介
??Apache文件解析漏洞與用戶配置有密切關系。嚴格來說,屬于用戶配置問題,這里使用ubantu的docker來復現(xiàn)漏洞:
apt-get install apache2
apt-get install php7.0
apt-get install libapache2-mod-php7.0
一、Apache與php三種結合方法
- CGI:共同網關接口,是HTTP服務器與機器上其他程序進行通信的一個接口,讓web服務器必要時啟動額外的程序處理動態(tài)內容。
- FastCGI:CGI解釋器的更快實現(xiàn),可以提供良好的性能、伸縮性等。
- Module:php作為apache的模塊,也是用的最多的一種方法。
Apache文件解析漏洞就發(fā)生在Module結合方法上。
查看apache和php的結合方法:
二、Apache解析文件的方法
一個重要文件/etc/mime.types
??這里記錄了大量的文件后綴和mime類型,當客戶端請求一個文件時,如果后綴在這個列表里,那么apache一方面返回對應的content-type給瀏覽器,一方面根據(jù)文件的MIME類型進行下一步處理。如果不在列表,apache不會返回content-type給瀏覽器,而是直接返回文件內容,由瀏覽器自動處理。
cat /etc/mime.types | grep php
這里注釋掉關于php的全部項。例如對于第一項后綴名為
php/pht/phtml
的文件,apache將會將其給php處理器進行解析。
三、Apache解析php的方法
/etc/apache2/mods-enabled/php7.2.conf
- apache通過
/etc/mime.types
識別文件所屬mime
類型,然后根據(jù)MIME類型,apache將文件交給對應的程序進行處理。- apache或者通過
/etc/apache2/mods-enabled/php7.2.conf
進行文件匹配,用SetHandler
設置請求處理程序。
如上圖,如果(php|php3|php5|php7|pht|phtml)是請求文件的最后一個后綴,則把文件交給php處理器(php_module)來處理,處理完之后把結果返回給apache,再由apache發(fā)送給瀏覽器。
四、漏洞原理
??Apache文件解析漏洞設計到一個解析文件的特性:Apache默認一個文件可以有多個以點分割的后綴,當右邊的后綴無法識別(不在mime.types
內),則繼續(xù)向左識別。例如,當我們請求這樣一個文件:shell.php.xxx.yyy
yyy
無法被識別,向左;xxx
無法被識別,向左;php
發(fā)現(xiàn)后綴是php,交給php處理這個文件。
如果,apache都不認識,將把文件直接返回給客戶端,也就是爆源碼。
在web目錄下創(chuàng)建一個1.php.aaa
的文件,并訪問:
可以看到并沒有被解析成php,為什么?
因為apache本身并不存在所謂的解析漏洞。讓我們回顧解析過程:
yyy
無法被識別,向左;xxx
無法被識別,向左;php
發(fā)現(xiàn)后綴是php,交給php解釋器處理這個文件。最后這一步雖然交給php解釋器來處理這個文件,但是php解釋器也不認識
.aaa
的后綴,所以就直接輸出了。
??其實,解析漏洞的產生,是由于運維人員在配置服務器時,為了使apapche服務器能解析php,而自己添加了一個handler
,例如:AddHandler application/x-httpd-php .php
。它的作用是為了讓apache把文件交給php_module解析,就是說在文件名的任何位置匹配到php后綴,apache都會讓pap_module去解析。
添加一個handler
之后,訪問1.php.xxx.yyy
的解析流程是這樣:
yyy
無法被識別,向左;xxx
無法被識別,向左;php
激活php處理器,執(zhí)行php代碼。
解析漏洞就產生了。
五、修復方法
- 不要使用AddHandle,改成SetHandler,寫好正則,就不會有解析問題。
- 禁止
.php.
這樣的文件執(zhí)行