关于后端:WEB安全SMTP注入

1次阅读

共计 2236 个字符,预计需要花费 6 分钟才能阅读完成。

破绽介绍

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 邮件的优先级

为了尽可能的获取实用的邮件头,应用抄送 + 密送的形式发一封邮件,查看原文,就能够看到发送的理论内容。

破绽复现

破绽环境

假如存在一个注册性能点,咱们输出邮箱后,网站给咱们发送激活链接进行注册。

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

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

修复倡议

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