文件解析漏洞总结-Apache
Apache解析漏洞
多后綴名解析:xx.php.xxoo
Apache認為一個文件可以有多個后綴名,例如:peak.txt.jpg.xx
Apache的解析規則是從后(右)往前(左)依次判斷后綴名,當Apache不認這個后綴名時,就繼續往前判斷后綴名,如果遇到認識的后綴名,就將這整個文件當做認識的這個后綴名來解析,如若,從右往左都沒有認識的,apache就會把這整個文件直接交給瀏覽器自動處理,不返回給瀏覽器任何MIME類型
問:哪些后綴名Apache認識,哪些又不認識呢?
答:在mime.types的文件中記錄著哪些后綴名apache認識
Linux環境下在/etc/mime.types
Windows環境下在apache/conf/mime.types(最好使用ubuntu搭建,復現apache不建議windows搭建)
mime.types中記錄了apache認識的文件后綴和其對應的MIME類型,當客戶端請求一個文件,如果該文件后綴apache認識,那么apache就會返會后綴對應的MIME類型給瀏覽器;如果一個后綴名apache都不認識,那么apache將會把文件直接交給目標服務器,不返回給瀏覽器任何MIME類型
例1:我們來訪問peak.jpg.xxoo,看看是個什么情況,由下圖可見,這個特性執行了,apache不認識.xxoo,但認識.jpg,所以返回jpg的MIME類型給瀏覽器
例2:我們再來訪問peak.xxyy.xxoo,由下圖可見,這個特性執行了,apache不認識.xxoo,也不認識xxyy,沒有一個認識的后綴,最后apache把這整個文件直接交給瀏覽器自動處理,不返回給瀏覽器任何MIME類型
例3:我們再來訪問peak.php,由下圖可見,apache認識php,所以返回text/html的MIME類型給瀏覽器,因為mime.types中php的MIME類型為application/x-httpd-php,為什么返回text/html我也不是很清楚
我們一般利用這個特性一般用來繞過文件上傳漏洞的黑名單,假設目標服務器過濾了.php后綴的文件,那么我們就可以利用apache這一特性,上傳peak.php.xxoo,apache不認識.xxoo,就向前判斷,哎,認識.php,那么Apache理論應該返回text/html給瀏覽器。并以php解析執行peak.php.xxoo文件,真的是這樣嗎?看下圖所示
根本沒有以php解析執行peak.php.xxoo,也沒有返回MIME類型給瀏覽器,而是自動交給瀏覽器處理為什么呢?(我這里使用的是apache-2.4.39+php-5.3.29),這里的原因是,apache向左判斷,判斷該后綴名它是否認識,xxoo,不認識,看到了php,它認識,于是將整個文件交給php去執行,但整個文件名為peak.php.xxoo,php不認識后綴為xxoo的文件,所以就不執行文件。那前面的peak.jpg.xxoo為什么可以執行,因為apache自右向左,認識jpg,jpg不是php文件,它就不給php解析執行,而是以圖片的方式執行然后返回給瀏覽器
那我們就要來看看php本身是如何識別文件的了,有些規定的配置文件在apache/modules/php?.conf,我這里只是粗略的記載一下,因為我搭建環境沒有找到這個文件,例如apache/module/php5.conf,它里面的內容大致是
<FilesMatch ".+\.ph(p[345]?|t|tml)$">SetHandler application/x-httpd-php </FilesMatch>這個表達的意思是,php認為要以php解析執行的文件名的最后的后綴名要與正則表達式匹配才可以(例如需要和php3|php4|php5|pht|phtml匹配),這樣php才會處理文件名,有些服務器將配置文件設置了這個,所以apache無法利用它的特性以php解析執行peak.php.xxoo,只有最右邊的后綴名符合php的要求才行,因為apache為php設置了條件。這就相當于,apache是將軍,php既是一個實體軍官這個人也抽象代表軍官這個名詞,peak.php.xxoo是一個人,peak.php.xxoo來找將軍,將軍看到xxoo,不認識,看到php這個代表軍官的抽象名詞時,哦,認識了,你是peak.php.xxoo軍官,此時將軍是以它的方式來認人的(也就是mime.types),有一天將軍讓php實體軍官這個人去找peak.php.xxoo軍官,把他訓練一下,將軍是老大嘛,它之前設置一個規定,只有最后是php3|php4|php5|pht|phtml結尾的才是php軍官,這時候問題就出現了,當php實體軍官找到peak.php.xxoo時,按照將軍的規定發現peak.php.xxoo他最后沒以規定的后綴結尾,于是就無法訓練他(解析執行),因為在php實體軍官眼中他不是將軍所說的peak.php.xxoo軍官。
回歸正題:如果需要讓peak.php.xxoo可以被php執行,可以將上面的代碼修改為
<FilesMatch ".+\.ph(p[345]?|t|tml)\.">AddHandler application/x-httpd-php .php </FilesMatch>這些都是我查閱資料后所想的,因為我真的沒有找到這個配置文件…
其實我認為真正限制的是httpd.conf中的AddType application/x-httpd-php .php .phtml,這表示一個文件以AddType后面其中一種后綴結尾,會當做php文件解析執行,假如有服務器管理員,打開或設置了這個配置。那么我們就可以利用前面的Apache解析漏洞
注意:這個AddType application/x-httpd-php設置后面必須跟后綴,否則apache服務起不來
也可以利用上傳.htcaess,達到同樣的效果,.htaccess可以作用于當前目錄和其子目錄
利用.htaccess前提條件:
(1)httpd.conf中要AllowOverride All,AllowOverride None不行
(2)需要加載mod_rewrite模塊,LoadModule rewrite_module modules/mod_rewrite.so
之后可以上傳以下三種內容的.htaccess文件:
第一種:
第二種:
AddType application/x-httpd-php .jpg 指定后綴以php文件解析執行,這個不像SetHandler那么霸道,指定的后綴必須要在文件末尾,例如xx.oo.jpg,可以解析;xx.jpg.oo,不可以解析注意:application/x-httpd-php在mime中所對應的后綴,也以php進行解析,并且不管他們在文件名中的哪個位置,apache將文件交給php后,php都可以匹配到并解析執行
第三種:指定以php解析的文件,如下
<FilesMatch "xx.gif"> SetHandler application/x-httpd-php </FilesMatch>那么,AddType和AddHandler有什么區別嗎?
AddType:在給定的文件擴展名與特定的內容類型之間建立映射,也就是mime.types
語法:AddType MIME-type extension [extension] …
說明:AddType 是與類型表相關的,描述的是擴展名與文件類型之間的關系,例如:
AddType application/x-httpd-php .jpg,表示.jpg擴展名的文件就是application/x-httpd-php類型的
AddType image/jpeg .php,表示.php擴展名的文件就是image/jpg類型的(注意:*.php除外,例如xx.php依舊可以當做php解析,xx.php.jj,先經過apache,遇到php,交給php后,php把xx.php.jj當做jpg)
例:
AddHandler: 在文件擴展名與特定的處理器之間建立映射
說明:什么樣的擴展名使用什么樣的程序來處理,描述的是擴展名與處理程序之間的關系
例如:
(3)SetHandler就記住一個就行了
SetHandler application/x-httpd-php總結
理解apache解析漏洞明原理時,只要記住apache是老大,php是小弟,什么事先經過大哥,小弟聽大哥安排!就OK~
說到底,只有當目標服務器httpd.conf中配置了AddType application/x-httpd-php指定后綴名亦或httpd.conf中配置了SetHandler application/x-httpd-php或目標網站根目錄上傳了.htaccess文件,滿足這些條件之一,目標服務器才代表存在apache文件解析漏洞,類似peal.php.xxoo的文件php才能得以解析執行
防御措施:這個是網上給出的,我由于沒有找到他的配置,無法復現,其時我認為最好的防御就是第二種。
(1)在httpd.conf中寫好正則,使得php只判斷文末的后綴名他認不認識,不會判斷整個文件名
(2)關閉httpd.conf中的AddType/AddHandler/SetHandler
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的文件解析漏洞总结-Apache的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创城活动宣传文案30句
- 下一篇: iPhone 显示掉帧、重影该如何解决