SMTP命令注入漏洞分析报告
漏洞概述
成功复现了curl中的SMTP命令注入漏洞,攻击者通过在电子邮件地址中使用回车和换行字符(\r\n
)可以注入任意SMTP命令。
已确认的漏洞
1. MAIL FROM注入
描述:通过–mail-from参数使用bash ANSI C引用进行注入 影响:允许在MAIL FROM之后注入额外的SMTP命令
2. RCPT TO注入
描述:通过–mail-rcpt参数使用bash ANSI C引用进行注入 影响:允许在RCPT TO之后注入额外的SMTP命令
3. EXPN路径注入
描述:通过EXPN请求中的–mail-rcpt参数进行注入 影响:允许在EXPN操作中注入额外的SMTP命令
测试环境搭建
SMTP服务器设置
|
|
复现步骤
步骤1:MAIL FROM注入
|
|
预期结果:
- curl发送:MAIL FROM:attacker@local
- curl发送:RCPT TO:pwn@local SIZE=213(注入的命令)
- curl发送:RCPT TO:victim@local(预期命令)
步骤2:RCPT TO注入
|
|
预期结果:
- curl发送:RCPT TO:victim@local(预期命令)
- curl发送:VRFY postmaster>(注入的命令)
步骤3:EXPN路径注入
|
|
预期结果:
- curl发送:EXPN listname(预期命令)
- curl发送:VRFY postmaster(注入的命令)
证据
SMTP服务器日志
SMTP服务器日志清楚地显示了注入的命令:
|
|
curl跟踪输出
--trace-ascii
输出显示了发送的确切字节:
|
|
影响评估
严重程度:高 攻击向量:网络 身份验证:无需 用户交互:无需 影响范围:所有支持SMTP的curl版本
缓解措施
- 输入验证:清理电子邮件地址,移除
\r\n
字符 - 参数编码:正确转义SMTP参数中的特殊字符
- 协议合规性:确保SMTP命令格式正确
创建的文件
smtp_server.py
- 用于测试的Python SMTP服务器Dockerfile.smtp
- SMTP服务器的Docker配置SMTP_INJECTION_REPORT.md
- 本报告
讨论记录
bagder curl staff:攻击者是如何将换行符插入参数的?
giant_anteater:通过向curl/libcurl提供原始CRLF(例如,通过–mail-from/–mail-rcpt或CURLOPT_MAIL_FROM/RCPT),curl会逐字发送;由于SMTP使用CRLF作为命令分隔符,\r\n
之后的所有内容都会被解析为新命令。
bagder curl staff:用户为什么要在那里放置CRLF,他们期望它做什么?
dfandrich curl staff:复现步骤向–mail-from提供了无效值,这违反了文档规定,所以是垃圾进垃圾出(GIGO)。这在libcurl-security.md的"任意标头"部分也有警告。
最终状态:报告被标记为"不适用",不被视为安全问题。