首页 > 其他分享 >【WEB安全】SMTP注入

【WEB安全】SMTP注入

时间:2023-06-06 21:31:34浏览次数:27  
标签:WEB domain addr SMTP smtp com email 邮件 注入

漏洞介绍

SMTP是用于发送和传递电子邮件的协议,定义了邮件的传输方式和交流规则。

SMTP注入是指可通过添加/控制邮件头的方式,篡改邮件的发送者、抄送、密送等字段,从而达到欺骗、窃取邮件信息或劫持邮件传递的目的。

既然归属到注入类,说明也是对用户输入未严格过滤,从而达到非预期的结果。

邮件头介绍

常见邮件头代表的含义如下:

邮件头字段 含义
From 邮件的发送者
To 邮件的主要接收者
Cc 邮件的抄送接收者
Bcc 邮件的密送接收者
Subject 邮件的主题或标题
Body 邮件的正文内容
Date 邮件的发送时间
Reply-To 回复邮件时使用的地址
Importance 邮件的重要性级别
MIME-Version 邮件的MIME版本
Content-Type 邮件正文内容的类型及编码方式
Content-Disposition 邮件附件的处理方式
Message-ID 邮件的唯一标识符
In-Reply-To 针对哪封邮件进行回复的标识符
References 相关邮件的标识符列表
Return-Path 邮件的退回地址
X-Priority 邮件的优先级

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

header

漏洞复现

漏洞环境

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

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

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 = '[email protected]'
    to_addr = input("收件箱地址: ")
    to_addr = unquote(to_addr)
    # 使用示例
    from_addr = '[email protected]'
    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

复现过程

上方代码可见to_addr为收件人可控,我们将其输入为[email protected]%0aCc: [email protected]并发送

insecure

可见成功注入了SMTP邮件头Cc(抄送),此时注入的恶意邮箱[email protected]也将收到和[email protected]一样的邮件。

漏洞常见点

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

常见payload:

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

[email protected]%0ACc:[email protected]%0ABcc:[email protected]
[email protected]%0AFrom:[email protected]
From:[email protected]%0ATo:[email protected]
From:[email protected]%0ASubject:This’s%20Fake%20Subject

修复建议

  1. 输入过滤,可以使用正则表达式^[\w\.-]+@[\w\.-]+\.\w+$来过滤用用户提交的邮箱。
  2. 使用安全的组件和库,如Python的smtplib、Java的javax.mail、PHP的PHPMailer等,尽可能的通过模块内置的一些函数来设定SMTP header头。

标签:WEB,domain,addr,SMTP,smtp,com,email,邮件,注入
From: https://blog.51cto.com/u_16097306/6428155

相关文章

  • HttpURLConnection调用webservice,c#、java、python等HTTP调用webservice,简单的webserv
    以前调用webservice一般使用axis、axis2先生成java类后,直接引用,多方便。但是有的webservice接口非常的函数,生成的java类非常多,有没有一种非常简化的方法。axis2有不生成类直接调用的方法,但是QName不容易找,每次查N久不到。有的反馈,使用CXF调用一样方便,但CXF还要使用maven下载jar,而......
  • 流量劫持 —— GZIP 页面零开销注入 JS
    前言HTTP代理给页面注入JS是很常见的需求。由于上游服务器返回的页面可能是压缩状态的,因此需解压才能注入,同时为了节省流量,返回下游时还得再压缩。为了注入一小段代码,却将整个页面的流量解压再压缩,白白浪费大量性能。是否有高效的解决方案?本文从注入位置、压缩格式、校验算法......
  • nginx代理webSocket 和eventSource 相关配置
    文章转载自: https://blog.csdn.net/Embrace924/article/details/92649471nginx代理webSocket和eventSource请求超时连接不通但是本地可以nginx代理出了问题不能普通代理一样要先发起普通请求代理然后通过一些属性再次转换#常用配置location/api/{    proxy_pas......
  • webpack笔记
    webpack笔记webpack是一个现代JavaScript应用程序的静态模块打包器(modulebundler)。当webpack处理应用程序时,它会递归地构建一个依赖关系图(dependencygraph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。webpack自身只理解JavaScript......
  • Webpack5 联邦模块
    模块联邦在大型项目中,往往会把项目中的某个区域或功能模块作为单独的项目开发,最终形成「微前端」架构在微前端架构中,不同的工程可能出现下面的场景这涉及到很多非常棘手的问题:如何避免公共模块重复打包如何将某个项目中一部分模块分享出去,同时还要避免重复打包如何管理依赖的不同版......
  • 配置 webpack 的 SplitChunksPlugin
    VueCLI3构建的Vue2项目,配置webpack的SplitChunksPlugin插件,可以按照以下步骤进行操作:打开项目根目录下的vue.config.js文件(如果没有该文件,可以在根目录下创建一个)。在vue.config.js文件中添加以下内容:module.exports={configureWebpack:{optimi......
  • Google Guice 入门教程06 – Web 和 Servlet
    3Web和Servlet3.1快速开始我们从一个例子开始GuiceWeb的开发。首先准备我们的环境,由于是web开发,因此我们需要guice-servlet的jar包。log4j不是必须的,只是为了方便日志记录而已(Guice内部是使用jdk内部的logging包来完成日志记录的)。必可避免的要在web.xml中都一些手脚,这里先配......
  • nginx开启websocket
    http{map$http_upgrade$connection_upgrade{defaultupgrade;''close;}upstreamwebsocket{server192.168.100.10:8010;}server{listen8020;location/{proxy_p......
  • springboot 整合websocket
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>@ConfigurationpublicclassWebsocketConfig{@BeanpublicSe......
  • 手把手教你AspNetCore WebApi:Swagger(Api文档)
    前言小明已经实现“待办事项”的增删改查,并美滋滋向负责前端的小红介绍Api接口,小红很忙,暂时没有时间听小明介绍,希望小明能给个Api文档。对于码农小明来说能不写文档就尽量不要写,不过这也难不倒小明,他知道Swagger不仅可以自动生成Api文档,并还可以用Swagger进行接口测试。Swagger是什......