nginx + php-fpm fastcgi防止跨站、跨目錄的安全設定

來源:互聯網
上載者:User


0x00 實驗目的

根據文章”PHP繞過open_basedir列目錄的研究”通過測試不同的配置驗證本文的繞過basedir的方法是否有效,從而安全配置php open_basedir的目的.
文中後面幾個方法都是windwos下採用枚舉的方式列出目錄,linux下需要做暴力猜解的方式才可以,所以不做測試.

測試”DirectoryIterator + Glob”方式是否可以繞過open_basedir
測試webshell工具”菜刀”是否可以繞過open_basedir

0x01 實驗環境

nginx + PHP 5.6.7 fastcgi模式, centos7 linux
目前配置open_basedir有三處地方php-fpm.conf,nginx fastcgi_param,php.ini
下面逐一測試

0x02 測試詳細

只在php-fpm.conf中配置


php_admin_value[open_basedir]=/home/wwwroot/:/proc/:/tmp/

結果

open_basedir的目錄以外不能讀,不能寫,不過DirectoryIterator + Glob 可以成功列出全盤檔案


當前open_basedir
open_basedir : /home/wwwroot/:/proc/:/tmp/
 
-- DirectoryIterator + Glob --.
..
.autorelabel
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
vagrant
var
菜刀不可跨出basedir

 

只在nginx的fastcgi_param配置


# set php open_basedir
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
這裡的”$document_root”是nginx中的變數,為nginx的每個server裡的root目錄
比如server www.111cn.net配置的root目錄為/home/wwwroot/www.111cn.net

認真讀php手冊有下面這段話
PHP配置值通過 php_value 或者 php_flag 設定,並且會覆蓋以前的值。
請注意 disable_functions 或者 disable_classes 在 php.ini 之中定義的值不會被覆蓋掉,但是會將新的設定附加在原有值的後面。
使用 php_admin_value 或者 php_admin_flag 定義的值,不能被 PHP
代碼中的 ini_set() 覆蓋。自 5.3.3 起,也可以通過 網頁伺服器設定
PHP 的設定。也就是nignx中fastcgi_param配置php的配置
php_flag用來專門設定布爾值,如on, off, 1, 0, true, false, yes, no,
而php_value用來設定所有類型的值

結果和上面一樣

open_basedir的目錄以外不能讀,不能寫,不過DirectoryIterator + Glob 可以成功列出全盤檔案

菜刀不可跨出basedir

 

只在php.ini配置

[HOST=www.111cn.net]
open_basedir=/home/wwwroot/www.111cn.net/:/proc/:/tmp/
[PATH=/home/wwwroot/www.111cn.net/]
open_basedir=/home/wwwroot/www.111cn.net/:/proc/:/tmp/
意思是當HOST=www.111cn.net設定open_basedir,當PATH=/home/wwwroot/www.111cn.net/

設定open_basedir,我測試的時候2個任意設定一個都是有效

結果和上面一樣

open_basedir的目錄以外不能讀,不能寫,不過DirectoryIterator + Glob 可以成功列出全盤檔案

菜刀不可跨出basedir

 
0x03 個人結論

DirectoryIterator + Glob的方式可以列出php伺服器上所有檔案,看似沒什麼危害,實際上對於長期的APT絕對有協助.
open_basedir不是想象的那麼安全,說不定別人手上有甚至有能讀寫open_basedir的0day

0x04 個人推薦的nginx + php(fastcgi fpm-php)(lnmp) open_basedir的配置

先設定fpm-php中pool池中的總open_basedir這叫頂層設計,有個總限制,比如統一限制到/home/wwwroot/這樣的web目錄下
再對nginx中單個server 通過 fastcgi_param PHP_ADMIN_VALUE 設定
再對php.ini設定 [HOST=XXX] [PATH=XXX] 三管齊下媽媽再也不用擔心我的php open_basedir了(希望吧)
雖然很???但是這樣豈不是更放心
總而言之就是下面的結果,我就是下面這種??碌呐渲?/p>


#在php-fpm.conf對應的pool池中行尾配置
php_admin_value[open_basedir]=/home/wwwroot/:/proc/:/tmp/
 
#在nginx fastcgi fastcgi_param配置
#這裡用$document_root是一種取巧的方法,也可以設定絕對路徑
# set php open_basedir
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
 
#在php.ini行尾配置
[HOST=www.111cn.net]
open_basedir=/home/wwwroot/www.111cn.net/:/proc/:/tmp/
[PATH=/home/wwwroot/www.111cn.net/]
open_basedir=/home/wwwroot/www.111cn.net/:/proc/:/tmp/
 

測試中還發現這三個地方配置的優先順序如下

“php.ini” > “nginx fastcgi fastcgi_param” > “php-fpm.conf”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.