WEB安全新玩法 [4] 防护邮箱密码重置漏洞

举报
天存信息 发表于 2021/06/28 11:55:30 2021/06/28
【摘要】 「业务安全动态加固平台 · 实践系列」

大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置。这一过程容易因设计不周全而被攻击者加以利用。iFlow 业务安全加固平台可以为设计不当的应用打上动态虚拟补丁,使之防御可能的恶意利用。


以某网站为例,其邮箱密码重置功能就存在缺陷:获取验证码的邮箱和重置密码的邮箱可以不一致。攻击者能够给任意邮箱所代表的用户设置新的登录密码,从而冒充受害者登录。当然,我们也会介绍如何在不修改网站源代码的前提下,使用 iFlow 实现业务逻辑缺陷的修补。

一、原始网站

1.1 正常用户访问

在密码重置页面,正常用户「alice」在手机/邮箱中输入自己的邮箱地址,如 alice@mail.com,点击获取验证码按钮。

图1

网站为避免攻击者滥用邮件发送,弹出图形码进行验证。用户正确填写字符并确认后,网站系统后台发送邮件验证码到用户「alice」的邮件地址 alice@mail.com 中。

图2

用户进入到邮件系统中收取寄给 alice@mail.com 的邮件,将邮件中的验证码和需要重置的登录密码填写到表单中并提交。

图3

网站判断用户输入的邮箱验证码是正确的,就将 alice@mail.com 所代表的用户的登录密码设置为新的密码,操作成功。

各个实体的交互流程如下:

正常用户alice 浏览器 Web服务器 邮件系统 请求:密码重置 显示:密码重置页面 在【手机/邮箱】中填写alice 点击【获取验证码】 请求:获取图形验证码 显示:图形验证码 输入图形验证码【字符】 发送:图形验证码字符 图形验证字符正确 发送验证码邮件给alice 提示:验证码邮件已发送 以alice收取验证码邮件 输入邮箱【验证码】 输入【设置登录密码】 点击提交【确认】 请求:确认重置密码 邮件验证码正确 设置用户alice的密码 显示:重置密码成功 正常用户alice 浏览器 Web服务器 邮件系统

1.2 攻击者访问

此处,网站在重置密码的业务处理上有个逻辑缺陷:并未确保发送邮箱验证码时的邮箱地址和设置新密码时的邮箱地址是一致的。

缺陷利用方法如下:在前面的步骤中,攻击者「mallory」使用自己的邮箱 mallory@mail.com 获取验证码。

图1

在收到邮箱验证码并正确填写后,攻击者「mallory」将表单中的手机/邮箱内容改为 alice@mail.com (之前填的是 mallory@mail.com ),然后再填写新的登录密码并提交确认。

图3

网站判断用户输入的邮箱验证码是正确的,就将 alice@mail.com 所代表的用户的登录密码设置为新的密码。如此一来,攻击者「mallory」成功重设了受害者「alice」的密码,并可以使用「alice」的身份登录网站。

各个实体的交互流程如下:

攻击者mallory 浏览器 Web服务器 邮件系统 请求:密码重置 显示:密码重置页面 在【手机/邮箱】中填写mallory 点击【获取验证码】 请求:获取图形验证码 显示:图形验证码 输入图形验证码【字符】 发送:图形验证码字符 图形验证字符正确 发送验证码邮件给mallory 提示:验证码邮件已发送 以mallory收取验证码邮件 在【手机/邮箱】中填写alice 输入邮箱【验证码】 输入【设置登录密码】 点击提交【确认】 请求:确认重置密码 邮件验证码正确 设置用户alice的密码 显示:重置密码成功 攻击者mallory 浏览器 Web服务器 邮件系统

二、iFlow虚拟补丁后的网站

我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 可保存发送验证码时的邮箱地址,并在之后设置密码时将其与输入的邮箱地址作对比,发现并制止篡改行为。

2.1 正常用户访问

iFlow 在图形验证码通过时,将请求中的邮箱地址保存在 IP 存储中,在设置新密码时进行以下检查:

  1. 该 IP 进行过发送验证码的操作;
  2. 该 IP 要设置密码的邮箱地址与发送验证码时的邮箱相同。

各个实体的交互流程如下:

正常用户alice 浏览器 iFlow Web服务器 邮件系统 请求:密码重置 显示:密码重置页面 在【手机/邮箱】中填写alice 点击【获取验证码】 请求:获取图形验证码 显示:图形验证码 输入图形验证码【字符】 发送:图形验证码字符 图形验证字符正确 发送验证码邮件给alice 验证码邮件已发送 阻止请求 记录邮箱地址到the_mail 提示:验证码邮件已发送 alt [the_mail不为空] [the_mail为空] 以alice收取验证码邮件 输入邮箱【验证码】 输入【设置登录密码】 点击提交【确认】 请求:确认重置密码 the_mail和accounts参数:一致 清空the_mail 请求:确认重置密码 邮件验证码正确 设置用户alice的密码 重置密码成功 正常用户alice 浏览器 iFlow Web服务器 邮件系统

2.2 攻击者访问

如前所示,攻击者在收到邮箱验证码之后,且未提交重设密码之前,修改了邮箱地址。iFlow 会检查到这个变化,依此可判断这是一个攻击者在访问,于是终止此过程,不会让系统后端真正去修改受害者的登录密码。

攻击者的 HTTP 协议交互过程如下:

攻击者mallory 浏览器 iFlow Web服务器 邮件系统 请求:密码重置 显示:密码重置页面 填写mallory到【手机/邮箱】 点击【获取验证码】 请求:获取图形验证码 显示:图形验证码 输入图形验证码【字符】 发送:图形验证码字符 图形验证字符正确 发送验证码邮件给mallory 验证码邮件已发送 阻止请求 记录邮箱地址到the_mail 提示验证码邮件已发送 alt [the_mail不为空] [the_mail为空] 以mallory收取验证码邮件 填写alice到【手机/邮箱】 输入邮箱【验证码】 输入【设置登录密码】 点击提交【确认】 请求:确认重置密码 the_mail和accounts参数:不一致 终止过程 攻击者mallory 浏览器 iFlow Web服务器 邮件系统

2.3 代码

iFlow 内置的 W2 语言是一种专门用于实现 Web 应用安全加固的类编程语言。它介于配置和通用语言之间,具备编程的基本要素和针对 HTTP 协议的特有扩展,能为业务系统编写涉及复杂判断和动态修改的逻辑。

考虑到安全产品的使用者通常为非程序员,他们习惯面对配置文件而非一段代码。因此,W2 语言虽包含语言要素,仍以规则文件方式呈现,并采用可以体现层次结构和方便词法校验的 JSON 格式。

用 W2 语言实现上述虚拟补丁的代码如下:

[
	{	
		"if": [
			"streq(REQUEST_FILENAME, '/shopx/index.php')",
			"streq(@ARGS.s, '/index/user/forgetpwdverifysend.html')"
		],
		"then": {
			"if": "REAL_IP.the_mail",
			"then": {
				"verdict": {
					"action": "deny",
					"log": "There is a user having reset password."
				}
			},
			"else": {
				"if": "contain(RESPONSE_BODY, '\"code\":0,')",
				"then": {
					"execution": "REAL_IP.the_mail@120=@ARGS.accounts"
				}
			}
		}
	},
	{
		"if": [
			"streq(REQUEST_FILENAME, '/shopx/index.php')",
			"streq(@ARGS.s, '/index/user/forgetpwd.html')"
		],
		"then": {
			"if": {
				"or": [
					"!REAL_IP.the_mail",
					"strne(@ARGS.accounts, REAL_IP.the_mail)"
				]
			},
			"then": {
				"verdict": {
					"action": "deny",
					"log": "Invalid ${@ARGS.accounts} access"
				}
			},
			"else": {
				"execution": "REAL_IP.the_mail=null"
			}
		}
	}
]

示例代码中有两条规则,分别作用如下:

第一条规则

当服务器返回图形验证结果时,iFlow 拦截此响应。如果在同一个访问端 IP 上已经在进行重置密码操作,则终止这次操作 (避免重复及交叉操作);否则当验证结果为通过时,在访问者 IP (REAL_IP) 中创建存储变量 the_mail ,其值为用户输入邮箱地址。

第二条规则

当浏览器请求确认重置密码时,iFlow 拦截此请求。iFlow检查请求参数 accounts 与访问者 IP (REAL_IP) 中存储变量 the_mail 是否相等:如果相等则清除 the_mail ,以开放此访问者 IP 上的重置密码业务;如果不相等则阻止该用户的继续操作。

注意:上述会话中的 the_mail 是保存在服务器端的 iFlow 存储中的,攻击者在浏览器端是看不到数据更无法进行修改的。


三、总结

iFlow 使用两条规则在不修改服务器端代码的前提下,透明地保证了重置密码时邮箱地址的一致性。从这个例子中我们可以看到,iFlow 适合构造前后报文相关联的复杂防护逻辑。(张戈 | 天存信息)

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。