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)
  • 调用条件:
    1. 参数值必须是FILENAME:EL_CODE格式
    2. FILENAME必须是context-root下的真实文件
    3. 文件中必须包含#{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")

完整利用链

  1. ACL绕过:利用路径规范化错误绕过身份验证
  2. 未授权访问:访问Seam servlet功能
  3. 表达式调用:通过actionMethod参数调用suggest_add_new_directory_entry_iframe.xhtml组件
  4. EL注入:通过directoryNameForPopup参数注入第二阶段Payload
  5. 黑名单绕过:使用数组操作符绕过表达式限制
  6. RCE实现:使用Java反射API执行任意命令

漏洞修复方案

JBoss/Seam官方

  • 官方未修复,认为Seam已进入生命周期末期
  • 建议升级到不使用Seam的新版本

Amazon

  • 快速隔离存在漏洞的服务器
  • 实施临时缓解措施

Nuxeo

  • 发布8.10补丁
  • 修复方式:覆盖callAction()方法

教学总结

该漏洞利用展示了如何通过组合多个看似不严重的问题实现高危漏洞。关键学习点:

  1. 路径规范化不一致性:不同组件对URL解析的差异可能被利用
  2. 表达式语言注入:EL表达式的滥用是Java应用中常见问题
  3. 黑名单绕过技巧:使用替代语法绕过简单字符串匹配
  4. 漏洞链利用:组合多个低危问题实现高危利用

防御建议

  1. 统一路径规范化处理逻辑
  2. 避免使用表达式语言处理用户输入
  3. 使用白名单而非黑名单进行输入过滤
  4. 及时更新框架和组件
  5. 对关键功能实施多层防御措施
亚马逊协同平台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路径参数 问题代码 : 利用方式 : 构造包含分号的URL路径参数绕过ACL检查 示例: 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 中的: 利用方式 : 通过 directoryNameForPopup 参数注入第二阶段Payload PoC结构: Bug 4: 绕过表达式黑名单 黑名单内容 : Seam 2.2.2.Final后加入了表达式黑名单(blacklist.properties): 绕过方法 : 使用数组操作符替代点操作符: 原表达式: "".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应用中常见问题 黑名单绕过技巧 :使用替代语法绕过简单字符串匹配 漏洞链利用 :组合多个低危问题实现高危利用 防御建议 统一路径规范化处理逻辑 避免使用表达式语言处理用户输入 使用白名单而非黑名单进行输入过滤 及时更新框架和组件 对关键功能实施多层防御措施