返回介绍

5.6 竞争条件测试

发布于 2024-10-11 00:03:32 字数 1746 浏览 0 评论 0 收藏 0

5.6.1 测试原理和方法

竞争条件通常是在操作系统编程时会遇到的安全问题:当两个或多个进程试图在同一

时刻访问共享内存,或读写某些共享数据时,最后的竞争结果取决于线程执行的顺序(线

程运行时序),称为竞争条件(Race Conditions)。

在 Web 安全中,我们可以沿用这个概念,在服务端逻辑与数据库读写存在时序问题

时,就可能存在竞争条件漏洞,如图 5-25 所示。攻击者通常利用多线程并发请求,在数据

库中的余额字段更新之前,多次兑换积分或购买商品,从中获得利益。

图 5-25 竞争条件漏洞

例如,如下 PHP 代码片段就存在此竞争条件漏洞。

5.6.2 测试过程

攻击者在提交订单时抓包,然后设置很多个线程重放此包。如图 5-26 所示,在众多请

求中,个别请求就有可能争取绕过金额、次数的判断,交易成功,攻击者从中获利。

图 5-26 时间竞争测试流程

某网站退款提现时存在竞争条件漏洞。申请退款时,点了两次,生成了两单退款申请,如图 5-27 所示。

图 5-27 申请退款

同时余额变成了负数,如图 5-28 所示。

图 5-28 账户余额

退款申请没有经过财务审核,直接收到两笔七千多元的退款,如图 5-29 所示。

图 5-29 提现成功

5.6.3 修复建议

如图 5-30 所示,在处理订单、支付等关键业务时,使用悲观锁或乐观锁保证事务的

ACID 特性(原子性、一致性、隔离性、持久性),并避免数据脏读(一个事务读取了另

一个事务未提交的数据),解决竞争条件和并发操作可能带来的相关业务问题。

图 5-30 竞争条件漏洞修补

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文