代码审计之php.ini配置详解
字数 1719 2025-08-18 11:39:08
PHP.ini 配置安全审计详解
一、PHP.ini 简介
PHP.ini 是 PHP 的核心配置文件,其加载方式因运行模式不同而有所差异:
- Apache 模块版本:仅在 Web 服务器启动时读取一次
- CGI/CLI 版本:每次调用都会被读取
- 加载路径:Apache 启动时会转到根目录尝试读取 php.ini
PHP 配置模式分类
| 模式 | 含义 | 可设置位置 |
|---|---|---|
| PHP_INI_USER | 用户级配置 | 用户脚本(ini_set())、Windows 注册表(5.3+)、.user.ini |
| PHP_INI_PERDIR | 目录级配置 | php.ini、.htaccess、httpd.conf |
| PHP_INI_SYSTEM | 系统级配置 | php.ini、httpd.conf |
| PHP_INI_ALL | 全局配置 | 任何地方 |
User.ini 文件:自 PHP 5.3.0 起支持基于每个目录的 .htaccess 风格 INI 文件,仅被 CGI/FastCGI SAPI 处理。
二、关键安全配置详解
1. register_globals
作用:控制全局变量的自动注册(已废弃)
版本变化:
- PHP 5.2.0 默认开启
- PHP 5.3.0 废弃
- PHP 5.4.0 移除
安全风险:
// 漏洞示例
$username = $_GET['username'];
$password = $_GET['password'];
if(($username==="admin") && ($password==="admin123")){
$authorized = true;
}
// 攻击者可构造 ?authorized=true 直接绕过验证
if ($authorized) {
echo "You have login";
}
POC:
http://127.0.0.1/test.php?username=xxx&password=xxx&authorized=true
审计要点:
- 检查变量是否被覆盖
- 可能导致身份验证绕过、SQL注入等漏洞
2. short_open_tag
作用:控制是否允许使用 PHP 短标签 <? ?>
版本特性:
- PHP 5.2-5.3 默认开启
- PHP 5.4.0 起
<?=总是可用
安全风险:
// 文件上传检测漏洞示例
$content = file_get_contents($upload_path);
if(preg_match('/<\?php/',$content)){ // 只检测完整标签
echo "Hacker detected";
} else {
echo "Upload success"; // 可通过 <?=`command`?> 绕过
}
攻击向量:
- PHP 5.4+ 未开启短标签时可用:
<?={$_GET["cmd"]}?> - 上传包含短标签的恶意文件
3. safe_mode
作用:禁用危险函数如 system()、exec() 等(已废弃)
版本变化:
- PHP 5.3.0 废弃
- PHP 5.4.0 移除
相关配置:
safe_mode_exec_dir:限制可执行目录disable_classes:禁用特定类disable_functions:禁用特定函数
漏洞示例:
$cmd = $_GET['cmd'];
system("{$cmd}"); // 直接命令执行
4. open_basedir
作用:限制文件访问范围
配置要点:
- 必须正确闭合路径(如
/var/www/html/) - 可在运行时动态配置
错误配置风险:
open_basedir=/var/www/html // 可访问 /var/www/html1 等目录
5. 文件上传相关配置
file_uploads = On
upload_max_filesize = 2M
upload_tmp_dir = [路径] ; 默认为系统临时目录
安全考虑:
- 限制上传文件大小
- 指定安全的临时目录
- 配合内容检查防止恶意文件上传
6. 错误显示配置
display_errors = On ; 生产环境应关闭
error_reporting = E_ALL ; 错误报告级别
error_log = [路径] ; 自定义错误日志
log_errors = on ; 记录错误到日志
安全风险:
- 暴露服务器路径信息
- 增加SQL注入风险(显示错误详情)
7. magic_quotes 相关
作用:
magic_quotes_gpc:自动转义GPC数据中的特殊字符magic_quotes_runtime:转义数据库和文本文件内容
版本变化:
- PHP 5.3.0 默认关闭
- PHP 5.4.0 移除
SQL注入风险:
$user = $_GET['username'];
$sql = "SELECT * FROM users WHERE username='{$user}'";
// 未开启magic_quotes_gpc时易受SQL注入
三、审计实践要点
-
环境识别:
- 确定PHP版本
- 检查php.ini实际配置(可通过phpinfo())
-
配置影响分析:
- register_globals开启时的变量覆盖风险
- short_open_tag开启时的代码执行风险
- safe_mode关闭时的危险函数调用
-
防御措施:
- 生产环境关闭display_errors
- 合理设置open_basedir
- 禁用不必要的危险函数
-
版本适配:
- 注意不同PHP版本默认配置差异
- 识别已废弃/移除的特性
四、总结
PHP.ini配置直接影响应用程序的安全边界,审计时应:
- 优先检查register_globals、safe_mode等关键配置
- 关注不同PHP版本的默认行为变化
- 验证配置实际效果,避免想当然
- 结合代码逻辑分析配置可能带来的安全隐患
通过全面审计php.ini配置,可以有效识别因环境不当导致的潜在安全风险。