在 Web 安全中,有一类漏洞非常特殊:它没有 SQL 注入的特征字符,没有 XSS 的恶意脚本,WAF 无法检测,扫描器也很难发现,但是一旦被利用,就能直接窃取用户数据、越权操作、甚至实现 "0 元购" 拿走商品,这就是业务逻辑漏洞。
和传统的代码层漏洞不同,逻辑漏洞的根源不是代码的语法错误,而是开发者在设计业务流程的时候,考虑不够严谨,遗漏了某些异常场景,导致攻击者可以按照 "正常" 的请求流程,完成超出自己权限的操作。本文将从基础原理出发,带你一步步吃透逻辑漏洞,结合 Pikachu 靶场、大米 CMS 等实战案例,彻底掌握这一漏洞的利用与防御。
一、基础:什么是逻辑漏洞?
所谓逻辑漏洞,就是开发者在编写业务逻辑的时候,没有考虑到所有的异常情况,导致攻击者可以绕过正常的业务流程,实现未授权的操作。
比如最典型的 "0 元购" 事件:电商平台的开发者默认用户不会修改商品的价格,所以直接用了用户传过来的价格参数来计算订单金额,攻击者只需要把价格改成 0,就可以免费拿走商品,整个过程没有任何恶意代码,所有的请求都是正常的,但是却造成了巨大的损失。
逻辑漏洞的核心特点
-
隐蔽性强:所有的请求都是正常的 HTTP 请求,没有恶意字符,WAF 和扫描器都无法检测。
-
危害巨大:一旦利用成功,往往可以直接获取敏感数据、越权操作、甚至直接造成财产损失。
-
难以自动化挖掘:没有固定的特征,只能靠人工梳理业务流程,测试异常场景。
二、最常见的越权类漏洞,实战详解
越权漏洞是逻辑漏洞中最常见的一类,指的是用户可以访问或者操作超出自己权限范围的资源。越权漏洞主要分为两类:
水平越权
垂直越权
普通用户A
普通用户B的隐私信息
普通用户C
管理员的高级操作权限
-
水平越权:相同权限等级的用户之间,越权访问对方的资源,比如普通用户 A 可以查看普通用户 B 的个人信息。
-
垂直越权:低权限等级的用户,越权获取高权限用户的操作能力,比如普通用户可以直接添加管理员账号。
我们可以通过 Pikachu 靶场来实战体验这两类漏洞,首先我们先部署 Pikachu 环境:
Pikachu 靶场部署步骤
-
把 Pikachu 源码放到 PHPStudy 的 WWW 目录下
-
修改
inc/config.inc.php中的 MySQL 配置,匹配自己的数据库信息 -
访问
http://localhost/pikachu/install.php完成安装 -
访问
http://localhost/pikachu/即可进入靶场
实战 1:水平越权,查看任意用户信息
水平越权的靶场链接为:http://localhost/pikachu/vul/overpermission/op1/op1_login.php
操作步骤非常简单:
-
首先使用 test 账号登录,登录后点击 "查看个人信息"
-
这时候我们的 URL 是:
http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=test&submit=点击查看个人信息
- 我们只需要把 URL 中的
username=test改成username=kobe,然后刷新页面
这时候你会发现,我们直接看到了 kobe 的个人信息!我们根本不需要登录 kobe 的账号,就拿到了他的隐私数据,这就是典型的水平越权漏洞。
漏洞原因
后端的代码只做了一件事:检查你有没有登录。但是它完全没有检查:当前登录的用户,有没有权限查看这个 username 的信息。
也就是说,只要你登录了,不管你是谁,你传什么 username,后端就会直接把这个用户的信息返回给你,这就是最典型的逻辑不严谨。
实战 2:垂直越权,普通用户添加管理员
垂直越权的靶场链接为:http://localhost/pikachu/vul/overpermission/op2/op2_login.php
我们的目标是:用普通用户的账号,实现管理员才能做的添加用户的操作。
操作步骤:
-
首先使用普通用户 pikachu 登录,登录后我们发现,普通用户只能查看自己的信息,没有添加用户的权限。
-
但是我们猜测,管理员添加用户的接口是
op2_admin_edit.php,我们直接在浏览器访问这个链接:
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
- 我们发现,我们居然可以直接访问这个页面!然后我们就可以直接添加一个新的管理员用户,根本不需要登录 admin 的账号!
漏洞原因
后端的这个管理员接口,只做了最基础的检查:你有没有登录。但是它完全没有检查:当前登录的用户,是不是管理员。
开发者以为,普通用户不会知道这个接口的地址,所以不需要做权限检查,但是攻击者可以通过猜测、扫描的方式拿到这个接口,然后直接调用,就完成了垂直越权。
三、业务逻辑漏洞:从 1 元购到 0 元购
除了越权漏洞,业务流程中的逻辑漏洞更加危险,尤其是电商的支付流程,一旦出现漏洞,就会直接造成财产损失,最典型的就是 "1 元购"、"0 元购" 漏洞。
常见的业务逻辑漏洞场景
-
商品编号篡改:把高价商品的编号,替换成低价商品的编号,用低价买高价商品。
-
金额数据篡改:直接修改请求中的价格参数,把高价改成 1 元、甚至 0 元。
-
支付状态篡改:把未支付的状态,直接改成已支付,不需要付钱就拿到商品。
-
商品数量篡改:把商品的数量改成负数,导致订单金额变成负数,相当于平台给你转钱。
实战案例:大米 CMS 支付漏洞
大米 CMS 是一个常见的 CMS 系统,它曾经出现过典型的支付逻辑漏洞,攻击者可以利用这个漏洞实现 0 元购,我们来看看这个漏洞的利用过程:
-
首先,我们选择一个 6000 元的手机,点击购买,然后用 BurpSuite 抓包。
-
抓到的购买请求中,有一个
price参数,值是 6000,这是商品的价格。 -
我们把这个
price参数改成 5400,也就是另一个低价商品的价格,然后重放这个请求。 -
这时候我们发现,订单的价格直接变成了 5400,我们用 5400 的价格,买到了 6000 的手机!
更极端的情况:
-
我们可以把
price改成 0,直接实现 0 元购,免费拿走商品。 -
我们可以把商品的数量
qty改成 - 1,这时候订单的金额就变成了负数,相当于平台要给我们钱,直接给自己的账户充值。 -
我们还可以修改支付状态,把
status从 0 改成 1,直接标记订单为已支付,不需要真正付钱就可以拿到商品。
漏洞原因
这些漏洞的根源都是一样的:后端完全信任了用户传过来的参数。
正常来说,商品的价格应该是从数据库里查出来的,用户根本不能修改,但是开发者图省事,直接用了用户传过来的price参数来计算订单金额,所以用户改了价格,后端就直接按改后的价格来处理,这就是最典型的逻辑漏洞。
四、逻辑漏洞的挖掘与防御
挖掘思路
逻辑漏洞的挖掘没有固定的自动化方法,核心是梳理业务流程,测试异常场景:
-
梳理业务流程:把每个业务的步骤、参数都理清楚,思考每个步骤有没有可以篡改的地方。
-
越权测试:每个接口,都用低权限用户试试,能不能访问,能不能操作其他用户的资源。
-
参数测试:关键参数比如价格、数量、ID,都试试修改成异常值,看看后端有没有校验。
-
流程测试:试试跳过某些步骤,比如能不能不付款就直接拿到商品,能不能跳过验证步骤。
防御方法
针对逻辑漏洞,我们可以通过以下方式来防御:
-
权限校验:每个接口都要做严格的权限校验,检查当前用户的角色,检查用户有没有权限操作这个资源。比如查看用户信息的时候,必须检查当前登录的用户是不是就是这个用户,或者是管理员。
-
不信任用户参数:绝对不要信任用户传过来的关键参数,比如价格、数量、支付状态,这些参数必须从数据库里查,不能用用户传过来的值。
-
流程校验:业务流程的每个步骤都要做校验,不能跳过,订单生成之后不能修改,支付的时候要核对订单的所有信息,确保没有被篡改。
-
日志审计:对关键操作做日志,出现异常的时候可以及时发现,比如 0 元购、负数金额的订单,及时拦截。
总结
随着 Web 安全的发展,传统的代码层漏洞已经越来越少,防护也越来越完善,但是业务逻辑漏洞却越来越常见,因为它隐蔽、难检测,一旦出现就会造成巨大的损失。
开发者在设计业务流程的时候,一定要记住:永远不要信任用户的输入,永远要考虑到所有的异常场景,做好每一步的校验,才能避免这类漏洞的出现。