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


某网站系统在用户重置密码时,需进行算术题人机识别验证,再进入邮箱验证码验证环节,通过后才能真正地重置密码。由于程序设计不当,攻击者可以输入任意受害者账号,并正常完成算术题验证后,直接绕过邮箱验证码验证过程,进入到重置受害者密码的环节。我们接下来会看到如何利用 iFlow 来防范这类流程绕过。

一、原始网站

1.1 正常用户访问

用户进入登录页面,点击找回密码链接。

在第一步确认账号页面中输入用户名和算术题验证码。

正确提交答案后,网站向用户的注册邮箱发送验证码。用户进入第二步进行安全验证的页面,用户将邮件中的验证码在页面中输入。

邮件验证码正确,则用户可在第三步设置新密码中重置密码。

HTTP 交互流程如下:

sequenceDiagram
participant 正常用户
participant 浏览器
participant Web服务器
participant 邮件系统
正常用户->>浏览器: 点击找回密码链接
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>正常用户: 显示:第一步页面
正常用户->>浏览器: 填写用户名和算术题验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step1,username=test01
Web服务器->>邮件系统: 发送验证码到邮箱
Web服务器->>正常用户: 显示:第二步页面
正常用户->>邮件系统: 以test01收取验证码
正常用户->>浏览器: 填写邮箱验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step2,yzm=338238
Note over Web服务器: 验证邮箱验证码正确
Web服务器->>正常用户: 显示:第三步页面
正常用户->>浏览器: 填写新的密码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step3,password=123456
Web服务器->>正常用户: 显示:设置新密码成功

1.2 攻击者访问

攻击者使用 Burpsuite 工具作为浏览器和 Web 服务器之间的代理,Burpsuite 可以拦截报文并修改其中内容后再发出。

攻击者在第一步确认账号页面中填写受害者的账号和正确的算术题验证码并点击下一步。

然后,点击浏览器的回退按钮回到上述页面,打开 Burpsuite 的拦截开关,重新填写信息,并点击下一步。攻击者可以在 Burpsuite 看到发出的第一步请求报文。

攻击者在 Burpsuite 中将请求体内容修改为第三步的报文,发往网站服务器。

攻击者在浏览器中可以看到密码重置成功的提示。

至此,攻击者在未访问受害者邮箱的情况下,顺利修改了受害者的密码。

HTTP 交互流程如下:

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant Web服务器
participant 邮件系统
攻击者->>浏览器: 点击找回密码链接
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>攻击者: 显示:第一步页面
攻击者->>浏览器: 填写用户名和算术题验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step1,username=test01
Web服务器->>邮件系统: 发送验证码到邮箱
Web服务器->>攻击者: 显示:第二步页面
攻击者->>浏览器: 点击回退按钮
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>攻击者: 显示:第一步页面
攻击者->>浏览器: 填写用户名和算术题验证码
浏览器->>攻击工具: POST /one/getpassword.php<br/>action=step1,username=test01
rect rgb(250, 128, 128)
Note over 攻击工具: 将请求修改成第三步报文
end
攻击工具->>Web服务器: POST /one/getpassword.php<br/>action=step3,password=123456
Web服务器->>攻击者: 显示:设置用户密码成功

二、iFlow虚拟补丁后的网站

我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 在进行第三步操作时,检查了第二步操作中所作的记号,确保操作无法绕过第二步直接进入第三步。

2.1 正常用户访问

在第二步邮箱验证码返回正确信息时,iFlow 给会话设置一个第二步完成标志。在第三步提交新密码时,iFlow 会检查第二步完成标志,如果这个标志存在,则将请求发到后端 Web 服务器进行正常处理。

正常用户的 HTTP 交互流程如下:

sequenceDiagram
participant 正常用户
participant 浏览器
participant iFlow
participant Web服务器
participant 邮件系统
正常用户->>浏览器: 点击找回密码链接
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>正常用户: 显示:第一步页面
正常用户->>浏览器: 填写用户名和算术题验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step1,username=test01
Web服务器->>邮件系统: 发送验证码到邮箱
Web服务器->>正常用户: 显示:第二步页面
正常用户->>邮件系统: 以test01收取验证码
正常用户->>浏览器: 填写邮箱验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step2,yzm=338238
Note over Web服务器: 验证邮箱验证码正确
Web服务器->>iFlow: 返回:第二步页面
rect rgb(160, 250, 160)
Note over iFlow: 设置第二步完成标志
end
iFlow->>正常用户: 显示:第二步页面
正常用户->>浏览器: 填写新的密码
浏览器->>iFlow: POST /one/getpassword.php<br/>action=step3,password=123456
rect rgb(160, 250, 160)
Note over iFlow: 检查第二步完成标志:存在
end
iFlow->>Web服务器: 原请求报文
Web服务器->>正常用户: 显示:设置新密码成功

2.2 攻击者访问

如前所示,如果攻击者直接将第二步请求的报文修改为第三步请求的报文发出,iFlow 会拦截这个报文并检查第二步完成标志。由于攻击者没有实际完成第二步操作,因此也就没有第二步完成标志,iFlow 不会继续向后端 Web 服务器执行密码重置操作。

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

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant iFlow
participant Web服务器
攻击者->>浏览器: 点击找回密码链接
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>攻击者: 显示:第一步页面
攻击者->>浏览器: 填写用户名和算术题验证码
浏览器->>Web服务器: POST /one/getpassword.php<br/>action=step1,username=test01
Web服务器->>攻击者: 显示:第二步页面
攻击者->>浏览器: 点击回退按钮
浏览器->>Web服务器: GET /one/getpassword.php
Web服务器->>攻击者: 显示:第一步页面
攻击者->>浏览器: 填写用户名和算术题验证码
浏览器->>攻击工具: POST /one/getpassword.php<br/>action=step1,username=test01
rect rgb(250, 128, 128)
Note over 攻击工具: 修改成第三步请求
end
攻击工具->>iFlow: POST /one/getpassword.php<br/>action=step3,password=123456
rect rgb(160, 250, 160)
Note over iFlow: 第二步完成标志:不存在
end
iFlow->>攻击者: 显示:访问被拒绝

2.3 代码

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

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

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

[
{
"if": [
"REQUEST_FILENAME == '/ajax/yzm_check_ajax.php'",
{
"variable": "RESPONSE_BODY",
"operator": "contain",
"pattern": "window.document.userreg.yzm_mobile2.value='yes'"
}
],
"then": "SESSION.step2_ok@300 = true"
},
{
"if": [
"REQUEST_METHOD == 'POST'",
"REQUEST_FILENAME == '/one/getpassword.php'",
"@ARGS.action == 'step3'"
],
"then": {
"if": "SESSION.step2_ok",
"then": "SESSION.step2_ok=null",
"else": {
"execution": "SESSION.step2_ok=null",
"verdict": {
"action": "deny",
"log": "invalid access step3!"
}
}
}
}
]

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

第一条规则

当服务器在第二步操作返回邮箱验证码成功时,iFlow 拦截此响应。并且,iFlow 将创建一个会话 (SESSION) 的存储变量 step2_oktrue

第二条规则

当浏览器请求第三步操作即确认重置密码时,iFlow 拦截此请求。iFlow 将检查会话 (SESSION) 的存储变量 step2_ok 是否存在:如果存在则放行,不存在则拒绝访问。不管哪种情形,存储变量 step2_ok 都会被清除,以防止第三步被重复单独访问。

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

三、总结

iFlow 使用两条规则在不修改服务器端代码的前提下,保证了顺序操作中的关键环节不被绕过。

此外,我们注意到,关键环节的完成判断是以响应内容作为依据而非以发起请求作为依据的,这样可以避免攻击者随手发出一个不成功的操作来欺骗 iFlow。当然,这样做的前提是 iFlow 具备强大的响应报文识别能力。(张戈 | 天存信息)

WEB安全新玩法 [9] 重置密码之验证流程防绕过的更多相关文章

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

    大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置.这一过程容易因设 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 自定义 checkbox 新玩法 ?

    自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...

随机推荐

  1. 【NX二次开发】NX内部函数,查找内部函数的方法

    [NX二次开发]NX内部函数,libufunx.dll文件中的内部函数 [NX二次开发]NX内部函数,libugui.dll文件中的内部函数 [NX二次开发]NX内部函数,libuifw.dll文件中 ...

  2. 【读书笔记】《C语言 从入门到精通》(第三版)笔记

    C语言,上学的时候都没学好,没想到现在却靠它吃饭.因为对C语言还是比较熟悉,所以买这本书是用来当"字典"用的.所以下面的笔记不会有很基础的内容. 1.书籍介绍 2.结构体 3.[C ...

  3. vue3.0搭建项目

    安装node.js 查看版本node -v 安装vue3.0版本之前需要先把vue-cli升级到4.0版本, 如果之前安装过vue-cli需要把2.0相关的卸载之后重新安装,npm uni -g vu ...

  4. 手把手使用Python语音识别,进行语音转文字

    0. 太长不看系列,直接使用 在1.2官网注册后拿到APISecret和APIKey,直接复制文章2.4demo代码,确定音频为wav格式,采样率为16K,在命令行执行 python single_s ...

  5. 孟老板 Paging3 (二) 结合Room

    BaseAdapter系列 ListAdapter系列 Paging3 (一) 入门 Paging3 (二) 结合 Room Paging3 (二)  结合Room Paging 数据源不开放, 无法 ...

  6. linux 下安装 docker 环境

    一分钟了解 Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...

  7. WIN10安装并汉化PLSQL

    WIN10安装并汉化PLSQL 安装文件 链接:https://pan.baidu.com/s/12BBEaFQ8G5LztJmCKgnh1w 提取码:96nx 一.安装 1.双击plsqldev.e ...

  8. 限流神器Sentinel,不了解一下吗?

    概述 书接上回:你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现.在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中.给大伙细细讲解一下 Sentine ...

  9. 应用CRM的自动化功能为什么备受推崇

    相信每个销售团队都遇到过这样的问题:在跟进新客户的时候顾此失彼,在跟踪一个客户的时候,转眼就忘记了另一个客户.这种情况很常见,但是每个新客户都有潜在的价值,我们该如何做,才能避免错失商机?CRM客户管 ...

  10. Tomcat:tomcat部署war包配置SSL访问

    Linux-CentOS7部署 war放置 war放到tomcat的webapps目录内 修改配置 修改tomcat的server.xml文件 HTTP: 找到Connector元素,修改端口 HTT ...