一处代码执行引发的思考
字数 1042 2025-08-18 11:37:37

YCCMS 3.3 代码执行漏洞分析与利用

漏洞概述

YCCMS是一款PHP版轻量级CMS建站系统,其3.3版本存在一个严重的代码执行漏洞。该漏洞源于对用户输入参数的不当处理,导致攻击者可以通过构造特殊参数实现任意PHP代码执行。

漏洞分析

漏洞触发流程

  1. 请求入口:系统访问首页时会跳转到count.php文件执行代码
  2. 文件包含count.php作为中转站,会包含run.inc.php文件
  3. 自动加载run.inc.php使用魔术方法自动加载项目中的类并执行特定方法
  4. 参数处理:系统通过$_GET['a']获取用户输入参数
  5. 文件检查:使用file_exists()函数检查文件是否存在
  6. 代码执行:未经过滤直接将用户可控变量传入eval()函数执行

关键漏洞点

  1. 用户输入可控$_GET['a']参数完全由用户控制
  2. file_exists()函数特性
    • 允许路径中包含特殊符号(如分号、斜线)
    • 遇到/../结构时会将第一个斜线前面的内容当作目录名处理
  3. eval()函数直接执行:未对输入进行任何过滤或转义

漏洞利用

利用条件

  • 必须能够访问到admin目录(漏洞被限制在admin范围内)
  • 系统未对$_GET['a']参数进行过滤

利用方法

构造如下形式的payload:

factory();echo 1;//../

解释:

  1. factory():用于闭合前面的实例化对象,避免语法错误
  2. ;:结束前一条语句
  3. echo 1;:任意PHP代码(可替换为恶意代码)
  4. //../:注释掉后续内容并满足file_exists()检查

实际利用示例

访问URL:

http://target.com/path/to/yccms/count.php?a=factory();phpinfo();//../

这将执行phpinfo()函数,证明代码执行成功。

漏洞修复建议

  1. 输入过滤:对$_GET['a']参数进行严格过滤,只允许字母数字
  2. 避免直接eval:避免直接将用户输入传入eval()函数
  3. 使用白名单:对允许加载的文件建立白名单机制
  4. 更新版本:联系厂商获取已修复的安全版本

技术细节补充

file_exists()函数特性验证

测试环境:

ceshi1/
└── 1

测试URL:

http://127.0.0.1/test.php?a=ceshi1/1;/../2449.html

结果:即使包含特殊字符,file_exists()仍能正确识别文件存在性

eval()多语句执行

eval()函数可以执行多条以分号间隔的PHP语句,这是漏洞能够利用的关键特性之一。

免责声明

本技术分析仅用于安全研究与学习目的,严禁用于非法用途。任何因使用此技术信息造成的后果由使用者自行承担。相关漏洞已报送厂商并修复。

YCCMS 3.3 代码执行漏洞分析与利用 漏洞概述 YCCMS是一款PHP版轻量级CMS建站系统,其3.3版本存在一个严重的代码执行漏洞。该漏洞源于对用户输入参数的不当处理,导致攻击者可以通过构造特殊参数实现任意PHP代码执行。 漏洞分析 漏洞触发流程 请求入口 :系统访问首页时会跳转到 count.php 文件执行代码 文件包含 : count.php 作为中转站,会包含 run.inc.php 文件 自动加载 : run.inc.php 使用魔术方法自动加载项目中的类并执行特定方法 参数处理 :系统通过 $_GET['a'] 获取用户输入参数 文件检查 :使用 file_exists() 函数检查文件是否存在 代码执行 :未经过滤直接将用户可控变量传入 eval() 函数执行 关键漏洞点 用户输入可控 : $_GET['a'] 参数完全由用户控制 file_ exists()函数特性 : 允许路径中包含特殊符号(如分号、斜线) 遇到 /../ 结构时会将第一个斜线前面的内容当作目录名处理 eval()函数直接执行 :未对输入进行任何过滤或转义 漏洞利用 利用条件 必须能够访问到admin目录(漏洞被限制在admin范围内) 系统未对 $_GET['a'] 参数进行过滤 利用方法 构造如下形式的payload: 解释: factory() :用于闭合前面的实例化对象,避免语法错误 ; :结束前一条语句 echo 1; :任意PHP代码(可替换为恶意代码) //../ :注释掉后续内容并满足 file_exists() 检查 实际利用示例 访问URL: 这将执行 phpinfo() 函数,证明代码执行成功。 漏洞修复建议 输入过滤 :对 $_GET['a'] 参数进行严格过滤,只允许字母数字 避免直接eval :避免直接将用户输入传入 eval() 函数 使用白名单 :对允许加载的文件建立白名单机制 更新版本 :联系厂商获取已修复的安全版本 技术细节补充 file_ exists()函数特性验证 测试环境: 测试URL: 结果:即使包含特殊字符, file_exists() 仍能正确识别文件存在性 eval()多语句执行 eval() 函数可以执行多条以分号间隔的PHP语句,这是漏洞能够利用的关键特性之一。 免责声明 本技术分析仅用于安全研究与学习目的,严禁用于非法用途。任何因使用此技术信息造成的后果由使用者自行承担。相关漏洞已报送厂商并修复。