1. 程式人生 > >nginx文件類型錯誤解析漏洞

nginx文件類型錯誤解析漏洞

https 路徑 導致 錯誤 靜態網頁 turn 舉例 操作 log

問題簡介:
nginx是一款高性能的web服務器,使用非常廣泛,其不僅經常被用作反向代理,也可以非常好的支持PHP的運行。nginx默認以cgi的方式支持php的運行,而為了較好的支持PATH_INFO的提取,在PHP的配置選項裏存在cgi.fix_pathinfo選項,其目的是為了從SCRIPT_FILENAME裏取出真正的腳本名,而攻擊者則利用這點可以將任何類型的文件以PHP的方式進行解析。
影響版本:0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37 ,目前我們版本在1.1以上。

舉例說明:
假設test.king.com是一個論壇,可以上傳圖片操作(後臺有bug並沒有對圖片進行判斷處理),用戶已經上傳一張包含php腳本的圖片abc.jpg

現將test.king.com修定本地
瀏覽器訪問test.king.com/abc.jpg,此時會顯示無法瀏覽此圖片
現訪問test.king.com/abc.jpg/c.php 或者test.king.com/abc.jpg%00.php 則會將abc.jpg當做腳本文件直接運行,會顯示出abc.jpg裏的腳本代碼phpinfo()信息
(以上只限測試,如有人想嘗試,可在虛擬機上運行)
原理:
nginx在接受請求後會得到一個地址URL/abc.jpg/c.php
在經過location指令,將請求交給fastcgi處理,nginx為其設置環境變量SCRIPT_FILENAME,內容為/abc.jpg/c.php
後端的fastcgi在接受到該選項時,會根據PHP的fix_pathinfo配置決定是否對SCRIPT_FILENAME進行額外的處理,一般情況下如果不對fix_pathinfo進行設置將影響使用PATH_INFO進行路由選擇的應用,

所以該選項一般配置開啟。Php通過該選項之後將查找其中真正的腳本文件名字,查找的方式也是查看文件是否存在,這個時候將分離SCRIPT_FILENAME和PATH_INFO分別為/scripts/abc.jpg和c.php
最後,以/scripts/abc.jpg作為此次請求需要執行的腳本,攻擊者就可以實現讓nginx以php來解析任何類型的文件了。

解決:

關閉php.ini裏的cgi.fix_pathinfo為0
或者
if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}
前兩個可能會導致一些偽靜態網頁或者特殊的路徑無法顯示

宴哥提供了一個方法可寫在fcgi.conf文件中,便於多個虛擬主機引用
if ($request_filename ~* (.*).php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}


原文:https://blog.csdn.net/ws_zll/article/details/7552916

nginx文件類型錯誤解析漏洞