一处代码执行引发的思考
字数 1042 2025-08-18 11:37:37
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;//../
解释:
factory():用于闭合前面的实例化对象,避免语法错误;:结束前一条语句echo 1;:任意PHP代码(可替换为恶意代码)//../:注释掉后续内容并满足file_exists()检查
实际利用示例
访问URL:
http://target.com/path/to/yccms/count.php?a=factory();phpinfo();//../
这将执行phpinfo()函数,证明代码执行成功。
漏洞修复建议
- 输入过滤:对
$_GET['a']参数进行严格过滤,只允许字母数字 - 避免直接eval:避免直接将用户输入传入
eval()函数 - 使用白名单:对允许加载的文件建立白名单机制
- 更新版本:联系厂商获取已修复的安全版本
技术细节补充
file_exists()函数特性验证
测试环境:
ceshi1/
└── 1
测试URL:
http://127.0.0.1/test.php?a=ceshi1/1;/../2449.html
结果:即使包含特殊字符,file_exists()仍能正确识别文件存在性
eval()多语句执行
eval()函数可以执行多条以分号间隔的PHP语句,这是漏洞能够利用的关键特性之一。
免责声明
本技术分析仅用于安全研究与学习目的,严禁用于非法用途。任何因使用此技术信息造成的后果由使用者自行承担。相关漏洞已报送厂商并修复。