其他
当需要人工推理业务逻辑漏洞(价格篡改、竞态、流程绕过…
适用于对 Web/API 业务流程做手工安全测试,覆盖价格与数量篡改、竞态条件、步骤跳过、优惠券/推荐滥用、权限逻辑、订阅层级混淆、文件上传业务逻辑等。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 55/100 ×0.15
适用场景
当需要人工推理业务逻辑漏洞(价格篡改、竞通用
解决思路
- 需要完整 5 阶段工作流、攻击面 5×N 矩阵、人工判断决策树时,加载 [METHODOLOGY.md](./METHODOLOGY.md)。
- 需要按模块逐项检查(登录/注册/支付/IDOR/隐私)并查看每项 why+verify 时,加载 [CHECKLIST.md](./CHECKLIST.md)。
- 需要深入支付精度/溢出、验证码绕过、密码重置、枚举、前端绕过时,加载 [SCENARIOS.md](./SCENARIOS.md)。
- 支付精度与整数溢出:32 位溢出为负数、小数舍入利用、负数运费。
- 支付参数篡改清单:price、discount、currency、gateway、return_url 字段。
- 条件竞态实用模式:并行优惠券应用、礼品卡双花,用 Burp group send。
- 验证码绕过技术:丢弃验证请求、删除参数、清空 cookies 重置计数器、用 tesseract OCR。
- 任意密码重置:可预测 token(md5(username))、会话替换攻击、注册覆盖。
- 用户信息枚举:登录错误消息差异、跨端点重建掩码数据、base64 uid cookie 操纵。
- 前端限制绕过:数组参数传多个优惠券(couponid[0]/couponid[1])、移除 disabled/readonly 属性。
- 应用层 DoS 模式:正则回溯、WebSocket 滥用。
- 负数数量/价格:添加购物车数量 -1,更新数量 -100,提交 {"quantity": -5, "price": -99.99},检查是否接受并导致返 credit、免费物品或反向银行转账。
- 小数数量 0 元购:拦截购物车提交,将 skuQty 设为 0.02 或 FoodNum 设为 0.01,完成结账,验证是否只付 2% 价格但发全量商品。
- 删除必填字段免费层强制:编辑客户端请求,完全移除 prizeIdList 数组,提交后检查服务端是否回退 payType: free 并创建成功注册。
- 整数溢出:设置 quantity: 2147483648(INT_MAX+1)、price: 9999999999999 或 amount=999999999,观察是否回绕为负数或存为 0;触发前协调避免崩溃支付服务。
- 舍入操纵:商品价格 $0.001,下单 1000 件使每件向下舍入总额 $0.00;或输入 ¥0.019 充值,支付网关向下舍入收 ¥0.01,钱包向上舍入记 ¥0.02,循环获利。
- 汇率滞后:用货币 A 按汇率 X 存入,等汇率变化后按新汇率用货币 A 提现,赚取汇率差。
- 促销叠加免费升级:组合折扣码、推荐积分、欢迎奖金,如 FREE50、REFER10、忠诚积分,检查总额是否变负或免费。
- 双花/双兑换:用 Burp Repeater "Send to Group" 或 Race Conditions 工具,同时发送 20 个并行请求到 POST /api/use-coupon、POST /api/redeem-gift、POST /api/withdraw-funds,检查 check-update 非原子时是否都成功。
- 用 Burp Suite 测竞态:捕获请求,发送到 Repeater,复制 20+ 次,使用 "Send group in parallel"(Burp 2023+),检查是否有重复成功。
- 用 Turbo Intruder 绕过每号码 SMS 限速:当正常请求返回“该号码短时间内申请发送短信次数过多,拒绝发送”时,用高并发发送同一 payload;示例脚本设置 concurrentConnections=30, requestsPerConnection=10, pipeline=False,循环 30 次 queue 后 openGate('race1'),生成多个验证码。
- 多设备并发 VIP 订阅:在支付完成前于设备 A/B/C 打开支付页锁定首月优惠,然后依次完成支付,利用服务端只在第一次请求检查“新用户”,使后续请求继承折扣且 VIP 时长叠加;同样适用于“补差价升级会员”并发充值。
- 账户注册竞态:同时用同一 email 注册,可能创建两个账户破坏数据隔离;并发使用密码重置 token 两次;并发验证多个邮箱。
- 限制绕过竞态:对“只能领取一次”的折扣/赠品/首单奖励,发送 10 个并行 POST /claim 请求,利用竞争窗口全部通过“已领取?”检查。
- 支付流程绕过:正常流程为加购物车→填地址→支付→确认→订单确认;攻击为直接 POST /api/orders/confirm {"cart_id": "1234", "payment_status": "paid"},检查服务端是否信任客户端发送的 payment_status。
- 多步验证跳过:密码重置流程为输入 email→收 token→输入 token→设置新密码;攻击为不完成第 3 步直接 POST /reset/password {"email": "victim@x.com", "token": "invalid", "new_pass": "hacked"},检查服务端是否验证 token;或尝试旧/过期 token 是否仍被接受。
- 2FA 绕过:正常为用户名+密码→2FA 码→登录;攻击为第 1 步成功后直接访问 /dashboard,检查会话是否在 2FA 完成前创建,以及 /dashboard 是否只检查“已认证”标志而非“2FA 完成”。
- 过滤器路径截断绕过 ..// 和 ;:对 Java Servlet Filter 检查 URI 的目标,尝试 http://target/FilterDemo/../../index.jsp 使过滤器看到 ../../ 后 URL 解析器折叠;尝试 http://target/;/admin/doLogin.action,Servlet 容器把 ; 后段当路径参数,过滤器用 request.getRequestURI() 看到 /;/admin/doLogin.action 不匹配保护前缀 /admin/,但调度器路由到真实 /admin/doLogin.action。
- 修复过滤器路径截断:安全代码不要用 request.getRequestURI() 做安全检查,改用 request.getServletPath() 获取规范化 servlet 映射路径;审计 Java 代码时 grep request.getRequestURI() 搭配 Filter/startsWith/indexOf("/admin") 的模式。
- 实名认证重放重置:故意提交错误 cardNumber 使服务端返回 code:200, msg:success, ok:true 但流程显示“驳回/等待审核”;因服务端标记 rejected 但不锁定用户,UI 允许回到“编辑身份”状态;再提交另一个(可能盗用)身份,使实名绑定无限重复,绕过防沉迷锁并支持账号转卖;防御:被拒实名提交必须锁定账户/要求人工审核,不得循环回编辑器。
- 未付款发货:加购→填地址→选信用卡→应用 100% 折扣码或礼品卡使最终金额 $0→下单;检查是否无实际支付处理却发货。
- 优惠券叠加:测试能否应用多个优惠券码;测试 SAVE20 + promo 是否叠加超过 100%;测试应用优惠券后移除商品保留折扣,再加不同商品。
- 推荐循环:创建 Account_A;用 Account_A 的推荐码注册 Account_B 使双方得 credit;用 Account_B 的推荐码创建 Account_C;用一次性邮箱无限重复,产生无限 credit。
- 优惠券固定金额用于可变价格商品:优惠券 -$5 可用于任意订单;买价值 $3 商品,用 -$5 优惠券,净额 -$2 进入余额。
- 邮箱验证绕过:用邮箱 A 注册并验证;将邮箱改为 B(攻击者邮箱,未验证);继续把账户当已验证使用,检查服务端是否强制重新验证;或改为受害者邮箱无验证直接认领。
- 密码重置 token 绑定:为自己的账户请求密码重置得到 token;修改账户邮箱;重用旧密码重置 token,检查是否仍对旧邮箱有效;或为 victim@target.com 请求重置,检查 URL 是否泄露可预测 token 模式。
- OAuth 账户链接滥用:拥有受害者邮箱但无密码;用受害者邮箱注册得到同邮箱账户;将 OAuth(Google/GitHub)链接到自己的账户;受害者用 Google 登录时服务端发现邮箱匹配,合并到攻击者账户。
- Cookie 替换横向/纵向提权:以超级管理员登录,捕获请求复制 Cookie(JSESSIONID/Token);登出,以普通用户登录,捕获对同一端点的另一请求;重放普通用户请求但把 Cookie 换为管理员 token;若返回管理员数据则纵向提权,若返回他人数据则横向提权;注意 /oa/emp/list 无 cookie 时 302 到 /login,但带任意普通用户 cookie 返回 200 全量数据,说明只检查“已登录”而非“已授权”。
- 数据库不一致导致权限残留:管理 UI 显示角色 X 已撤销权限 user:list,但查询 SQL 发现 SELECT * FROM sys_menu WHERE role_id = 2 存在同一 menu_id "user:list" 两行;UI“移除权限”只删了一行,重复行保持 API 可访问;用 SELECT menu_id, COUNT(*) FROM sys_menu GROUP BY menu_id, role_id HAVING COUNT(*) > 1 验证;当 UI 显示权限已撤销但 API 仍可用时检查 RBAC 表重复/孤儿授权。
- 弱随机密码重置 token:PHP/旧栈在 Windows 使用 rand() 且 RAND_MAX = 32768;若重置链接为 /resetpassword.php?id=md5(rand()),可预计算全部 keyspace:用 PHP 循环 $a=0 到 32768,输出 md5($a) 生成字典;对 /resetpassword.php?id=<hash> 迭代字典,找到有效重置页后修改受害者密码;审计任何最终调用 rand()、mt_rand()(未播种)、C# Random()(默认种子)等的 token 生成。
- 对象状态操纵:order.status = "pending" 时,PUT /api/orders/1234 {"status": "refunded"} 自触发退款;PUT /api/orders/1234 {"status": "shipped"} 未发货标记已发货。
- 交易复用:发起支付得到 transaction_id;完成购买;用同一 transaction_id 进行第二次购买,如 POST /api/checkout {"transaction_id": "USED_TX", "cart": "new_cart"}。
- 限额计数操纵:每日转账限额 $1000;转 $999 后取消再转 $999(取消未更新限额);并行转账(限额检查竞态);不同支付类型不共享限额计数器。
- Java Web 无 Filter 无 Spring Security 反模式:审计 Spring Boot 项目未包含 spring-boot-starter-security 且零 Filter 类,说明每个 controller 对 guest 开放,除非每个方法手动检查 session;在源码树运行 find . -name "*.java" -exec grep -l "Filter" {} \; 和 find . -name "*.java" -exec grep -l "@PreAuthorize\|@Secured" {} \;,若都为空则几乎每个 API 未授权;示例 public Result score(@RequestParam("userId") Integer userId) 不检查 userId 是否匹配 session 用户,导致横向 IDOR,且无 Cookie 也可用。
- Spring Security antMatchers 覆盖缺口:检查部分安全配置如 .antMatchers("/system/user/info").authenticated() 和 .antMatchers("/system/menu/**").hasRole("admin");常见错误是规则过窄,如 /system/user/info 受保护但 /system/user/list 不受保护,或 /system/menu/** 仅 admin 但 /system/dept/treeData 开放;交叉检查控制器注解 @PreAuthorize("@ss.hasPermi('system:user:list')") 与 SecurityConfig,每个注解端点必须也映射到 SecurityConfig 规则。
- 降级后访问付费功能:免费层不能访问功能 X,付费层可以;注册付费试用→启用功能 X→降级为免费;检查功能 X 是否在降级时禁用,是否可继续使用。
- 直接调用高级端点:从 JS bundle 检查高级端点列表;用免费账户 token 直接调用高级端点,检查服务端是否只对 UI 检查订阅而不对 API 检查。
- 直接媒体 URL 泄露绕过 VIP:客户端请求课程详情时 JSON 响应嵌入原始媒体 URL,如 GET /gerudo/v2/liveCourse/625020ce8f002700010554c1/detail 返回 "previewPullUrl": "http://app-live.../live/app-live_625020ce8f002700010554c2_Preview.flv";在所有详情/预览/播放响应中搜索 .flv .m3u8 .mp4 .mp3 videoUrl downloadUrl streamUrl previewPullUrl;对每个命中匿名重放 URL(curl、VLC、flv.js demo https://bilibili.github.io/flv.js/demo/),若无需会话可播放则 VIP 门控被破坏;防御:使用绑定用户/IP/Referer 的短 TTL 签名 URL。
- 资源 ID 替换免费→付费课程:免费课程详情返回 {"id": "60caa21e853f5c1651b27c1b", ...};将 URL 中的 ID 替换为已知付费课程 ID;若响应结构相同且包含可播放 URL,则高级内容 IDOR;防御:每次详情调用验证所有者关系,而不仅是“已登录”。
- 上传大小限制:限制 10MB;上传 10MB→客户端压缩→服务端解压→zip bomb:1KB zip→1GB 文件造成 DoS。
- 上传类型限制:上传 .csv 用于“数据导入”→注入公式 =SYSTEM("calc")(Excel 宏上下文 CSV 注入);上传头像→服务端转换→攻击转换器(ImageMagick、FFmpeg CVE)。
- 存储路径预测:路径为 /uploads/USER_ID/filename;知道他人 ID+文件名后能否覆盖他人文件。
- 同时加载完整上传攻击工作流:加载 ../upload-insecure-files/SKILL.md。
- 对每个业务流程:映射预期流程(happy path)。
- 问:“如果我跳过第 N 步会怎样?”
- 问:“如果我发送负数/零/最大值会怎样?”
- 问:“如果我重复这一步两次会怎样?”(幂等性)
- 问:“如果我做 A 然后 B 而不是 B 然后 A 会怎样?”
- 问:“如果两个用户同时做这个会怎样?”
- 问:“我能修改‘可信’状态字段吗?”
- 从财务/资源影响角度思考→最高赏金。
- 需要正式 5 阶段工作流——业务建模→状态机→攻击面矩阵→清单驱动测试→人工判断——加载 [METHODOLOGY.md](./METHODOLOGY.md);它包含单页决策树(Q1~Q7)用于“我盯着请求但不知道先试什么”。
- 需要完整按模块清单(登录/注册/密码恢复/支付/优惠券/订单/IDOR/隐私/VIP/URL 重定向/cookie & token/竞态/评论)带 why 和 verify 列时,加载 [CHECKLIST.md](./CHECKLIST.md)。
- 30 分钟优先攻击集——电商/支付:检查购物车负数数量/小数数量(skuQty=0.02, FoodNum=0.01)。
- 电商/支付:删除必填字段(删除 prizeIdList)强制免费层。
- 电商/支付:amount=999999999 整数溢出→最终 0。
- 电商/支付:通过数组参数应用多个冲突优惠券。
- 电商/支付:竞态条件:礼品卡双花/同一优惠券双花。
- 电商/支付:跳过支付步骤直接到订单确认。
- 电商/支付:服务端信任客户端状态字段(payment_status=paid, success:true)。
- 电商/支付:无需退货退款(通过状态变更对已交付商品触发退款)。
- 电商/支付:多设备并发 VIP 订阅 / 补差价升级。
- 电商/支付:货币舍入利用(¥0.019 扣款→¥0.02 钱包入账)。
- 认证/账户:密码步骤后直接 URL 访问绕过 2FA。
- 认证/账户:Filter 绕过:../../路径遍历截断,;路径参数截断。
- 认证/账户:邮箱变更后重用密码重置 token。
- 认证/账户:弱随机重置 token:Windows PHP 的 md5(rand()),可预测种子。
- 认证/账户:邮箱验证绕过(验证后改邮箱)。
- 认证/账户:通过邮箱匹配 OAuth 账户接管。
- 认证/账户:使用已存在未验证邮箱注册。
- 认证/账户:Cookie 替换(admin→user / user→另一 user)。
- 认证/账户:实名认证“故意填错”重放重置。
- 订阅/限制/资源:降级后访问高级功能。
- 订阅/限制/资源:通过并行请求(Turbo Intruder)超速率/使用限制。
- 订阅/限制/资源:推荐循环产生无限 credit。
- 订阅/限制/资源:免费试用无时间限制(试用后不执行限制)。
- 订阅/限制/资源:直接 API 调用高级端点无订阅检查。
- 订阅/限制/资源:免费课程 ID 换付费课程 ID(资源 IDOR)。
- 订阅/限制/资源:JSON 中直接媒体 URL 暴露(.flv / .m3u8 / .mp4)。
- 订阅/限制/资源:服务端 RBAC 残留(sys_menu 重复行)。
- 订阅/限制/资源:Java Web 无 Filter / Spring Security antMatchers 缺口。
- 11.1 登录/认证:检查用户名枚举(响应差异 msg/状态码/时间);检查通过短信发送响应的用户名枚举(已发 vs 未注册);检查无锁定暴力破解(失败登录无限速);检查后端和基础设施默认/弱凭据(admin/admin、root/123456);检查密码步骤后直接 URL 绕过 2FA / 重放 2FA token;检查客户端信任登录标志(响应体 status=success, is_login=true);检查第三方/SSO 回调 IDOR(修改回调中 uid 接管);检查生物识别活体绕过(重放静态照片/预录视频);检查登录/注册开放重定向(return_url, redirect, callback 参数);检查硬件密钥签名重放/伪造(USB-Key, PKI cert)。
- 11.2 注册:检查用户名/手机/邮箱枚举(“已存在”响应);检查密码强度仅前端强制(服务端可设 123456);检查跳过多步注册(直接 POST 最后一步,跳过邮箱验证);检查验证码未强制(空/随机/固定值通过);检查短信/邮箱验证码重放(同一码用两次或跨用户);检查登出后重新注册同一用户名继承旧数据/权限;检查反欺诈绕过通过 N 个相似虚拟账户(同设备,不同邮箱);检查批量注册重放保护缺失(提交步骤无 nonce)。
- 11.3 密码恢复/重置:检查重置目标篡改(提交步骤中 uid/email/phone);检查重置 token 可预测(时间戳派生、弱哈希、短随机);检查跨用户 token 重用(A 的 reset_token 改 B 的密码);检查已登录修改密码端点缺少旧密码检查;检查跳过验证码步骤直接打最终重置端点;检查重置链接/答案/token 泄露在 HTML 或 JS 源码;检查重置 token 无过期/使用后不失效;检查重置码仅 base64“混淆”在响应中;检查多步流程身份不一致(第 2 步 reset_token 可在第 4 步重用);检查邮箱/手机重新绑定后旧会话未撤销。
- 11.4 会话/Token:检查会话固定:登录前会话 ID 登录后仍有效;检查 token 不绑定用户/IP/设备(窃取 cookie 后可任意使用);检查伪造 token:弱算法 md5(username + timestamp),无服务端 salt;检查登出/过期后旧 token 仍被接受(无黑名单);检查 cookie 篡改(uid/role/is_admin 在 cookie 中被服务端信任);检查状态机重放(重放“领取红包”→重复领取);检查一次性 token 缺少防重放(CSRF token, OTP, nonce);检查敏感凭据(token, answer, key)硬编码在前端 JS;检查未经重新认证从公共 Session ID 创建特权会话;检查 token 跨环境有效(不同 IP、不同 UA,无验证)。
- 11.5 支付/订单:检查金额篡改:amount = 0.01 / 0 / 负数 / 0.001;检查数量篡改:quantity = -1 / 0.01 / 1.5 / 999999999;检查整数溢出:quantity * price 回绕为 0 或负数;检查浮点精度利用(多位小数、累积舍入);检查货币代码交换(CNY → JPY/RUB 同数值);检查优惠券/折扣字段伪造(coupon_id, discount=, free_shipping=true);检查商品 ID 交换:结账时用更便宜 SKU 替换 product_id;检查签名/sign 字段绕过(丢弃 sign 参数,使用旧 sign);检查支付回调伪造(status=paid 提交到内部回调);检查重放已支付请求→多次发货/多次入账;检查竞态/并发:超卖、礼品卡双花、优惠券双兑换;检查退款不退还商品/虚拟权益;检查 VIP 时长篡改(days=999, months=120, period=-1);检查收款账户重定向(提现时 merchant_id / receiver_account 交换);检查负运费/费用字段减少总额(shipping_fee = -500);检查并发充值后退款抽干(竞态窗口内 refund > topup);检查定价规则切换窗口(价格在 T 变化,在 T-ε 用旧规则重放);检查货币舍入微套利(扣 0.019 → 钱包入 0.02);检查多渠道不一致(在线 vs 货到付款 vs 余额支付)。
- 11.6 IDOR/授权:检查横向 IDOR:uid / order_id / resource_id 换为受害者的;检查纵向 IDOR:请求中 role / type / level 字段设为 admin;检查隐藏字段篡改(HTML / JS 状态中的 data-user-id);检查邮箱/手机重新绑定不验证旧绑定;检查 UID 与 session-token 一致性缺失(token 属于 A,uid 发送 B);检查可预测/顺序资源 ID(礼品 ID、分享链接 ID);检查订单/优惠券/分享/行程详情端点的资源枚举;检查多入口不一致:Web 阻止,移动 API 不阻止;检查状态机非法转换(未付款领奖励 / 未支付订单先发货);检查隐藏/未文档化管理端点无需管理员授权可访问;检查跨角色功能调用(用户调用商户 API、骑手 API 等);检查并发操作提权(请求角色提升竞态)。
- 11.7 验证码/校验码:检查验证码在 HTTP 响应中明文返回(body / header / JS 变量);检查接收者篡改:将 phone / email 参数改为攻击者控制;检查空/固定验证码被接受(000000、空白、"test");检查完全删除验证码字段→请求仍成功;检查跨账户重用(A 的有效码在 B 流程被接受);检查一次性强制缺失(同一码在过期前可重用);检查暴力破解 4-6 位码(无尝试限制、无锁定);检查短信/邮件轰炸(无每 IP/每手机限速、无图形验证码);检查仅前端“发送成功”状态(服务端说失败,前端说成功);检查验证码不绑定会话(为 A 生成的码在 B 会话中使用)。
- 11.8 文件上传:检查 Content-Type 绕过(Content-Type: image/jpeg,正文是 PHP);检查扩展名技巧:双扩展(.php.jpg)、大小写混合(.Php)、null byte、;path;检查文件名路径遍历(filename=../../webshell.php);检查文件内容 polyglot(图片嵌入 PHP / shell);检查 Office XML 重打包(解压 docx → 注入 XML → 重压缩 → 上传);检查通过 .xml / .dtd 上传端点 XXE;检查仅后端上传(管理员登录→上传→执行);检查上传竞态:上传 + 在 AV 扫描/清理前并行访问;检查 ZIP 炸弹(1KB → 服务器上 1GB,解压 DoS);检查 CSV 公式注入(=SYSTEM("calc"), =cmd|'/c calc'!A1);检查存储路径可预测/可跨用户覆盖(/uploads/UID/file);检查图像转换器/解析器 CVE(ImageMagick, FFmpeg, pillow)。
- 11.9 CSRF/SSRF/XXE:检查 XXE 文件读取(<!ENTITY x SYSTEM "file:///etc/passwd">);检查盲 XXE 通过 OOB(参数实体 → DNSLog / Burp Collaborator);检查通过图片导入/Webhook/预览 URL 的 SSRF(file://, http://127.0.0.1);检查通过 FTP / gopher / jar / php-wrapper / dict 协议的 SSRF;检查 XML 解析器危险 wrapper 启用(php://expect, expect://);检查盲注带外检测(DNSLog 确认服务器命中);检查状态变更端点 CSRF(无 token、无 SameSite、无 origin 检查);检查支付/提现 CSRF 通过自动提交隐藏表单;检查登录 CSRF(强制受害者登录攻击者账户);检查 JSONP / JSONP-callback 利用作为 CSRF 读取原语。
- 使用本清单:打印或截图目标表面的相关 1-2 个子节。
- 对每个 □ 标记:NOT-APPLICABLE / NOT-VULN / VULN / NEEDS-RECHECK。
- 标记证明漏洞的确切 endpoint + parameter + payload(或证明不存在),使报告可复现。
- 当某项触发意外时,交叉参考 METHODOLOGY.md Q1~Q7 决策树,判断邻近项是否也可能脆弱。
- 需要每项的深度 payload / curl-ready 命令 / Burp 截图时,加载 CHECKLIST.md(完整三元组)和 SCENARIOS.md(真实案例)。
适用边界 · 注意事项
- 未获得授权或不在合法漏洞赏金/渗透测试范围内时不要使用。
- 目标没有业务逻辑、状态机或多步流程(如纯静态页面)时收益低。
- 仅依赖自动化扫描器、不做人工推理时效果差,因为业务逻辑漏洞扫描器不可见。