前言 CVE-2019-19844 是Django重置密码功能的一个漏洞。 Django的密码重置表单使用不区分大小写的查询来获取输入的邮箱地址对应的账号。 一个知道邮箱地址和账号对应关系的攻击者可以精心构造一个和该账号邮箱地址不同,但经过Unicode大小写转换后相同的邮箱地址,来接收该账户的密码重置邮件,从而实现账户劫持的攻击目标。 本文较为详细地记录了该漏洞的复现过程,简要分析了漏洞成因,讨论了攻击所需的条件。 复现 基于Python 3.6.0,Django 3.0.0和MariaDB 10.4.11复现漏洞。
准备环境
首先安装Python 3.6.0和MariaDB 10.4.11,然后安装有漏洞的Django版本3.0.0:
pip install django==3.0.0
全部安完后创建数据库
cve_2019_19844_test
:
MariaDB [(none)]> CREATE DATABASE cve_2019_19844_test;
新建Django项目
cve_2019_19844_test
:
django-admin startproject cve_2019_19844_test
需对项目
cve_2019_19844_test
的配置文件
setting.py
做一些修改。 将
LANGUAGE_CODE
为
zh-hans
,这样Django就会显示汉语界面了。 修改数据库相关配置为使用MariaDB:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cve_2019_19844_test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
}
}
在文件末尾添加发送邮件相关的配置,示例如下。
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.qq.com' # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = 'xxx@qq.com' # 帐号
EMAIL_HOST_PASSWORD = 'p@ssw0rd' # 密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
<