1. 程式人生 > 實用技巧 >Nginx 解析漏洞

Nginx 解析漏洞

目錄
該漏洞與Nginx、php版本無關,屬於使用者配置不當造成的解析漏洞。

漏洞復現

訪問http://172.17.0.1/uploadfiles/nginx.png回顯如下

增加/.php字尾,被解析成PHP檔案:

測試上傳功能:
正常上傳一張圖片馬,伺服器給我們返回上傳路徑。上傳成功後訪問圖片,並加上/.php字尾。將.gif檔案解析成php檔案回顯phpinfo。

漏洞成因

前面說了該漏洞與Nginx、php版本無關,屬於使用者配置不當造成的解析漏洞。那麼我們看一下配置不當的地方。

這是一段nginx配置,將.php結尾的檔案都會交給fastcgi來執行,http://172.17.0.1/uploadfiles/nginx.png/a.php也會交給fastcgi解析,fastcgi在解析".php"檔案時發現檔案並不存在,這時php.ini配置檔案中的cig.fix_pathinfo就發揮作用了,ccgi.fix_pathinfo是預設開啟的,當php遇到檔案路徑/aaa.xxx/bbb.yyy/ccc.zzz時,若/aaa.xxx/bbb.yyy/ccc.zzz不存在,則會去掉最後的/ccc.zzz,然後判斷/aaa.xxx/bbb.yyy是否存在,若存在,則把/aaa.xxx/bbb.yyy當做檔案/aaa.xxx/bbb.yyy/ccc.zzz解析,若/aaa.xxx/bbb.yyy仍不存在,則繼續去掉/bbb.yyy,以此類推。那麼fastcgi到底能解析哪些檔案呢,這個由php-fpm.conf中的security.limit_extensions引數決定的,下面是php手冊中對security.limit_extensions的解釋

security.limit_extensions string
限制 FPM 允許解析的指令碼副檔名。 此設定可以預防 web 伺服器配置的錯誤。
應當限制 FPM 僅僅解析 .php 副檔名,阻止惡意使用者使用其他副檔名執行 php 程式碼。 預設值: .php .phar

應當注意的是當此項設定為空的時候表示允許fastcgi將’.png’等檔案當做程式碼解析,恰好這個漏洞環境就是security.limit_extensions為空。成功將nginx.png當成了php執行

修復方案

1、如果cig.fix_pathinfo可以關閉的話就關閉,關閉該選項很可能會導致一些其他錯誤,所以一般是開啟的
2、將security.limit_extensions選項只填寫.php,阻止惡意使用者使用其他副檔名執行 php 程式碼,下面是我們修改了配置重啟之後的再惡意執行的情況,Access denied.。

參考連結

https://zgao.top/nginx錯誤配置引發的解析漏洞復現/
https://xz.aliyun.com/t/6801
https://www.php.net/manual/zh/install.fpm.configuration.php