Cscms代码审计-PHP
字数 1564 2025-08-29 08:31:35

Cscms代码审计教学文档

1. 环境准备

  • CMS版本: Cscms 4.2
  • PHP版本: 7.0.9(建议使用此版本进行复现)
  • 审计工具: PhpStorm(用于代码分析)、BurpSuite(用于抓包和修改请求)

2. 漏洞概述

本次审计发现两个高危漏洞:

  1. SSRF漏洞(服务器端请求伪造)
  2. 文件覆盖导致Getshell漏洞

3. SSRF漏洞分析

3.1 漏洞位置

  • 功能点: 后台工具栏的采集功能
  • 文件路径: upload/plugins/sys/admin/Collect.php
  • 方法: Collect->add

3.2 漏洞触发流程

  1. 请求中的cjurl参数未做安全处理
  2. 参数被传入$this->caiji->str方法
  3. 通过htmlall方法使用curl请求URL

3.3 代码分析

// Collect.php#Collect->add
$cjurl = $_POST['cjurl']; // 未过滤的用户输入
$this->caiji->str($cjurl); // 传入危险方法

// 查找str方法定义(在PhpStorm中按两次Shift键搜索)
// str方法内部调用htmlall方法
function str($url) {
    $this->htmlall($url);
}

// htmlall方法使用curl请求
function htmlall($url) {
    // 使用curl请求$url,存在SSRF风险
}

3.4 复现步骤

  1. 在本地使用Python3开启HTTP服务:python3 -m http.server 8000
  2. 访问后台采集功能
  3. 在采集URL处输入http://127.0.0.1:8000
  4. 观察本地服务收到请求,证明SSRF存在

3.5 影响范围

所有调用$this->caiji->str方法的地方都存在SSRF漏洞

4. 文件覆盖导致Getshell漏洞

4.1 漏洞位置

  • 敏感函数: write_file(文件写入函数)
  • 文件路径: upload/cscms/app/helpers/common_helper.php

4.2 漏洞触发流程

  1. 查找调用write_file的位置(PhpStorm中Ctrl+Shift+F搜索)
  2. 发现upload/plugins/sys/admin/Plugins.php#Plugins->_route_file调用此函数
  3. $note[$key]['name']$note[$key]['url']以字符串方式拼接到文件内容
  4. 可通过换行符绕过注释限制

4.3 关键代码分析

// common_helper.php
function write_file($file, $content) {
    // 文件写入操作
}

// Plugins.php#_route_file
foreach($note as $key=>$val) {
    $data .= "//".$note[$key]['name']."\n";
    $data .= "\$route['".$key."'] = '".$note[$key]['url']."';\n\n";
}
write_file($file, $data); // 写入文件

4.4 复现步骤

  1. 使用BurpSuite抓取请求包
  2. 修改请求包内容,插入换行符和恶意代码:
    name=%0aphpinfo();/*
    url=*/%0a//
    
  3. 文件将写入到upload/cscms/config/dance/rewrite.php
  4. 访问个人中心的音乐页面触发代码执行

4.5 绕过限制技巧

  1. 发现evalshell_exec等函数被转义
  2. assert未被转义,但在PHP7+有限制
  3. 最终利用PHP动态特性实现RCE:
    ${system('id')};
    

5. 代码审计方法论总结

5.1 审计方法

  1. 功能点定向审计

    • 针对特定功能(如采集功能)进行深入分析
    • 根据经验判断常见漏洞位置
  2. 敏感函数回溯

    • 从危险函数(如文件操作、命令执行等)回溯参数来源
    • 分析参数是否可控
  3. 通读全文代码(本次未使用):

    • 全面阅读代码,发现潜在问题

5.2 PhpStorm审计技巧

  1. 快速定位方法定义

    • 双击Shift键全局搜索
    • Ctrl+鼠标左键跳转到定义
  2. 全局搜索调用关系

    • Ctrl+Shift+F全文搜索
    • 分析函数调用链
  3. 代码结构分析

    • 使用Structure面板查看类和方法结构
    • 利用Find Usages分析变量使用情况

6. 漏洞修复建议

6.1 SSRF修复

  1. 对采集URL进行严格过滤
  2. 限制访问内网IP和特殊协议
  3. 使用白名单机制限制可采集的域名

6.2 文件覆盖修复

  1. 对写入内容进行严格过滤
  2. 禁止换行符等特殊字符
  3. 对PHP代码进行转义处理
  4. 限制文件写入权限和目录

7. 总结

本次审计展示了从功能点和敏感函数入手的两种代码审计方法,成功发现SSRF和文件覆盖Getshell两个高危漏洞。通过PhpStorm的高效搜索和分析功能,大大提高了审计效率。最后利用PHP动态特性绕过过滤实现RCE,展示了漏洞利用的创造性思维。

Cscms代码审计教学文档 1. 环境准备 CMS版本 : Cscms 4.2 PHP版本 : 7.0.9(建议使用此版本进行复现) 审计工具 : PhpStorm(用于代码分析)、BurpSuite(用于抓包和修改请求) 2. 漏洞概述 本次审计发现两个高危漏洞: SSRF漏洞 (服务器端请求伪造) 文件覆盖导致Getshell漏洞 3. SSRF漏洞分析 3.1 漏洞位置 功能点 : 后台工具栏的采集功能 文件路径 : upload/plugins/sys/admin/Collect.php 方法 : Collect->add 3.2 漏洞触发流程 请求中的 cjurl 参数未做安全处理 参数被传入 $this->caiji->str 方法 通过 htmlall 方法使用curl请求URL 3.3 代码分析 3.4 复现步骤 在本地使用Python3开启HTTP服务: python3 -m http.server 8000 访问后台采集功能 在采集URL处输入 http://127.0.0.1:8000 观察本地服务收到请求,证明SSRF存在 3.5 影响范围 所有调用 $this->caiji->str 方法的地方都存在SSRF漏洞 4. 文件覆盖导致Getshell漏洞 4.1 漏洞位置 敏感函数 : write_file (文件写入函数) 文件路径 : upload/cscms/app/helpers/common_helper.php 4.2 漏洞触发流程 查找调用 write_file 的位置(PhpStorm中Ctrl+Shift+F搜索) 发现 upload/plugins/sys/admin/Plugins.php#Plugins->_route_file 调用此函数 $note[$key]['name'] 和 $note[$key]['url'] 以字符串方式拼接到文件内容 可通过换行符绕过注释限制 4.3 关键代码分析 4.4 复现步骤 使用BurpSuite抓取请求包 修改请求包内容,插入换行符和恶意代码: 文件将写入到 upload/cscms/config/dance/rewrite.php 访问个人中心的音乐页面触发代码执行 4.5 绕过限制技巧 发现 eval 、 shell_exec 等函数被转义 assert 未被转义,但在PHP7+有限制 最终利用PHP动态特性实现RCE: 5. 代码审计方法论总结 5.1 审计方法 功能点定向审计 : 针对特定功能(如采集功能)进行深入分析 根据经验判断常见漏洞位置 敏感函数回溯 : 从危险函数(如文件操作、命令执行等)回溯参数来源 分析参数是否可控 通读全文代码 (本次未使用): 全面阅读代码,发现潜在问题 5.2 PhpStorm审计技巧 快速定位方法定义 : 双击Shift键全局搜索 Ctrl+鼠标左键跳转到定义 全局搜索调用关系 : Ctrl+Shift+F全文搜索 分析函数调用链 代码结构分析 : 使用Structure面板查看类和方法结构 利用Find Usages分析变量使用情况 6. 漏洞修复建议 6.1 SSRF修复 对采集URL进行严格过滤 限制访问内网IP和特殊协议 使用白名单机制限制可采集的域名 6.2 文件覆盖修复 对写入内容进行严格过滤 禁止换行符等特殊字符 对PHP代码进行转义处理 限制文件写入权限和目录 7. 总结 本次审计展示了从功能点和敏感函数入手的两种代码审计方法,成功发现SSRF和文件覆盖Getshell两个高危漏洞。通过PhpStorm的高效搜索和分析功能,大大提高了审计效率。最后利用PHP动态特性绕过过滤实现RCE,展示了漏洞利用的创造性思维。