前言:
官方介紹:
自 PHP 5.3.0 起,PHP 支持基于每個目錄的 .htaccess 風(fēng)格的 INI 文件。此類文件僅被 CGI/FastCGI SAPI 處理。此功能使得 PECL 的 htscanner 擴(kuò)展作廢。如果使用 Apache,則用 .htaccess 文件有同樣效果
除了主 php.ini 之外,PHP 還會在每個目錄下掃描 INI 文件,從被執(zhí)行的 PHP 文件所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被執(zhí)行的 PHP 文件在 web 根目錄之外,則只掃描該目錄。
首先我們知道,php.ini是php的核心配置文件,在 PHP 啟動時被讀取。按照如上所說,那么web目錄的其他ini文件也是可以被php識別,那么我們是不是可以通過配置.user.ini文件重新進(jìn)行配置的修改呢?

答案是顯而易見的,并不能任意修改配置。
在 .user.ini 風(fēng)格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 設(shè)置可被識別


綜上,我們可以了解到:
1、.user.ini實際上就是一個可以由用戶自定義的php.ini,我們能夠自定義的設(shè)置是模式為 PHP_INI_PERDIR 或者 PHP_INI_USER的設(shè)置。實際上,除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通過.user.ini來設(shè)置的。
2、.user.ini是一個能被動態(tài)加載的ini文件。也就是說我修改了.user.ini后,不需要重啟服務(wù)器中間件,只需要等待user_ini.cache_ttl所設(shè)置的時間(默認(rèn)為300秒),即可被重新加載。
我們可以通過在官網(wǎng)上查看哪些配置可以在.user.ini中運(yùn)用:
https://www.php.net/manual/zh/ini.list.php
我們可以發(fā)現(xiàn)稍微敏感的配置項,都是PHP_INI_SYSTEM模式的(甚至是php.ini only的),包括disable_functions、extension_dir、enable_dl等,但是還是有可以利用的地方的

可以通過.user.ini繞過open_basedir的限制,還有其他的一些繞過手法就不多介紹了,下面的這篇文章介紹得很詳細(xì):
淺談幾種Bypass open_basedir的方法
利用.user.ini本地包含文件:
利用條件:open_basedir沒有被限制
利用函數(shù):auto_append_file、auto_prepend_file
利用原理:借助.user.ini輕松讓所有php文件都“自動”包含某個文件,而這個文件可以是一個正常php文件,也可以是一個包含一句話的webshell

auto_prepend_file 表示在加載第一個PHP代碼之前先行預(yù)加載該配置所指示的PHP文件。
auto_append_file 表示在加載第一個PHP代碼之后執(zhí)行預(yù)加載該配置所指示的PHP文件。
利用過程:
1、我們先構(gòu)建一個圖片馬,并上傳到服務(wù)器:

2、上傳.user.ini到目標(biāo)服務(wù)器,文件內(nèi)容編輯為:

3、找到目標(biāo)服務(wù)器存在的任意php可正常訪問的文件
這里我們以echo.php作為測試:

4、構(gòu)造url并進(jìn)行訪問,成功輸出phpinfo:

原文件的內(nèi)容輸出在最后,auto_append_file函數(shù)則相反:

利用背景:
假設(shè)某網(wǎng)站限制不允許上傳.php文件,但是可以上傳一個.user.ini,再上傳一個圖片馬,包含起來進(jìn)行g(shù)etshell。不過前提是含有.user.ini的文件夾下需要有正常的php文件。
user.ini在實際中的應(yīng)用很廣,它比.htaccess用的更廣,不管是nginx/apache/IIS,只要是以fastcgi運(yùn)行的php都可以用這個方法
利用.user.ini繞過open_basedir(失敗):
由于Windows使用phpstudy復(fù)現(xiàn)失敗,這里我們搭建環(huán)境:
Kali + nginx + php7.4-fpm
具體搭建過程請參考:
Ubuntu16.0.4.1安裝lnmp
Linux/Ubuntu16.04+Nginx+Mysql+PHP 搭建wordpress
搭建環(huán)境往往都是悲傷的故事,不提也罷。。。
搭建完以后啟動相應(yīng)服務(wù):
/etc/init.d/nginx start
/etc/init.d/php7.4-fpm start

php.ini限制open_basedir

此時無法讀取/var/目錄下的文件

上傳.user.ini,編輯內(nèi)容如下:
open_basedir=:\
復(fù)現(xiàn)失敗了,似乎這個思路不行,它會根據(jù)php.ini設(shè)置的open_basedir為主
end
php我了解得很少,可能還有其他函數(shù)可以被利用的,以后發(fā)現(xiàn)了再說