檔案解析漏洞總結 Nginx

2021-10-04 09:33:04 字數 3120 閱讀 6004

原理:在任意檔名後面新增如/*.php,nginx都會將該檔案當做php檔案型別,交給php去解析執行

例:xx.jpg,其中原始碼為<?php phpinfo();?>

訪問xx.jpg時,在xx.jpg後面新增/xx.php,即可實現nginx解析漏洞,將xx.jpg以php解析執行

我們將上述情況做個實驗:這裡我使用的是整合環境phpstudy

瀏覽器訪問:

返回了access denied,這是為何?

我們先來梳理一遍流程,nginx看到xx.jpg,根據mime.types,知道它是型別,就交給去處理;nginx看到xx.jpg/xx.php,看到了.php,知道它是php型別,就交給php去處理,php看到xx.jpg/xx.php字尾是.php,就執行xx.jpg/xx.php這個檔案,執行時發現不存在xx.php,就刪除/xx.php,繼續向前看,發現了xx.jpg,但php發現.jpg不是他認識的php型別,就不以php執行,就返回了access denied.

為什麼php可以遇到刪除它呢,這是因為php.ini中的配置:cgi.fix_pathinfo=1,一般預設為1,當他為1時,即表示開啟php對檔案路徑的修理,假設當php見到aa.***/aa.yyy/aa.zzz這個檔案時,php沒有找到aa.***/aa.yyy/aa.zzz這個檔案(記住,aa.***/aa.yyy/aa.zzz是個整體!),就刪除後面的/aa.zzz,檢測aa.***/aa.yyy這個檔案是否存在,若存在,並且php認識它,就以php解析執行(不認識返回access denied.),若不存在,刪除/aa.yyy,檢測aa,***檔案是否存在,以此類推

注:文章中所有實驗,全部預設開啟php修理功能(cgi.fix_pathinfo=1)

測試上面的xx.jpg/xx.php時,cgi.fix_pathinfo是開啟的,為什麼還是無法解析呢,正如上面所說,php不認識.jpg這個型別,需要配置http-fpm.conf中的security.limit_extensions為空(這個配置完後需要重啟nginx)

例:security.limit_extensions預設配置為;security.limit_extensions = .php .php3 .php4 .php5

這個什麼意思?這個表示security.limit_extensions允許解析其他檔案為php型別,我的理解就是,規定php認識的字尾型別有哪些(限制它),這也就是為什麼php不認識.jpg,要知道,但凡php認識的字尾型別,都要以php格式來解析執行的,一開始security.limit_extensions只認識.php .php3 .php4 .php5,現在改為空,表示php認識任何字尾型別,那又有疑問了,有人說我設定了security.limit_extensions=空,可我直接訪問xx.jpg,xx.jpg沒有被php解析執行,why?其實,security.limit_extensions=空確實表示將任何字尾名檔案當做php解析執行,但你要知道,檔案首先是要經過nginx判斷的,像這個xx.jpg,nginx認識他,直接判斷他為,就交給處理了,那還輪得到php修理後執行,所以要想將xx.jpg給php修理執行,首先要過nginx這一關,如使用xx.jpg/xx.php或xx.jpg/xx.php/xx.xxoo(從右往左判斷nginx是否認識),使用.php欺騙nginx,告訴他,我這是php檔案,交給php去。

可以看看iis7.x的解析漏洞,有異曲同工之妙 檔案解析漏洞總結-iis

如果想讓xx.jpg可以以php解析,可以配置nginx.conf,就像配置apache的httpd.conf中的addtype(當然這個我是猜的,實際可能沒有,nginx可能只能通過在url中,在xx.jpg後面新增/xx.php來將xx.jpg以php解析執行,畢竟每個中介軟體都不同嘛)

所以綜合而言,nginx漏洞利用的條件是:

(1)nginx的http-fpm.conf中security.limit_extensions=空或其它指定的以php解析執行的字尾

(2)php開啟檔案修理:php.ini中cgi.fix_pathinfo=1

接下來就可以進行漏洞復現了,分別在說一下流程

xx.jpg原始碼:

利用一:xx.jpg/xx.php,nginx從右向左找認識的字尾,看到.php,將xx.jpg/xx.php交給php去修理執行,php修理時發現xx.jpg/xx.php不存在,刪除/xx.php,繼續修理,發現xx.jpg存在,就將xx.jpg以php解析執行

利用二:xx.jpg/xx.php/xx.xxoo,nginx從右向左找認識的字尾,看到.xxoo,不認識,看到.php認識,將xx.jpg/xx.php/xx.xxoo交給php去修理執行,php修理時發現xx.jpg/xx.php/xx.xxoo不存在,就刪除/xx.xxoo,繼續修理,發現xx.jpg/xx.php不存在,刪除/xx.php,繼續修理,發現xx.jpg存在,就將xx.jpg以php解析執行

防禦方法:

(1)php.ini中設定cgi.fix_pathinfo=0

(2)php-fpm.conf中設定security.limit_extensions=.php,只允許.php字尾以php解析執行

注意:我寫的實驗室linux下的,windows又是另外一回事了,不會全部相同,例如windows中沒有php-fpm.conf配置檔案,直接可以利用nginx解析漏洞,訪問時會顯示原始碼,不會返回等等。

這篇文章我是使用phpstudy整合環境搭的,有些檔案路徑和網上直接用agnix或docker環境所說的路徑不一致。

有些東西還得用原裝,這個目錄遍歷準備寫的,配置了引數環境還是復現不了,也有可能是我phpstudy使用還不到家~

檔案解析漏洞總結

伺服器解析漏洞算是歷史比較悠久了,但如今依然廣泛存在。在此記錄彙總一些常見伺服器 web server 的解析漏洞,比如iis6.0 iis7.5 apache nginx等方便以後回顧溫習。使用iis5.x 6.x版本的伺服器,大多為windows server 2003,比較古老,開發語句一般為...

檔案解析漏洞總結

iis?6.0解析利用方法有兩種 1.目錄解析 2.檔案解析 第一種,在 下建立資料夾的名字為?asp asa?的資料夾,其目錄內的任何副檔名的檔案都被iis當作asp檔案來解析並執行。例如建立目錄?pamela.asp,那麼 將被當作asp檔案來執行。假設黑闊可以控制上傳資料夾路徑,就可以不管你上...

檔案解析漏洞總結

iis 6.0解析利用方法有兩種 1.目錄解析 xx.asp xx.jpg2.檔案解析 第一種,在 下建立資料夾的名字為 asp asa 的資料夾,其目錄內的任何副檔名的檔案都被iis當作asp檔案來解析並執行。例如建立目錄 cracer.asp,那麼 cracer.asp 1.jpg將被當作asp...