email.errors.HeaderParseError:标头值似乎包含嵌入标头:

Kar*_*ela 6 python security code-injection mime-types

我正在尝试使用 Office api 使用肥皂消息恢复邮件,但某些邮件出现“标头值似乎包含嵌入式标头”错误。例如。

msg = MIMEMultipart()
msg['From'] = 'me@locmsglhost\r\nSubject: injected subject'
msg.as_string()
Run Code Online (Sandbox Code Playgroud)

抛出错误,如 email.errors.HeaderParseError: 标头值似乎包含嵌入的标头: 'me@locmsglhost\nSubject: 注入的主题'

但如果我将 msg['From'] 更改为

'hello\r man: man'
'tya: Hello'
'push@#$\r\nPus'
'Hello \n\r Pushpa: World'
'@\r\nhello : World'
Run Code Online (Sandbox Code Playgroud)

然后它就按预期工作了。

可能的原因是什么?mime 消息中会存在哪些类型的漏洞?

MT-*_*ong 2

您不能随心所欲地使用任何标头,这是禁止的。

如文档中所述,

异常 email.errors.HeaderParseError

...当尝试创建一个似乎包含嵌入标头的标头时(也就是说,应该是一个没有前导空格且看起来像标头的连续行)。


为什么它很危险并且应该妥善处理?

首先,您可以阅读本文,它提供了一个如何进行 SMTP 标头注入攻击的简单示例。

你可能会问怎么才能做到呢?我的意思是你不允许任何人编辑你的后端,对吗?

让我们想象一下,对于您的应用程序,可能会有用户输入的某些字段,例如'message'

msg['message'] = 'abc' #Entered by user
Run Code Online (Sandbox Code Playgroud)

没关系,但是如果

msg['message'] = 'abc\r\nreplyTo:attacker@hello.com'
#or
msg['message'] = 'abc\r\nTo:attacker@hello.com'
Run Code Online (Sandbox Code Playgroud)

攻击者可以轻松覆盖您的电子邮件,例如发送垃圾邮件。这就是为什么它会为您进行检查。


您甚至可以通过以下方式检查标头是否安全

email.header.Header('string')
Run Code Online (Sandbox Code Playgroud)

让我们看看 python 电子邮件库是如何进行检查的。

在源码中搜索,Lib/email/header.py

在 ln50-52 中:

# Find a header embedded in a putative header value.  Used to check for
# header injection attack.
_embedded_header = re.compile(r'\n[^ \t]+:')
Run Code Online (Sandbox Code Playgroud)

你可以尝试一下,除了你说的那个之外,你提供的所有例子都可以通过。

由于电子邮件的标头结构始终如此\n(key_without_space):,所以\nhello :通过但不通过\nhello: