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


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

一、原始网站

1.1 正常用户访问

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

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

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

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

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

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

1.2 攻击者访问

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

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

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

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

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

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

二、iFlow虚拟补丁后的网站

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

2.1 正常用户访问

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

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

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

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

2.2 攻击者访问

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

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

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

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 适合构造前后报文相关联的复杂防护逻辑。(张戈 | 天存信息)

WEB安全新玩法 [4] 防护邮箱密码重置漏洞的更多相关文章

  1. WEB安全新玩法 [3] 防护交易数据篡改

    在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...

  2. WEB安全新玩法 [10] 防范竞争条件支付漏洞

    服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞.攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商 ...

  3. WEB安全新玩法 [1] 业务安全动态加固平台

    近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...

  4. WEB安全新玩法 [9] 重置密码之验证流程防绕过

    一般来说,业务流程中出现多个操作环节时,是需要顺序完成的.程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作.iFlow 业务安全加固平台能够在 ...

  5. WEB安全新玩法 [6] 防范图形验证码重复使用

    在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...

  6. WEB安全新玩法 [2] 防范前端验证绕过

    用户登录,几乎是所有 Web 应用所必须的环节.Web 应用通常会加入一些验证手段,以防止攻击者使用机器人自动登录,如要求用户输入图形验证码.拖动滑动条等.但是,如果验证的逻辑仅仅在前端执行,是很容易 ...

  7. WEB安全新玩法 [8] 阻止订单重复提交

    交易订单的重复提交虽然通常不会直接影响现金流和商品流,但依然会给网站运营方带来损害,如消耗系统资源.影响正常用户订单生成.制造恶意用户发起纠纷的机会等.倘若订单对象是虚拟商品,也有可能造成实际损失.订 ...

  8. WEB安全新玩法 [5] 防范水平越权之查看他人订单信息

    水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源.水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷.iFlow 业务安全加固平台可以缓解部分场景下的水平越权 ...

  9. 【转帖】Moodle平台的5个新玩法

    [玩坏Moodle平台]Moodle平台的5个新玩法 1.RSS订阅 Moodle平台可以导入外部博客(或其他提供RSS的服务),并显示在Moodle内置的博客系统中.无论是自己的个人网站还是他人的博 ...

随机推荐

  1. 手把手教你看MySQL官方文档

    前言: 在学习和使用MySQL的过程中,难免会遇到各种问题.不知道当你遇到相关问题时会怎么做,我在工作或写文章的过程中,遇到不懂或需要求证的问题时通常会去查阅官方文档.慢慢的,阅读文档也有了一些经验, ...

  2. 熟悉 Bash 快捷键来提高效率

    Bash是GNU计划的一部分,是多数Linux发行版提供的默认Shell. Linux的精髓就在于命令行的高效,而学习命令行的第一步便是学习如何快速地输入命令. 其实包括Bash在内的多数Linux ...

  3. 如何通过在线CRM提升企业竞争力?

    随着信息技术的快速发展,在线CRM系统也得到了更加广泛的应用,已经在企业中逐渐开始普及.CRM系统对于优化企业流程有着十分重要的意义,它能够让企业的经营管理更加敏捷,并且可以快速地响应企业的业务流程. ...

  4. ES6学习-0 前言

    本菜鸟做了二十来年的程序开发了,前后台都写过,队伍也带过.大约是2000年左右,是用dephi 写后台CGI,所有的html,js,css基本都是混在CGI里输出到前台的,那时也没有明确的前后台的概念 ...

  5. too much recursion

    今天在火狐浏览器上调试swagger接口遇到一个浏览器报错: too much recursion 刚开始以为接口出问题了,但是调试之后发现,后台有数据返回,往下一拉,看到了差不多两千多条数据,一下子 ...

  6. [bug] Shell:paths must precede expression

    参考 https://www.cnblogs.com/peter1994/p/7297656.html

  7. 联想RD350板载RAID110i,安装CentOS 7 不识别RAID设备

    联想RD350板载RAID110i,安装CentOS 7 不识别RAID设备   情况如题所述. 1. 确认BIOS中 Boot mode为[UEFI]或者[AUTO] 2. 确认BIOS中 Stor ...

  8. Docker Swarm(八)滚动更新、回滚服务

    滚动更新.回滚服务 默认情况下, swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过: # 定义并行更新的副本数量--update-parallelism# 定义滚动更新的时间间 ...

  9. Linux创建RAID0_实战

    Linux创建RAID实战 一.Linux创建RAID0 RAID0俗称条带,它将两个或多个硬盘组成一个逻辑硬盘,容量是所有硬盘之和 因为是多个硬盘组合成一个,故可并行写操作,写入速度提高,但此方式硬 ...

  10. Windows(受控主机)上配置

    Powershell版本要求及配置 windows需要使用Powershell4.0及以上版本,入下图所示,如果不是4.0及以上的需要升级 一.升级Powershell至3.0+ 1. 下载并安装Mi ...