中间件与框架历史漏洞:Struts / ThinkPHP 类问题复盘方法
admin
2026-10-27 04:21
47人看过
免费
# 中间件与框架历史漏洞:Struts / ThinkPHP 类问题复盘方法
> 攻防演练红队视角:这类属于**Web框架历史漏洞**,本质是框架自带的代码缺陷,不需要手工写注入payload,直接利用框架内置的缺陷实现RCE。典型代表:Struts2系列、ThinkPHP多版本漏洞;Spring、Shiro也属于同大类。
> 核心思路:**识别框架与版本 → 匹配对应CVE → 验证漏洞 → 利用;复盘则是反向:漏洞复现、根因、影响面、检测、修复、复盘沉淀**
## 一、漏洞简要回顾(Struts2 / ThinkPHP 高频漏洞)
### Struts2(OGNL表达式注入,RCE)
原理:OGNL对象图导航语言,框架未严格过滤用户可控参数,用户输入直接作为OGNL表达式解析,造成远程代码执行。
经典CVE:
- S2-045(CVE-2017-5638):文件上传头`Content-Type`OGNL注入,**演练最高频**
- S2-046:同样文件上传,Content-Disposition
- S2-001、S2-032、S2-016 老版本
> 特点:**不需要登录,GET/POST传入OGNL表达式,直接命令执行**
### ThinkPHP(多版本框架漏洞,RCE)
大多是路由解析缺陷、方法调用可控、变量覆盖导致代码执行
- ThinkPHP 5.0.x:`?s=xxx`路由漏洞,最经典
- ThinkPHP5.1、6部分版本也存在路由/反序列化漏洞
> 特征:URL里带有 `?s=` 路由参数是ThinkPHP标志性特征
> 共性:**属于框架自带漏洞,不是开发人员写代码引入的SQLi/XSS;升级框架版本/打补丁才能根治,单纯WAF规则临时缓解**
## 二、红队:漏洞识别&验证流程(渗透时怎么挖到这类洞)
1. **指纹识别**
- HTTP响应头、页面报错、404页面、特征URL识别框架
- Struts2:`x-work`、`struts2`响应头,错误页显示Struts2异常堆栈
- ThinkPHP:`?s=index/index`、报错页面带有ThinkPHP字样
2. **版本判定**:根据指纹、报错信息确定版本范围
3. **匹配CVE漏洞对照表**,筛选可用EXP
4. **漏洞验证(优先无害验证,演练禁止直接破坏性执行)**
- 不直接执行系统命令,优先执行简单表达式判断是否触发
- Struts:执行简单OGNL表达式;TP:触发报错、时间延迟判断盲RCE
5. **漏洞利用:执行命令、写入webshell,获取初始访问**
> 坑点:很多WAF拦截经典payload,需要编码变形、换参数位置、更换请求头绕过
## 三、【重点】漏洞复盘方法论(蓝队应急/赛后复盘标准步骤)
> 当演练被打穿、或者真实事件出现Struts/ThinkPHP漏洞被利用,复盘按下面流程:
### Step1:事件还原,梳理攻击链
1. 日志溯源:访问日志、access.log,查找特征payload
- Struts S2-045:POST数据包,Content-Type头携带OGNL表达式
- ThinkPHP:GET参数`s=`后面带恶意路由payload
2. 确认入口:攻击源IP、时间、请求包、攻击成功的请求
3. 确认影响范围:
- 哪些业务IP/域名使用这个有漏洞框架?
- 是否拿到Webshell?是否提权、横向移动?造成多大危害
### Step2:根因分析(核心复盘环节)
从三层定位根源:
1. 技术根因:框架存在CVE历史漏洞,未升级;
2. 运维根因:上线前没有漏洞扫描、老框架长期不维护;未下线过期项目;
3. 管理根因:资产测绘不全,不知道内网存在这套老旧应用。
> 高频踩坑场景:
> 开发多年前写的项目,遗忘在服务器上,长期无人维护,ThinkPHP5.0、Struts2旧版本一直运行,成为突破口。
### Step3:验证漏洞复现
在**隔离靶场环境**复现漏洞:
1. 搭建对应版本框架环境
2. 重放攻击数据包,复现RCE
3. 确认利用条件:版本、组件、是否需要特定路由/请求方式
4. 验证临时缓解措施是否生效(如WAF规则、临时关闭应用)
### Step4:影响面测绘(资产排查)
对内网/域名资产批量扫描:
1. 测绘所有Web应用,识别Struts2、ThinkPHP指纹
2. 匹配版本,列出全部存在风险的站点清单
> 复盘重点:**很多企业只保护主业务系统,忽略边角附属后台、老旧Demo、测试站点,这类站点往往是突破口**
### Step5:修复方案验证
1. 根治方案:升级框架到安全版本
- Struts2:升级到最新安全版本,禁用不安全OGNL功能
- ThinkPHP:5.0升级至5.0.24+,5.1升级对应安全版本;高危直接升级6或重构
2. 临时缓解(无法立刻升级时)
- WAF添加特征拦截规则
- 防火墙限制源IP访问
- 关闭不必要的对外暴露,下线废弃项目
> ⚠️注意:WAF只是临时缓解,**不能替代版本升级**,payload变形很容易绕过
### Step6:复盘总结 + 闭环
1. 漏洞归类:第三方框架历史漏洞
2. 整改清单:高危站点限期升级/下线
3. 优化流程:
- 上线前增加组件版本扫描(SCA软件成分分析)
- 定期资产测绘,持续监控中间件/框架漏洞预警
- 漏洞情报同步,CVE爆出后立刻自查同类资产
## 四、检测特征(蓝队日志/流量检测)
### Struts2 S2-045 流量特征
POST请求,Content-Type头包含 `%{` OGNL标记
```
Content-Type: %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)...}
```
### ThinkPHP5 路由RCE特征
URL参数`s`中包含控制器方法逃逸
```
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
```
## 五、红队&蓝队易错点总结
1. 不要混淆:**框架漏洞(Struts/TP)是代码执行;中间件漏洞如Tomcat/Weblogic是容器漏洞**,两者都属于组件漏洞,但原理不同
2. 很多旧项目即使打了系统补丁,**框架本身不升级,漏洞依然存在**(系统补丁管不到Web框架代码)
3. 资产盲区是最大风险:测试站、后台管理、遗留项目,经常使用老旧ThinkPHP/Struts2,作为内网打点入口
## 六、复盘报告可用一句话总结模板
> 本次风险为Web框架历史RCE漏洞,攻击者利用老旧Struts2/ThinkPHP框架缺陷,通过构造恶意请求执行系统命令,获取Web权限;根因为遗留业务未升级框架、资产未纳入统一管理;处置方式:下线或升级框架,全网同类资产排查,增加SCA组件扫描。
---
下一段可以讲:**Shiro + Weblogic 中间件反序列化漏洞复盘**,这类也是演练高频,需要吗?
版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载或以其他方式使用本站原创内容。