业务逻辑漏洞从入门到实战博客

在 Web 安全中,有一类漏洞非常特殊:它没有 SQL 注入的特征字符,没有 XSS 的恶意脚本,WAF 无法检测,扫描器也很难发现,但是一旦被利用,就能直接窃取用户数据、越权操作、甚至实现 "0 元购" 拿走商品,这就是业务逻辑漏洞

和传统的代码层漏洞不同,逻辑漏洞的根源不是代码的语法错误,而是开发者在设计业务流程的时候,考虑不够严谨,遗漏了某些异常场景,导致攻击者可以按照 "正常" 的请求流程,完成超出自己权限的操作。本文将从基础原理出发,带你一步步吃透逻辑漏洞,结合 Pikachu 靶场、大米 CMS 等实战案例,彻底掌握这一漏洞的利用与防御。


一、基础:什么是逻辑漏洞?

所谓逻辑漏洞,就是开发者在编写业务逻辑的时候,没有考虑到所有的异常情况,导致攻击者可以绕过正常的业务流程,实现未授权的操作。

比如最典型的 "0 元购" 事件:电商平台的开发者默认用户不会修改商品的价格,所以直接用了用户传过来的价格参数来计算订单金额,攻击者只需要把价格改成 0,就可以免费拿走商品,整个过程没有任何恶意代码,所有的请求都是正常的,但是却造成了巨大的损失。

逻辑漏洞的核心特点

  1. 隐蔽性强:所有的请求都是正常的 HTTP 请求,没有恶意字符,WAF 和扫描器都无法检测。

  2. 危害巨大:一旦利用成功,往往可以直接获取敏感数据、越权操作、甚至直接造成财产损失。

  3. 难以自动化挖掘:没有固定的特征,只能靠人工梳理业务流程,测试异常场景。


二、最常见的越权类漏洞,实战详解

越权漏洞是逻辑漏洞中最常见的一类,指的是用户可以访问或者操作超出自己权限范围的资源。越权漏洞主要分为两类:

复制代码

水平越权

垂直越权

普通用户A

普通用户B的隐私信息

普通用户C

管理员的高级操作权限

  • 水平越权:相同权限等级的用户之间,越权访问对方的资源,比如普通用户 A 可以查看普通用户 B 的个人信息。

  • 垂直越权:低权限等级的用户,越权获取高权限用户的操作能力,比如普通用户可以直接添加管理员账号。

我们可以通过 Pikachu 靶场来实战体验这两类漏洞,首先我们先部署 Pikachu 环境:

Pikachu 靶场部署步骤

  1. 把 Pikachu 源码放到 PHPStudy 的 WWW 目录下

  2. 修改inc/config.inc.php中的 MySQL 配置,匹配自己的数据库信息

  3. 访问http://localhost/pikachu/install.php完成安装

  4. 访问http://localhost/pikachu/即可进入靶场

实战 1:水平越权,查看任意用户信息

水平越权的靶场链接为:http://localhost/pikachu/vul/overpermission/op1/op1_login.php

操作步骤非常简单:

  1. 首先使用 test 账号登录,登录后点击 "查看个人信息"

  2. 这时候我们的 URL 是:

复制代码
​
http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=test&submit=点击查看个人信息
  1. 我们只需要把 URL 中的username=test改成username=kobe,然后刷新页面

这时候你会发现,我们直接看到了 kobe 的个人信息!我们根本不需要登录 kobe 的账号,就拿到了他的隐私数据,这就是典型的水平越权漏洞。

漏洞原因

后端的代码只做了一件事:检查你有没有登录。但是它完全没有检查:当前登录的用户,有没有权限查看这个 username 的信息。

也就是说,只要你登录了,不管你是谁,你传什么 username,后端就会直接把这个用户的信息返回给你,这就是最典型的逻辑不严谨。

实战 2:垂直越权,普通用户添加管理员

垂直越权的靶场链接为:http://localhost/pikachu/vul/overpermission/op2/op2_login.php

我们的目标是:用普通用户的账号,实现管理员才能做的添加用户的操作。

操作步骤:

  1. 首先使用普通用户 pikachu 登录,登录后我们发现,普通用户只能查看自己的信息,没有添加用户的权限。

  2. 但是我们猜测,管理员添加用户的接口是op2_admin_edit.php,我们直接在浏览器访问这个链接:

复制代码
​
http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
  1. 我们发现,我们居然可以直接访问这个页面!然后我们就可以直接添加一个新的管理员用户,根本不需要登录 admin 的账号!
漏洞原因

后端的这个管理员接口,只做了最基础的检查:你有没有登录。但是它完全没有检查:当前登录的用户,是不是管理员。

开发者以为,普通用户不会知道这个接口的地址,所以不需要做权限检查,但是攻击者可以通过猜测、扫描的方式拿到这个接口,然后直接调用,就完成了垂直越权。


三、业务逻辑漏洞:从 1 元购到 0 元购

除了越权漏洞,业务流程中的逻辑漏洞更加危险,尤其是电商的支付流程,一旦出现漏洞,就会直接造成财产损失,最典型的就是 "1 元购"、"0 元购" 漏洞。

常见的业务逻辑漏洞场景

  1. 商品编号篡改:把高价商品的编号,替换成低价商品的编号,用低价买高价商品。

  2. 金额数据篡改:直接修改请求中的价格参数,把高价改成 1 元、甚至 0 元。

  3. 支付状态篡改:把未支付的状态,直接改成已支付,不需要付钱就拿到商品。

  4. 商品数量篡改:把商品的数量改成负数,导致订单金额变成负数,相当于平台给你转钱。

实战案例:大米 CMS 支付漏洞

大米 CMS 是一个常见的 CMS 系统,它曾经出现过典型的支付逻辑漏洞,攻击者可以利用这个漏洞实现 0 元购,我们来看看这个漏洞的利用过程:

  1. 首先,我们选择一个 6000 元的手机,点击购买,然后用 BurpSuite 抓包。

  2. 抓到的购买请求中,有一个price参数,值是 6000,这是商品的价格。

  3. 我们把这个price参数改成 5400,也就是另一个低价商品的价格,然后重放这个请求。

  4. 这时候我们发现,订单的价格直接变成了 5400,我们用 5400 的价格,买到了 6000 的手机!

更极端的情况:

  • 我们可以把price改成 0,直接实现 0 元购,免费拿走商品。

  • 我们可以把商品的数量qty改成 - 1,这时候订单的金额就变成了负数,相当于平台要给我们钱,直接给自己的账户充值。

  • 我们还可以修改支付状态,把status从 0 改成 1,直接标记订单为已支付,不需要真正付钱就可以拿到商品。

漏洞原因

这些漏洞的根源都是一样的:后端完全信任了用户传过来的参数

正常来说,商品的价格应该是从数据库里查出来的,用户根本不能修改,但是开发者图省事,直接用了用户传过来的price参数来计算订单金额,所以用户改了价格,后端就直接按改后的价格来处理,这就是最典型的逻辑漏洞。


四、逻辑漏洞的挖掘与防御

挖掘思路

逻辑漏洞的挖掘没有固定的自动化方法,核心是梳理业务流程,测试异常场景:

  1. 梳理业务流程:把每个业务的步骤、参数都理清楚,思考每个步骤有没有可以篡改的地方。

  2. 越权测试:每个接口,都用低权限用户试试,能不能访问,能不能操作其他用户的资源。

  3. 参数测试:关键参数比如价格、数量、ID,都试试修改成异常值,看看后端有没有校验。

  4. 流程测试:试试跳过某些步骤,比如能不能不付款就直接拿到商品,能不能跳过验证步骤。

防御方法

针对逻辑漏洞,我们可以通过以下方式来防御:

  1. 权限校验:每个接口都要做严格的权限校验,检查当前用户的角色,检查用户有没有权限操作这个资源。比如查看用户信息的时候,必须检查当前登录的用户是不是就是这个用户,或者是管理员。

  2. 不信任用户参数:绝对不要信任用户传过来的关键参数,比如价格、数量、支付状态,这些参数必须从数据库里查,不能用用户传过来的值。

  3. 流程校验:业务流程的每个步骤都要做校验,不能跳过,订单生成之后不能修改,支付的时候要核对订单的所有信息,确保没有被篡改。

  4. 日志审计:对关键操作做日志,出现异常的时候可以及时发现,比如 0 元购、负数金额的订单,及时拦截。


总结

随着 Web 安全的发展,传统的代码层漏洞已经越来越少,防护也越来越完善,但是业务逻辑漏洞却越来越常见,因为它隐蔽、难检测,一旦出现就会造成巨大的损失。

开发者在设计业务流程的时候,一定要记住:永远不要信任用户的输入,永远要考虑到所有的异常场景,做好每一步的校验,才能避免这类漏洞的出现。

相关推荐
淼淼爱喝水2 小时前
华为 防火墙直连互通配置:实现双防火墙 Ping 通
服务器·网络·华为
weixin_449290012 小时前
Python vs Go:优缺点对比
网络·python·golang
谪星·阿凯3 小时前
PHP序列化漏洞从入门到实战博客
android·开发语言·web安全·php
攻城狮在此3 小时前
华为企业网二层交换、三层交换、出口路由组网配置(静态路由)
网络·华为
刘~浪地球3 小时前
Nginx + Tomcat 整合实战(六):安全加固与生产部署
nginx·安全·tomcat
Johnstons3 小时前
11款网络流量监控分析软件深度对比
运维·网络·网络故障排除·网络流量分析·网络性能监控
苏渡苇3 小时前
ConcurrentHashMap.computeIfAbsent():高并发下安全初始化的终极方案
java·安全·jdk·高并发·hashmap·concurrent
紫雾凌寒3 小时前
Claude Code 自动模式:一种更安全的跳过权限审批的方式【译】
安全·ai·ai编程·claude·claudecode
123过去3 小时前
ophcrack-cli使用教程
linux·网络·测试工具·安全