文件解析漏洞总结-Nginx
Nginx解析漏洞
原理:在任意文件名后面添加如/*.php,nginx都會(huì)將該文件當(dāng)做php文件類型,交給php去解析執(zhí)行
例:xx.jpg,其中源碼為<?php phpinfo();?>
訪問xx.jpg時(shí),在xx.jpg后面添加/xx.php,即可實(shí)現(xiàn)nginx解析漏洞,將xx.jpg以php解析執(zhí)行
我們將上述情況做個(gè)實(shí)驗(yàn):這里我使用的是集成環(huán)境phpstudy
瀏覽器訪問:
返回了Access denied,這是為何?
我們先來梳理一遍流程,Nginx看到xx.jpg,根據(jù)mime.types,知道它是圖片類型,就交給圖片去處理;Nginx看到xx.jpg/xx.php,看到了.php,知道它是php類型,就交給php去處理,php看到xx.jpg/xx.php后綴是.php,就執(zhí)行xx.jpg/xx.php這個(gè)文件,執(zhí)行時(shí)發(fā)現(xiàn)不存在xx.php,就刪除/xx.php,繼續(xù)向前看,發(fā)現(xiàn)了xx.jpg,但php發(fā)現(xiàn).jpg不是他認(rèn)識(shí)的php類型,就不以php執(zhí)行,就返回了Access denied.
為什么php可以遇到刪除它呢,這是因?yàn)閜hp.ini中的配置:cgi.fix_pathinfo=1,一般默認(rèn)為1,當(dāng)他為1時(shí),即表示開啟php對(duì)文件路徑的修理,假設(shè)當(dāng)php見到aa.xxx/aa.yyy/aa.zzz這個(gè)文件時(shí),php沒有找到aa.xxx/aa.yyy/aa.zzz這個(gè)文件(記住,aa.xxx/aa.yyy/aa.zzz是個(gè)整體!),就刪除后面的/aa.zzz,檢測(cè)aa.xxx/aa.yyy這個(gè)文件是否存在,若存在,并且php認(rèn)識(shí)它,就以php解析執(zhí)行(不認(rèn)識(shí)返回Access denied.),若不存在,刪除/aa.yyy,檢測(cè)aa,xxx文件是否存在,以此類推
注:文章中所有實(shí)驗(yàn),全部默認(rèn)開啟php修理功能(cgi.fix_pathinfo=1)
測(cè)試上面的xx.jpg/xx.php時(shí),cgi.fix_pathinfo是開啟的,為什么還是無法解析呢,正如上面所說,php不認(rèn)識(shí).jpg這個(gè)類型,需要配置http-fpm.conf中的security.limit_extensions為空(這個(gè)配置完后需要重啟nginx)
例:security.limit_extensions默認(rèn)配置為;security.limit_extensions = .php .php3 .php4 .php5
這個(gè)什么意思?這個(gè)表示security.limit_extensions允許解析其他文件為php類型,我的理解就是,規(guī)定php認(rèn)識(shí)的后綴類型有哪些(限制它),這也就是為什么php不認(rèn)識(shí).jpg,要知道,但凡php認(rèn)識(shí)的后綴類型,都要以php格式來解析執(zhí)行的,一開始security.limit_extensions只認(rèn)識(shí).php .php3 .php4 .php5,現(xiàn)在改為空,表示php認(rèn)識(shí)任何后綴類型,那又有疑問了,有人說我設(shè)置了security.limit_extensions=空,可我直接訪問xx.jpg,xx.jpg沒有被php解析執(zhí)行,Why?其實(shí),security.limit_extensions=空確實(shí)表示將任何后綴名文件當(dāng)做php解析執(zhí)行,但你要知道,文件首先是要經(jīng)過Nginx判斷的,像這個(gè)xx.jpg,Nginx認(rèn)識(shí)他,直接判斷他為圖片,就交給圖片處理了,那還輪得到php修理后執(zhí)行,所以要想將xx.jpg給php修理執(zhí)行,首先要過Nginx這一關(guān),如使用xx.jpg/xx.php或xx.jpg/xx.php/xx.xxoo(從右往左判斷Nginx是否認(rèn)識(shí)),使用.php欺騙Nginx,告訴他,我這是php文件,交給php去。
可以看看IIS7.x的解析漏洞,有異曲同工之妙 文件解析漏洞總結(jié)-IIS
如果想讓xx.jpg可以以php解析,可以配置nginx.conf,就像配置apache的httpd.conf中的AddType(當(dāng)然這個(gè)我是猜的,實(shí)際可能沒有,nginx可能只能通過在url中,在xx.jpg后面添加/xx.php來將xx.jpg以php解析執(zhí)行,畢竟每個(gè)中間件都不同嘛)
所以綜合而言,Nginx漏洞利用的條件是:
(1)Nginx的http-fpm.conf中security.limit_extensions=空或其它指定的以php解析執(zhí)行的后綴
(2)php開啟文件修理:php.ini中cgi.fix_pathinfo=1
接下來就可以進(jìn)行漏洞復(fù)現(xiàn)了,分別在說一下流程
xx.jpg源碼:
利用一:xx.jpg/xx.php,Nginx從右向左找認(rèn)識(shí)的后綴,看到.php,將xx.jpg/xx.php交給php去修理執(zhí)行,php修理時(shí)發(fā)現(xiàn)xx.jpg/xx.php不存在,刪除/xx.php,繼續(xù)修理,發(fā)現(xiàn)xx.jpg存在,就將xx.jpg以php解析執(zhí)行
利用二:xx.jpg/xx.php/xx.xxoo,Nginx從右向左找認(rèn)識(shí)的后綴,看到.xxoo,不認(rèn)識(shí),看到.php認(rèn)識(shí),將xx.jpg/xx.php/xx.xxoo交給php去修理執(zhí)行,php修理時(shí)發(fā)現(xiàn)xx.jpg/xx.php/xx.xxoo不存在,就刪除/xx.xxoo,繼續(xù)修理,發(fā)現(xiàn)xx.jpg/xx.php不存在,刪除/xx.php,繼續(xù)修理,發(fā)現(xiàn)xx.jpg存在,就將xx.jpg以php解析執(zhí)行
防御方法:
(1)php.ini中設(shè)置cgi.fix_pathinfo=0
(2)php-fpm.conf中設(shè)置security.limit_extensions=.php,只允許.php后綴以php解析執(zhí)行
注意:我寫的實(shí)驗(yàn)室linux下的,windows又是另外一回事了,不會(huì)全部相同,例如windows中沒有php-fpm.conf配置文件,直接可以利用nginx解析漏洞,訪問圖片時(shí)會(huì)顯示源碼,不會(huì)返回圖片等等。
這篇文章我是使用phpstudy集成環(huán)境搭的,有些文件路徑和網(wǎng)上直接用agnix或docker環(huán)境所說的路徑不一致。
有些東西還得用原裝,這個(gè)目錄遍歷準(zhǔn)備寫的,配置了參數(shù)環(huán)境還是復(fù)現(xiàn)不了,也有可能是我phpstudy使用還不到家~
總結(jié)
以上是生活随笔為你收集整理的文件解析漏洞总结-Nginx的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 显示掉帧、重影该如何解决
- 下一篇: 道德经多少字