WEB安全新玩法 [9] 重置密码之验证流程防绕过
一般来说,业务流程中出现多个操作环节时,是需要顺序完成的。程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作。iFlow 业务安全加固平台能够在不修改网站程序的情况下,强制流程的顺序执行。
某网站系统在用户重置密码时,需进行算术题人机识别验证,再进入邮箱验证码验证环节,通过后才能真正地重置密码。由于程序设计不当,攻击者可以输入任意受害者账号,并正常完成算术题验证后,直接绕过邮箱验证码验证过程,进入到重置受害者密码的环节。我们接下来会看到如何利用 iFlow 来防范这类流程绕过。
一、原始网站
1.1 正常用户访问
用户进入登录页面,点击找回密码链接。
在第一步确认账号页面中输入用户名和算术题验证码。
正确提交答案后,网站向用户的注册邮箱发送验证码。用户进入第二步进行安全验证的页面,用户将邮件中的验证码在页面中输入。
邮件验证码正确,则用户可在第三步设置新密码中重置密码。
HTTP 交互流程如下:
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 交互流程如下:
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 交互流程如下:
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 协议交互过程如下:
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_ok
为 true
。
第二条规则
当浏览器请求第三步操作即确认重置密码时,iFlow 拦截此请求。iFlow 将检查会话 (SESSION) 的存储变量 step2_ok
是否存在:如果存在则放行,不存在则拒绝访问。不管哪种情形,存储变量 step2_ok
都会被清除,以防止第三步被重复单独访问。
注意:上述会话中的
step2_ok
是保存在服务器端的 iFlow 存储中的,攻击者在浏览器端是看不到数据更无法进行修改的。
三、总结
iFlow 使用两条规则在不修改服务器端代码的前提下,保证了顺序操作中的关键环节不被绕过。
此外,我们注意到,关键环节的完成判断是以响应内容作为依据而非以发起请求作为依据的,这样可以避免攻击者随手发出一个不成功的操作来欺骗 iFlow。当然,这样做的前提是 iFlow 具备强大的响应报文识别能力。(张戈 | 天存信息)
WEB安全新玩法 [9] 重置密码之验证流程防绕过的更多相关文章
- WEB安全新玩法 [4] 防护邮箱密码重置漏洞
大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置.这一过程容易因设 ...
- WEB安全新玩法 [1] 业务安全动态加固平台
近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...
- WEB安全新玩法 [6] 防范图形验证码重复使用
在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...
- WEB安全新玩法 [2] 防范前端验证绕过
用户登录,几乎是所有 Web 应用所必须的环节.Web 应用通常会加入一些验证手段,以防止攻击者使用机器人自动登录,如要求用户输入图形验证码.拖动滑动条等.但是,如果验证的逻辑仅仅在前端执行,是很容易 ...
- WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...
- WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源.水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷.iFlow 业务安全加固平台可以缓解部分场景下的水平越权 ...
- WEB安全新玩法 [8] 阻止订单重复提交
交易订单的重复提交虽然通常不会直接影响现金流和商品流,但依然会给网站运营方带来损害,如消耗系统资源.影响正常用户订单生成.制造恶意用户发起纠纷的机会等.倘若订单对象是虚拟商品,也有可能造成实际损失.订 ...
- WEB安全新玩法 [10] 防范竞争条件支付漏洞
服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞.攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商 ...
- 自定义 checkbox 新玩法 ?
自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...
随机推荐
- (鸡汤文)这一次我终于搞懂了 JavaScript 定时器的 this 指向!
开篇语 忽然有一种感觉,每次学习一个知识点就像是谈一场恋爱:从初次邂逅,到彼此了解,一切都那么的符合恋爱的过程! 如果这个知识点再有点"调皮"的话,那简直是让人欲仙欲死而又不可自拔 ...
- Nginx为什么快到根本停不下来?
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器. 图片来自 Pexels Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资 ...
- 实现一个带有动效的 React 弹窗组件
我们在写一些 UI 组件时,若不考虑动效,就很容易实现,主要就是有无的切换(类似于 Vue 中的 v-if 属性)或者可见性的切换(类似于 Vue 中的 v-show 属性). 1. 没有动效的弹窗 ...
- Waymo object detect 2D解决方案论文拓展
FixMatch 半监督中的基础论文,自监督和模型一致性的代表作. Consistency regularization: 无监督学习的方式,数据\(A\)和经过数据增强的\(A\)计做\(A'\) ...
- java面试技巧及层次。
不断的积累,从打算找工作之日起,就要坚持在每天闲暇之余学习其中几道题目,日积月累,等到出去面试时,一切都水到渠成,面试时就自然会游刃有余了. 答题时,先答是什么,再答有什么作用和要注意什么,这里给人的 ...
- uniapp 微信小程序 打开文件
uni.downloadFile({ url: item.url, success: (res) => { if (res.statusCode === 200) { uni.openDocum ...
- 学会这些CSS技巧让你写样式更加丝滑
目录 1,前言 1,calc() 2,min() 3,max() 4,clamp() 5,gap 6,writing-mode 1,前言 记录一些很好用的css属性 1,calc() calc()函数 ...
- Flyway:Spring Boot中使用Flyway来管理数据库版本
Flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate.clean.info.validate.baseline.repair等命令.它支持SQL(PL/ ...
- fail-fast 与 fail-safe
fail-fast: fail-fast(快速失败),是Java集合的一种错误检测机制.当在遍历集合的过程中该集合在结构(改变集合大小)上发生变化时候,有可能发生fail-fast(快速失败行为不能得 ...
- XCTF csaw2013reversing2
题目描述:听说运行就能拿到Flag,不过菜鸡运行的结果不知道为什么是乱码 一.先运行看看. 果然乱码. 二.查壳 三.是pe文件,可以拖入od和ida进行动态和静态分析. 1.对主函数进行反编译一下. ...