PHPCMS漏洞分析合集(上)
字数 2220 2025-08-27 12:33:37

PHPCMS漏洞分析与利用技术详解

一、PHPCMS v9.6.0任意文件上传漏洞

漏洞原理分析

该漏洞存在于用户注册功能中,通过精心构造的POST数据可实现远程文件上传并执行任意代码。

漏洞链分析:

  1. 用户注册时,$_POST['info']参数传入member_input类的get方法
  2. get方法允许调用member_input类的所有方法
  3. 通过调用editor方法触发文件下载功能
  4. editor方法调用attachment类的download方法
  5. download方法存在正则绕过和URL处理缺陷

关键代码点:

  • 漏洞入口phpcms/modules/member/index.php中的用户注册处理
  • 方法调用链member_input->get()->editor()->attachment->download()
  • 正则绕过技巧:使用http://xxxx/1.php?a.jpghttp://xxxx/1.php#a.jpg格式绕过.gif|jpg|jpeg|bmp|png限制

文件上传流程:

  1. fillurl方法去除#号后内容,将http://xxxx/1.php#a.jpg处理为http://xxxx/1.php
  2. 使用copy函数将远程文件复制到本地
  3. 上传路径格式:uploadfile/date('Y/md/')/date('Ymdhis').rand(100, 999).'.'.$fileext

漏洞修复分析

官方在v9.6.1中增加了黑名单校验:

  • 使用fileext($file)获取文件后缀
  • 检查后缀是否在黑名单中
  • 修复缺陷:仍可上传图片马,若存在文件包含或文件名修改漏洞仍可getshell

潜在绕过尝试

尝试使用.php%7f绕过(Windows会将非法字符替换为空),但由于后续处理限制未能成功

二、PHPCMS v9.6.0 SQL注入漏洞

漏洞原理分析

该漏洞源于对解密数据未进行充分过滤,结合变量覆盖问题导致SQL注入。

漏洞链分析:

  1. phpcms/modules/content/down.phpinit方法获取a_k参数
  2. 使用sys_auth解密a_k
  3. parse_str处理解密数据导致变量覆盖
  4. 未过滤的$id直接拼接到SQL查询

关键代码点:

  • 加密机制:默认使用pc_base::load_config('system','auth_key')作为密钥
  • 注入点get_one方法直接拼接未过滤数据到SQL语句
  • 数据加密入口
    • phpcms/modules/wap/index.php$_GET['siteid']
    • phpcms/modules/mood/index.phppost方法

利用条件:

  1. 获取有效的加密payload
  2. 绕过登录验证
  3. 构造注入语句

漏洞利用链详解

第一步:获取加密数据

  1. 通过wap/index.phpmood/index.php获取加密数据
  2. 即使WAP模块禁用,仍可通过mood/index.php获取

第二步:绕过登录验证

  1. 使用attachments.phpswfupload_json方法
  2. $_GET['src']仅经过safe_replace过滤
  3. 登录验证绕过:
    • $_POST['userid_flash']使用第一步获取的加密数据
    • 解密后非空即可通过验证

第三步:完成注入

  1. 通过parse_str变量覆盖
  2. 构造恶意SQL语句

管理员会话劫持技术

  1. 通过注入获取管理员PHPSESSID(存储在数据库)
  2. 需要额外获取$userid字段值(从响应包Set-Cookie获取)
  3. 限制条件:管理员必须保持登录状态

漏洞修复分析

官方在v9.6.1中增加了:

  1. safe_replace过滤
  2. intval过滤

三、漏洞利用实战技巧

任意文件上传利用要点

  1. 构造恶意注册请求,包含特殊格式的图片URL
  2. 使用#?绕过文件类型检查
  3. 预测上传路径和时间格式

SQL注入利用要点

  1. 寻找可获取加密数据的入口点
  2. 构造双重请求:先获取加密数据,再用于注入
  3. 注意WAP模块状态对利用的影响

权限提升技巧

  1. 通过注入获取管理员cookie
  2. 伪造完整会话需要:
    • PHPSESSID
    • userid字段
  3. 检查$_SESSION['roleid']$userid匹配

四、防御建议

针对文件上传漏洞

  1. 实施严格的文件类型白名单
  2. 检查文件内容而不仅是扩展名
  3. 对远程文件下载实施内容校验

针对SQL注入漏洞

  1. 对所有解密数据进行严格过滤
  2. 使用参数化查询
  3. 避免直接拼接用户输入到SQL语句

通用安全建议

  1. 及时更新到最新版本
  2. 实施最小权限原则
  3. 对会话管理加强保护,特别是管理员会话

五、扩展思考

漏洞链挖掘方法论

  1. 从漏洞点反向追踪触发路径
  2. 寻找多个可能的漏洞入口
  3. 分析补丁的完整性和潜在绕过

代码审计技巧

  1. 关注加密解密函数的使用
  2. 追踪用户输入的数据流
  3. 特别注意变量覆盖场景

本教学文档详细分析了PHPCMS两个高危漏洞的技术细节和利用方法,涵盖了从漏洞原理到实际利用的全过程,并提供了针对性的防御建议。这些分析不仅适用于PHPCMS,其中的技术思路和方法论也可应用于其他CMS系统的安全审计。

PHPCMS漏洞分析与利用技术详解 一、PHPCMS v9.6.0任意文件上传漏洞 漏洞原理分析 该漏洞存在于用户注册功能中,通过精心构造的POST数据可实现远程文件上传并执行任意代码。 漏洞链分析: 用户注册时, $_POST['info'] 参数传入 member_input 类的 get 方法 get 方法允许调用 member_input 类的所有方法 通过调用 editor 方法触发文件下载功能 editor 方法调用 attachment 类的 download 方法 download 方法存在正则绕过和URL处理缺陷 关键代码点: 漏洞入口 : phpcms/modules/member/index.php 中的用户注册处理 方法调用链 : member_input->get()->editor()->attachment->download() 正则绕过技巧 :使用 http://xxxx/1.php?a.jpg 或 http://xxxx/1.php#a.jpg 格式绕过 .gif|jpg|jpeg|bmp|png 限制 文件上传流程: fillurl 方法去除 # 号后内容,将 http://xxxx/1.php#a.jpg 处理为 http://xxxx/1.php 使用 copy 函数将远程文件复制到本地 上传路径格式: uploadfile/date('Y/md/')/date('Ymdhis').rand(100, 999).'.'.$fileext 漏洞修复分析 官方在v9.6.1中增加了黑名单校验: 使用 fileext($file) 获取文件后缀 检查后缀是否在黑名单中 修复缺陷 :仍可上传图片马,若存在文件包含或文件名修改漏洞仍可getshell 潜在绕过尝试 尝试使用 .php%7f 绕过(Windows会将非法字符替换为空),但由于后续处理限制未能成功 二、PHPCMS v9.6.0 SQL注入漏洞 漏洞原理分析 该漏洞源于对解密数据未进行充分过滤,结合变量覆盖问题导致SQL注入。 漏洞链分析: phpcms/modules/content/down.php 的 init 方法获取 a_k 参数 使用 sys_auth 解密 a_k 值 parse_str 处理解密数据导致变量覆盖 未过滤的 $id 直接拼接到SQL查询 关键代码点: 加密机制 :默认使用 pc_base::load_config('system','auth_key') 作为密钥 注入点 : get_one 方法直接拼接未过滤数据到SQL语句 数据加密入口 : phpcms/modules/wap/index.php 的 $_GET['siteid'] phpcms/modules/mood/index.php 的 post 方法 利用条件: 获取有效的加密payload 绕过登录验证 构造注入语句 漏洞利用链详解 第一步:获取加密数据 通过 wap/index.php 或 mood/index.php 获取加密数据 即使WAP模块禁用,仍可通过 mood/index.php 获取 第二步:绕过登录验证 使用 attachments.php 的 swfupload_json 方法 $_GET['src'] 仅经过 safe_replace 过滤 登录验证绕过: $_POST['userid_flash'] 使用第一步获取的加密数据 解密后非空即可通过验证 第三步:完成注入 通过 parse_str 变量覆盖 构造恶意SQL语句 管理员会话劫持技术 通过注入获取管理员 PHPSESSID (存储在数据库) 需要额外获取 $userid 字段值(从响应包 Set-Cookie 获取) 限制条件 :管理员必须保持登录状态 漏洞修复分析 官方在v9.6.1中增加了: safe_replace 过滤 intval 过滤 三、漏洞利用实战技巧 任意文件上传利用要点 构造恶意注册请求,包含特殊格式的图片URL 使用 # 或 ? 绕过文件类型检查 预测上传路径和时间格式 SQL注入利用要点 寻找可获取加密数据的入口点 构造双重请求:先获取加密数据,再用于注入 注意WAP模块状态对利用的影响 权限提升技巧 通过注入获取管理员cookie 伪造完整会话需要: PHPSESSID userid 字段 检查 $_SESSION['roleid'] 和 $userid 匹配 四、防御建议 针对文件上传漏洞 实施严格的文件类型白名单 检查文件内容而不仅是扩展名 对远程文件下载实施内容校验 针对SQL注入漏洞 对所有解密数据进行严格过滤 使用参数化查询 避免直接拼接用户输入到SQL语句 通用安全建议 及时更新到最新版本 实施最小权限原则 对会话管理加强保护,特别是管理员会话 五、扩展思考 漏洞链挖掘方法论 从漏洞点反向追踪触发路径 寻找多个可能的漏洞入口 分析补丁的完整性和潜在绕过 代码审计技巧 关注加密解密函数的使用 追踪用户输入的数据流 特别注意变量覆盖场景 本教学文档详细分析了PHPCMS两个高危漏洞的技术细节和利用方法,涵盖了从漏洞原理到实际利用的全过程,并提供了针对性的防御建议。这些分析不仅适用于PHPCMS,其中的技术思路和方法论也可应用于其他CMS系统的安全审计。