服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞。攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商品请求,从中获取利益。本文将讨论如何简单地使用 iFlow 应用安全加固平台的可编程特性,对竞争条件产生的支付漏洞进行防护。

一、原始网站

这是一个在支付环节存在竞争条件漏洞的站点:用户输入一个支付数值,系统将这个数值与余额比较,如果支付数值小于余额则允许支付,并从余额中减去支付数值。

攻击者编写并执行了一个 Python 攻击脚本,使用多线程并发对支付请求 URL 进行访问。由于未能正确处理竞争条件问题,系统为多个请求同时扣除了余额。我们回到浏览器中刷新页面,可以发现余额变为了 -10 元,如下图所示。

HTTP 交互流程如下:

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant Web服务器
participant 数据库
攻击者->>浏览器: 点击“竞争条件-支付”链接
浏览器->>Web服务器: GET /race_condition/pay.php
数据库->>Web服务器: 读取金额
Web服务器->>浏览器: 返回“竞争条件-支付”页面
浏览器->>攻击者: 显示:余额为10元
攻击者->>攻击工具: 执行多线程并发请求
rect rgb(250, 128, 128)
攻击工具->>Web服务器: POST /race_condition/pay.php
Web服务器->>数据库: 余额足够,扣除支付金额
攻击工具->>Web服务器: POST /race_condition/pay.php
Web服务器->>数据库: 余额足够,扣除支付金额
攻击工具->>Web服务器: POST /race_condition/pay.php
Web服务器->>数据库: 余额足够,扣除支付金额
end
攻击者->>浏览器: 点击“竞争条件-支付”链接
浏览器->>Web服务器: GET /race_condition/pay.php
数据库->>Web服务器: 读取金额
Web服务器->>浏览器: 返回“竞争条件-支付”页面
浏览器->>攻击者: 显示:余额为-4元

二、iFlow虚拟补丁后的网站

我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。本例中,iFlow 使用一个全局唯一的定时标志来阻止对并发请求的同时处理。

每个支付请求到来时,iFlow 都会检查定时标志是否存在。只有标志不存在时才交给 Web 服务器处理这个请求,并同时设置定时标志。在定时期间,如有其他支付请求到来,而 iFlow 检查到定时标志存在,则会放弃处理这个请求,将用户重定向到指定页面。定时结束后,系统则又可以处理下一个支付请求。

HTTP 协议交互过程如下:

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant iFlow
participant Web服务器
participant 数据库
攻击者->>浏览器: 点击“竞争条件-支付”链接
浏览器->>Web服务器: GET /race_condition/pay.php
数据库->>Web服务器: 读取金额
Web服务器->>浏览器: 返回“竞争条件-支付”页面
浏览器->>攻击者: 显示:余额为10元
攻击者->>攻击工具: 执行多线程并发请求脚本
攻击工具->>iFlow: POST /race_condition/pay.php
Note over iFlow: 设置定时标志
iFlow->>Web服务器: POST /race_condition/pay.php
Web服务器->>数据库: 余额足够,扣除支付金额
rect rgb(250, 128, 128)
攻击工具->>iFlow: POST /race_condition/pay.php
end
Note over iFlow: 定时标志存在,重定向页面
rect rgb(250, 128, 128)
攻击工具->>iFlow: POST /race_condition/pay.php
end
Note over iFlow: 定时标志存在,重定向页面
攻击工具->>iFlow: POST /race_condition/pay.php
Note over iFlow: 定时标志超时后不存在
iFlow->>Web服务器: POST /race_condition/pay.php
Web服务器->>数据库: 余额不足,不执行支付
攻击者->>浏览器: 点击“竞争条件-支付”链接
浏览器->>Web服务器: GET /race_condition/pay.php
数据库->>Web服务器: 读取金额
Web服务器->>浏览器: 返回“竞争条件-支付”页面
浏览器->>攻击者: 显示:余额为0元

代码

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

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

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

{
"if": [
"REQUEST_FILENAME == '/race_condition/pay.php'",
"REQUEST_METHOD == 'POST'"
],
"then": {
"if": "GLOBAL.pay_time_flag",
"then": {
"verdict": {
"action": "redirect",
"param": "/retry.html"
}
},
"else": "GLOBAL.pay_time_flag@2=1"
}
}

示例代码中,当服务器端收到支付请求时,iFlow 拦截此请求。iFlow 会检查全局 (GLOBAL) 存储变量 pay_time_flag 是否存在:如存在,则重定向到页面 /retry.html (向正常用户提示稍后重试);如不存在,则设置一个生命时长为2秒 (数值可根据实际请求处理所需时间调整) 的存储变量 pay_time_flag

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

三、总结

使用 iFlow 书写一条规则,即可实现在设定时间内只允许处理一个请求,避免竞争条件带来的异常处理。(张戈 | 天存信息)

WEB安全新玩法 [10] 防范竞争条件支付漏洞的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 自定义 checkbox 新玩法 ?

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

随机推荐

  1. Kubernetes 实战——有状态应用(StatefulSet)

    一.简介 有状态实例:新实例和旧实例需要有相同的名称.网络标识和状态 无状态实例:可随时被替换 1. ReplicaSet 和有状态 Pod ReplicaSet 通过 Pod 模板创建多个 Pod ...

  2. 会点自动化就要25k? 现在年轻人这么浮躁吗

    面试中一问元素定位就对答如流.一问实际项目框架如何搭建就避重就轻.含糊其辞,这样的自动化实战能力也能拿25K?静待下文: 一.为什么现在自动化测试工资那么高呢? 结合现在的职场环境与企业用人需求,自动 ...

  3. 「10.15」梦境(贪心)·玩具(神仙DP)·飘雪圣域(主席树\树状数组\莫队)

    A. 梦境 没啥可说的原题.... 贪心题的常见套路我们坐标以左端点为第一关键字,右端点为第二关键字 然后对于每个转折点,我们现在将梦境中左端点比他小的区间放进$multiset$里 然后找最近的右端 ...

  4. Android系统编程入门系列之清单文件

    在上一篇文章中已经提到,Android系统加载应用程序之后,首先会读取该应用程序的AndroidManifest.xml清单文件,之后根据该清单文件加载后边的东西.所以要开发应用程序,自然要先知道清单 ...

  5. canvas小画板——(3)笔锋效果

    画线准备 准备一个canvas <canvas id="canvasId" width="1000" height="800"> ...

  6. 10年程序员的编程语言感受与Go的结缘

    因为小编最近在写两套教程,分别是Java语言基础教程和Go语言的基础教程,并且这 2 门语言,小编在实际的工作中也都有用过 而且 www.helloworld.net 社区的后台,就是用Go语言写的, ...

  7. 全新安装Windows版 Atlassian Confluence 7.3.1 + MySQL 8.0,迁移数据,并设置服务自启

    Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息.文档协作.集体讨论,信息推送. 安装Conflu ...

  8. C++中运算符的重载

    运算符重载相当于运算符的函数重载,用于对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型.我们之前提到过C++中的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的 ...

  9. iOS如何提升,首先得知自己的处境!(欢迎评论留言)

    聊聊行情?为什么总有人在乎旁人的看法而忽略自己的初衷?虽然iOS开发市场说不上好但也绝不算坏,想没想过那些煽风点火说iOS不行的人在做什么?真的转行从头开始?错.大错特错!在劝退你的同时他们会默默的学 ...

  10. Java核心基础第3篇-Java流程控制

    Java流程控制 本章一起来探讨下Java的流程控制语句.主要从以下几个方面展开: Java分支语句 Java循环语句 Java其实和其他任何的开发语言一样,分支语句和循环语句是必不可少的,有个这两个 ...