BlackHat 2018 | 看Orange Tsai如何利用四个Bug实现亚马逊协同平台的RCE漏洞
字数 1635 2025-08-18 11:37:33
亚马逊协同平台RCE漏洞分析与利用教学文档
漏洞背景
该漏洞由台湾白帽Orange Tsai(蔡政达)在Black Hat USA 2018上披露,通过综合利用4个功能性Bug实现了对亚马逊(Amazon)协同平台系统的远程代码执行(RCE)。漏洞核心在于路径解析器和规范化之间的"不一致性"安全问题。
漏洞环境
- 目标系统:corp.amazon.com (亚马逊内部协同系统)
- 基础框架:基于开源项目Nuxeo构建
- 相关技术栈:
- Java生态系统
- Seam框架(JBoss的web框架)
- Tomcat Servlet容器
四个关键Bug分析
Bug 1: 路径规范化错误导致的ACL绕过
漏洞点:
- Nuxeo使用
NuxeoAuthenticationFilter进行验证,通过bypassAuth方法实现白名单机制 getRequestedPage方法从HttpServletRequest.RequestURI提取请求页面时,错误处理了URL路径参数
问题代码:
protected static String getRequestedPage(HttpServletRequest httpRequest) {
String requestURI = httpRequest.getRequestURI();
String context = httpRequest.getContextPath();
String requestedPage = requestURI.substring(context.length());
int i = requestedPage.indexOf(';');
return i == -1 ? requestedPage : requestedPage.substring(0, i);
}
利用方式:
- 构造包含分号的URL路径参数绕过ACL检查
- 示例:
https://collaborate-corp.amazon.com/nuxeo/login.jsp;/..;/[unauthorized_area]
Bug 2: Seam框架的表达式调用功能
漏洞点:
- Seam框架的
actionMethod参数可以调用JBoss表达式语言(EL) - 调用条件:
- 参数值必须是
FILENAME:EL_CODE格式 - FILENAME必须是context-root下的真实文件
- 文件中必须包含
#{EL_CODE}
- 参数值必须是
利用限制:
- 无法直接控制context-root下的任意文件
- 只能调用已有文件中的表达式
Bug 3: 二次评估导致的EL注入
漏洞点:
- 如果Bug 2返回的字符串看起来像表达式,Seam框架会再次调用
- 类似于ROP(返回导向编程)技术
关键组件:
widgets/suggest_add_new_directory_entry_iframe.xhtml中的:<nxu:set var="directoryNameForPopup" value="#{request.getParameter('directoryNameForPopup')}" cache="true">
利用方式:
- 通过
directoryNameForPopup参数注入第二阶段Payload - PoC结构:
http://host/nuxeo/login.jsp;/..;/create_file.xhtml?actionMethod=widgets/suggest_add_new_directory_entry_iframe.xhtml:request.getParameter('directoryNameForPopup')&directoryNameForPopup=/?#{HERE_IS_THE_EL}
Bug 4: 绕过表达式黑名单
黑名单内容:
- Seam 2.2.2.Final后加入了表达式黑名单(blacklist.properties):
.getClass( .class. .addRole( .getPassword( .removeRole(
绕过方法:
- 使用数组操作符替代点操作符:
- 原表达式:
"".getClass().forName("java.lang.Runtime") - 绕过表达式:
""["class"].forName("java.lang.Runtime")
- 原表达式:
完整利用链
- ACL绕过:利用路径规范化错误绕过身份验证
- 未授权访问:访问Seam servlet功能
- 表达式调用:通过
actionMethod参数调用suggest_add_new_directory_entry_iframe.xhtml组件 - EL注入:通过
directoryNameForPopup参数注入第二阶段Payload - 黑名单绕过:使用数组操作符绕过表达式限制
- RCE实现:使用Java反射API执行任意命令
漏洞修复方案
JBoss/Seam官方
- 官方未修复,认为Seam已进入生命周期末期
- 建议升级到不使用Seam的新版本
Amazon
- 快速隔离存在漏洞的服务器
- 实施临时缓解措施
Nuxeo
- 发布8.10补丁
- 修复方式:覆盖
callAction()方法
教学总结
该漏洞利用展示了如何通过组合多个看似不严重的问题实现高危漏洞。关键学习点:
- 路径规范化不一致性:不同组件对URL解析的差异可能被利用
- 表达式语言注入:EL表达式的滥用是Java应用中常见问题
- 黑名单绕过技巧:使用替代语法绕过简单字符串匹配
- 漏洞链利用:组合多个低危问题实现高危利用
防御建议
- 统一路径规范化处理逻辑
- 避免使用表达式语言处理用户输入
- 使用白名单而非黑名单进行输入过滤
- 及时更新框架和组件
- 对关键功能实施多层防御措施