逻辑漏洞与越权访问完全实战教程前置要求已搭建 Kali Burp Suite了解 HTTP 请求基础实验环境PortSwigger Web Security Academy目录前置知识什么是逻辑漏洞实验环境准备Lab 1支付逻辑绕过Lab 2IDOR 水平越权Lab 3Cookie 角色垂直越权真实场景中的攻击思路真实场景中的漏洞检测防御方案与代码审计要点一、前置知识什么是逻辑漏洞1.1 逻辑漏洞 vs 技术漏洞维度技术漏洞SQL/XSS逻辑漏洞越权/支付本质代码实现错误未过滤输入业务设计错误未校验权限请求合法性请求本身非法含恶意 payload请求完全合法参数正常WAF 拦截可被 WAF 规则拦截WAF 无法拦截发现难度用工具扫描即可发现必须理解业务逻辑才能发现利用难度构造 Payload篡改业务参数1.2 越权访问分类类型定义攻击目标水平越权同权限用户间互相访问数据用户 A 查看用户 B 的订单、聊天记录垂直越权低权限用户获得高权限功能普通用户访问管理员后台、删除用户支付逻辑越权价格/数量等关键参数由客户端控制以 0.01 元购买商品1.3 为什么逻辑漏洞危害极大技术漏洞WAF 看到 ?php system() 就拦截 逻辑漏洞WAF 看到 price0.01 认为是正常参数放行核心原因逻辑漏洞的请求在 HTTP 层面完全合法没有恶意字符串传统安全设备无法识别。二、实验环境准备2.1 工具清单工具用途状态Burp Suite ProfessionalHTTP 代理、拦截、改包、Repeater已安装Firefox FoxyProxy设置浏览器代理到 Burp已配置PortSwigger 账号访问在线靶场已注册2.2 账号信息Username:wienerPassword:peter初始余额:$100.00三、Lab 1支付逻辑绕过3.1 实验目标理解客户端控制价格的致命缺陷。后端信任了浏览器提交的商品价格没有在服务端独立计算订单金额。3.2 进入实验室在 PortSwigger 的“Business logic vulnerabilities”路径中找到“Excessive trust in client-side controls”3.3 登录账户使用账号登录UsernamewienerPasswordpeter登录后进入“我的账户”页面看到商店积分$100.00。【在此处插入截图My Account 页面显示余额 $100.00】3.4 浏览商品并加入购物车操作点击“首页”Home浏览商品列表找到“Babbage Web Spray”或其他商品看到商品价格远高于余额如 $1337.00思考正常用户买不起这件商品但逻辑漏洞可能让我们以极低价格购买。)3.5 开启 Burp 拦截点击 Add to cart操作开启 Burp 拦截Intercept is on点击“Add to cart”加入购物车Burp 拦截到 POST /cart 请求【在此处插入截图Burp Intercept 拦截到 POST /cart 请求】3.6 查看请求体中的价格参数在 Burp 的“美化”标签下向下滚动查看请求体Body。预期看到的请求格式POST /cart HTTP/2 Host: ... Content-Type: application/x-www-form-urlencoded productId1price1337quantity1或 JSON 格式{productId:1,price:1337,quantity:1}3.7 修改价格参数找到价格字段后把price1337或更高价格改成price0.01或把 JSON 中的price:1337改成price:0.01为什么改 0.01 而不是 0有些系统会校验价格必须大于 00.01 是最小有效金额更容易绕过校验。3.8 放行请求查看购物车点击Forward放行请求浏览器跳转到购物车页面。预期结果购物车显示商**“Babbage Web Spray”****价格显示0.01 美元总计显示0.01 美元【在此处插入截图购物车页面显示总价 0.01 美元】3.9 完成下单点击“下单”Place order。。预期结果订单成功账户余额从 $100.00 变为$99.99仅扣除 0.01 美元。元页面显示“恭喜你你解决了实验题”**3.10 本实验原理总结用户点击加入购物车 ↓ 浏览器发送 POST /cart包含price1337 Burp Suite 拦截把 price 改成 0.0101 ↓ 服务器信任客户端提交的价格没有独立校验 ↓ 购物车显示总价 0.01 美元 ↓ 用户下单只扣了 0.01 美元漏洞本质服务端未对客户端提交的价格进行二次校验直接信任了前端数据。正确的做法是从数据库查询商品真实价格在服务端计算总价。Lab 2: IDOR 水平越权越权4.1 实验目标理解不安全的直接对象引用IDOR。后端使用可预测的数字 ID 标识资源且未校验当前用户是否有权限访问该资源。4.2 进入实验室Portswiggerer“Business logic vulnerabilities”** 路径中找到**“Insecure direct object references”****g)4.3 登录并进入 Live chat操作登录账户wiener / peter点击页面上**“实时聊天”**Live chattg)4.4 查看聊天记录操作在聊天页面点**“View transcript”**** 按钮浏览器会下载一个.txt文件此时发生了什么点击按钮时浏览器发送了一个 POST 请求到/download-transcript服务器返回 302 重定向到具体的 transcript 文件。4.5 Burp 拦截下载请操作开启 Burp 拦截再次点击“View transcript”Burp 拦截到 POST 请求 请求预期请求POST /download-transcript HTTP/2 Host: ... Cookie: session... [请求体中包含 transcript 标识] ![Burp 拦截下载请求](https://i-blog.csdnimg.cn/direct/66696d0eb4674d449c77ec1f8e140b5c.png)ng) ### 4.6 跟随重定向查看当前用户的 transcript 在 Repeater 中发送请求服务器返回 302 重定向Location: /download-transcript/9.txt点击“跟随重定向”查看当前用户wiener的聊天记录内容。内容。4.7 修改 ID 尝试访问其他用户的记核心思路如果当前用户的 transcript ID 是 9那其他用户的 ID 可能是 1、2、3…… 等数字。数字。操作在 Repeater 中直接发送 GET 请求GET /download-transcript/1.txt HTTP/2点击 *Sendng)4.8 在记录中找到敏感信息查看返回的.txt内容其中包含其他用户的聊天记录。在某个 transcript 中会发现You: Ok so my password is 5mdo1y6y8kqubjo6kztr. Is that right? Hal Pline: Yes it is! **泄露的密码** 5mdo1y6y8kqubjo6kztrtr ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d8b67c3b7ad44b18a5ee35b6968ae2d4.png) ### 4.9 用泄露的密码登录其他用户账户 **操作** 1. 登出当前账户 2. 在登录页面输入 - **Username**carlos - **Password**5mdo1y6y8kqubjo6kztr 3. 点击 **Login***预期结果**成功登录 Carlos 的账户页面显示 **“恭喜你你解决了实验题”**** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/416906c796c14c48a344703d0bc1dcbb.png) ### 4.10 本实验原理总结 用户 wiener 点击 “View transcript”pt ↓ POST /download-transcript → 302 重定向到 /download-transcript/9.txt 攻击者直接 GET /download-transcript/1.txttxt 返回其他用户的聊天记录包含密码qrSur1lak59pgo8cqrwbrwb ↓ 用该密码登录 Carlos 账户 → 水平越权成功**漏洞本质*1. 使用可预测的数字 ID1、2、3…作为资源标识源2. 后端未校验“当前登录用户是否有权访问该 transcript”pt3. 应使用随机不可预测的 ID如 UUID并在后端校验数据归属五、Lab 3Cookie 角色垂直越权5.1 实验目标理解客户端控制角色的致命缺陷。用户角色由 Cookie 中的参数决定后端未在服务端校验用户真实权限。5.2 进入实验室Portswiggerger**“Business logic vulnerabilities”路径中找**“User role controlled by request parameter”***ng)5.3 登录普通用户操作登录账户wiener/peterer进入“我的账户”页面 页面5.4 Burp 拦截发现角色参数操作开启 Burp 拦截点击页面上的任意功能如刷新账户页面Burp 拦截到 GET 请求在请求头中找到Cookie字段关键发现Cookie: Adminfalse; session...Adminfalse就是角色控制参数ng)5.5 修改 Cookie 提升为管理员操作在 Burp Suite 拦截的请求中把把Cookie: Adminfalse; session...改成Cookie: Admintrue; session...点击Forward放行5.6 页面出现管理员功能刷新后的页面会出现“Admin panel”链接点击进入。预期结果页面显示Users管理列表列出所有用户wiener、carlos每个用户旁边有Delete删除按钮### 5.7 访问 Admin Panelne点击“Admin Panel”时* 时浏览器会发送新的请求Cookie 中又会包含Adminfalse。操作开启 Burp Suite 拦截截**2. 点击“Admin panel”Burp Suite 拦截到 GET /admin 请求 请求4. 再次把 Cookie 中的Adminfalse改成Admintrue5. 点击 *Forwardng)5.8 成功访问管理员面板页面显示管理员功能实验完成右上角显示“恭喜你你解决了实验题”5.9 本实验原理总结用户 wiener 登录普通用户 ↓ Cookie 中包含 Adminfalse ↓ Burp 拦截把 Adminfalse 改成 Admintrue ↓ 后端信任 Cookie 中的角色标识未在数据库校验 ↓ 页面显示 Admin panel 链接 ↓ 再次拦截 Admin panel 请求修改 Cookie ↓ 成功访问管理员功能获得垂直越权漏洞本质用户角色由客户端提交的 Cookie 参数控制后端未在服务端根据数据库中的真实角色进行校验任何来自客户端的数据包括 Cookie都不可信任六、真实场景中的攻击思路6.1 攻击目的阶段目标具体操作初始突破获取其他用户权限IDOR 遍历 ID获取他人订单/个人信息权限提升获得管理员权限修改 Cookie/请求头中的角色参数资金窃取低价购买商品抓包改 price、quantity、discount批量数据窃取拖库用户数据遍历 ID 批量导出用户订单、地址、手机号业务破坏恶意操作用管理员权限删除用户、篡改订单状态6.2 典型攻击链支付逻辑 → 资金损失1. 发现电商平台 └─ 商品详情页价格显示正常 2. 抓包分析 └─ 加入购物车时请求体中包含 price 字段 3. 篡改价格 └─ Burp 拦截price999 → price0.01 4. 绕过前端校验 └─ 有些系统前端校验价格但后端未校验 5. 完成支付 └─ 实际支付金额极低获得商品 6. 批量利用 └─ 自动化脚本批量下单转卖获利6.3 典型攻击链IDOR → 数据泄露1. 发现订单详情接口 └─ GET /api/order?id10001 2. 遍历 ID └─ GET /api/order?id10002 └─ GET /api/order?id10003 3. 发现未授权访问 └─ 无需登录即可查看他人订单 4. 提取敏感信息 └─ 订单中包含姓名、手机号、地址、购买商品 5. 批量爬取 └─ 用脚本遍历 10001-99999导出全站用户订单 6. 数据贩卖/社工 └─ 用户数据在黑市售卖或用于精准钓鱼6.4 典型攻击链垂直越权 → 完全控制1. 注册普通用户 └─ 登录后只有基本功能 2. 抓包发现角色参数 └─ Cookie: roleuser └─ 或 JSON: {role:user} 3. 修改角色参数 └─ roleuser → roleadmin 4. 访问管理接口 └─ GET /admin/users 5. 获得管理员功能 └─ 查看所有用户、删除用户、修改配置 6. 进一步渗透 └─ 上传 webshell、导出数据库、控制服务器七、真实场景中的漏洞检测7.1 黑盒测试支付逻辑检测测试清单□ 抓包查看加入购物车/结算请求是否包含价格参数 □ 修改 price 为负数看是否允许可能实现赚钱 □ 修改 price 为 0 或 0.01看是否允许下单 □ 修改 quantity 为负数看总价是否减少 □ 修改 discount 为 100%看是否免费 □ 重复提交同一订单号看是否重复扣款/发货 □ 跳过支付步骤直接访问订单成功页面工具辅助Burp Suite拦截并修改每个业务请求Repeater重放请求测试参数边界值Intruder批量测试价格、数量等参数7.2 黑盒测试IDOR 检测发现 IDOR 点□ 订单详情/order?id123 → 改成 id124 □ 用户资料/user/profile?id123 → 改成 id124 □ 下载文件/download?filereport_123.pdf → 改成 report_124.pdf □ 聊天记录/chat?transcript1 → 改成 transcript2 □ 发票查看/invoice?inv_id1001 → 改成 inv_id1002自动化测试# 用 ffuf 批量测试 ID 遍历ffuf-uhttp://目标/api/order?idFUZZ-w(seq1100)-mc200# 用 Burp Intruder 批量测试# Payload: Numbers 1-1000# 观察响应长度和状态码变化7.3 黑盒测试垂直越权检测测试清单□ 登录后抓包查看 Cookie/请求头中是否有 role/admin 等参数 □ 修改 roleuser → roleadmin观察页面变化 □ 直接访问管理接口/admin、/manage、/dashboard □ 注册时尝试提交 roleadmin 或 isAdmintrue □ 密码重置时尝试重置管理员密码常见管理接口路径/admin /manage /dashboard /console /system /api/admin /administrator7.4 白盒代码审计支付逻辑审计要点// ❌ 危险代码直接使用客户端价格$total$_POST[price]*$_POST[quantity];// ✅ 安全代码从数据库查询真实价格$productgetProductById($_POST[product_id]);$total$product[price]*intval($_POST[quantity]);IDOR 审计要点// ❌ 危险代码不校验权限直接返回$ordergetOrderById($_GET[id]);echojson_encode($order);// ✅ 安全代码校验数据归属$ordergetOrderById($_GET[id]);if($order[user_id]!$_SESSION[user_id]){die(Access denied);}echojson_encode($order);垂直越权审计要点// ❌ 危险代码信任客户端角色$role$_COOKIE[role];if($roleadmin){showAdminPanel();}// ✅ 安全代码服务端校验角色$usergetUserById($_SESSION[user_id]);if($user[role]!admin){die(Access denied);}showAdminPanel();八、防御方案与代码审计要点8.1 支付逻辑防御?php// ✅ 安全的订单计算流程// 1. 从数据库查询商品真实信息绝不信任客户端价格$productgetProductById($_POST[product_id]);if(!$product){die(Product not found);}// 2. 校验数量边界$quantityintval($_POST[quantity]);if($quantity1||$quantity100){die(Invalid quantity);}// 3. 服务端计算总价$total$product[price]*$quantity;// 4. 校验优惠券如果有if(!empty($_POST[coupon])){$couponvalidateCoupon($_POST[coupon]);if($coupon){$totalapplyDiscount($total,$coupon);}}// 5. 记录订单价格以服务端计算为准createOrder($user_id,$product[id],$quantity,$total);?8.2 IDOR 防御?php// ✅ 安全的资源访问校验数据归属functiongetOrder($order_id,$current_user_id){$orderdb_query(SELECT * FROM orders WHERE id ?,[$order_id]);// 关键校验当前用户是否是订单所有者if($order[user_id]!$current_user_id){logSecurityEvent(Unauthorized access attempt,$current_user_id);returnnull;// 或抛出异常}return$order;}// 使用 UUID 替代自增 IDfunctioncreateOrder($user_id,$product_id,$quantity){$order_uuidgenerateUUID();// 随机不可预测db_query(INSERT INTO orders (uuid, user_id, product_id, quantity) VALUES (?, ?, ?, ?),[$order_uuid,$user_id,$product_id,$quantity]);return$order_uuid;}?8.3 垂直越权防御?php// ✅ 安全的角色校验// 中间件所有管理接口必须通过此校验functionrequireAdmin(){// 从服务端 Session/数据库获取角色绝不信任 Cookie$usergetUserById($_SESSION[user_id]);if($user[role]!admin){http_response_code(403);die(Access denied);}}// 管理接口route(/admin/users,function(){requireAdmin();// 先校验权限showUserList();// 再执行功能});?8.4 防御检查清单检查项要求优先级服务端计算金额价格、数量、折扣全部由服务端计算 必须校验数据归属访问资源前确认这是谁的数据 必须使用 UUID资源标识使用随机不可预测 ID 必须服务端角色校验角色从数据库/Session读取不从客户端 必须敏感操作二次确认支付、删除等操作需二次验证 强烈建议业务日志审计记录所有敏感操作便于溯源 强烈建议九、总结实验漏洞类型利用手法学到的核心原理支付逻辑客户端控制价格Burp 改 price0.01服务端必须独立计算金额IDOR可预测数字 IDGET /download-transcript/1.txt使用 UUID后端校验权限垂直越权Cookie 控制角色Adminfalse → Admintrue角色必须从服务端数据库读取核心原则永远不要信任客户端提交的业务参数—— 价格、数量、角色等必须在服务端校验敏感操作必须校验权限和数据归属—— 访问资源前确认这是谁的数据当前用户有权访问吗使用随机不可预测的 ID—— 自增 ID 是 IDOR 的温床用户角色必须服务端存储—— Cookie、请求头、隐藏字段中的角色标识都不可信WAF 无法防御逻辑漏洞—— 必须在代码层面和业务设计层面解决