mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-06-04 13:28:03 +02:00
402 lines
7.1 KiB
Markdown
402 lines
7.1 KiB
Markdown
---
|
||
name: business-logic-testing
|
||
description: 业务逻辑漏洞测试的专业技能和方法论
|
||
version: 1.0.0
|
||
---
|
||
|
||
# 业务逻辑漏洞测试
|
||
|
||
## 概述
|
||
|
||
业务逻辑漏洞是应用程序在业务处理流程中的设计缺陷,可能导致未授权操作、数据篡改、资金损失等。本技能提供业务逻辑漏洞的检测、利用和防护方法。
|
||
|
||
## 漏洞类型
|
||
|
||
### 1. 工作流绕过
|
||
|
||
**跳过验证步骤:**
|
||
- 直接访问最终步骤
|
||
- 修改步骤顺序
|
||
- 重复执行步骤
|
||
|
||
### 2. 价格操作
|
||
|
||
**负数价格:**
|
||
- 输入负数金额
|
||
- 导致账户余额增加
|
||
|
||
**价格篡改:**
|
||
- 修改前端价格
|
||
- 修改API请求中的价格
|
||
|
||
### 3. 数量限制绕过
|
||
|
||
**负数数量:**
|
||
- 输入负数
|
||
- 可能导致库存增加
|
||
|
||
**超出限制:**
|
||
- 修改数量限制
|
||
- 批量操作绕过
|
||
|
||
### 4. 时间竞争
|
||
|
||
**并发请求:**
|
||
- 同时发送多个请求
|
||
- 绕过单次限制
|
||
|
||
### 5. 状态操作
|
||
|
||
**状态回退:**
|
||
- 将已完成订单改为待支付
|
||
- 修改订单状态
|
||
|
||
## 测试方法
|
||
|
||
### 1. 工作流分析
|
||
|
||
**识别业务流程:**
|
||
- 注册流程
|
||
- 购买流程
|
||
- 提现流程
|
||
- 审核流程
|
||
|
||
**测试步骤跳过:**
|
||
```
|
||
正常流程: 步骤1 → 步骤2 → 步骤3
|
||
测试: 直接访问步骤3
|
||
测试: 步骤1 → 步骤3(跳过步骤2)
|
||
```
|
||
|
||
### 2. 参数篡改
|
||
|
||
**修改关键参数:**
|
||
```http
|
||
POST /api/purchase
|
||
{
|
||
"product_id": 123,
|
||
"quantity": 1,
|
||
"price": 100.00 # 修改为 0.01
|
||
}
|
||
```
|
||
|
||
**负数测试:**
|
||
```json
|
||
{
|
||
"quantity": -1,
|
||
"price": -100.00
|
||
}
|
||
```
|
||
|
||
### 3. 并发测试
|
||
|
||
**同时发送请求:**
|
||
```python
|
||
import threading
|
||
import requests
|
||
|
||
def purchase():
|
||
requests.post('https://target.com/api/purchase',
|
||
json={'product_id': 123, 'quantity': 1})
|
||
|
||
# 同时发送10个请求
|
||
for i in range(10):
|
||
threading.Thread(target=purchase).start()
|
||
```
|
||
|
||
### 4. 状态修改
|
||
|
||
**修改订单状态:**
|
||
```http
|
||
PATCH /api/order/123
|
||
{
|
||
"status": "completed" # 修改为已完成
|
||
}
|
||
```
|
||
|
||
**回退状态:**
|
||
```http
|
||
PATCH /api/order/123
|
||
{
|
||
"status": "pending" # 从已完成回退到待支付
|
||
}
|
||
```
|
||
|
||
## 利用技术
|
||
|
||
### 价格操作
|
||
|
||
**负数价格:**
|
||
```json
|
||
{
|
||
"product_id": 123,
|
||
"price": -100.00,
|
||
"quantity": 1
|
||
}
|
||
```
|
||
|
||
**修改前端价格:**
|
||
```javascript
|
||
// 前端代码
|
||
const price = 100.00;
|
||
|
||
// 修改为
|
||
const price = 0.01;
|
||
```
|
||
|
||
**API价格修改:**
|
||
```http
|
||
POST /api/checkout
|
||
{
|
||
"items": [
|
||
{
|
||
"product_id": 123,
|
||
"price": 0.01, # 原价100.00
|
||
"quantity": 1
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 数量限制绕过
|
||
|
||
**负数数量:**
|
||
```json
|
||
{
|
||
"product_id": 123,
|
||
"quantity": -10 # 可能导致库存增加
|
||
}
|
||
```
|
||
|
||
**超出限制:**
|
||
```json
|
||
{
|
||
"product_id": 123,
|
||
"quantity": 999999 # 超出单次购买限制
|
||
}
|
||
```
|
||
|
||
### 优惠券滥用
|
||
|
||
**重复使用:**
|
||
```http
|
||
POST /api/checkout
|
||
{
|
||
"coupon": "DISCOUNT50",
|
||
"items": [...]
|
||
}
|
||
|
||
# 重复使用同一优惠券
|
||
```
|
||
|
||
**未激活优惠券:**
|
||
```http
|
||
POST /api/checkout
|
||
{
|
||
"coupon": "EXPIRED_COUPON", # 使用过期优惠券
|
||
"items": [...]
|
||
}
|
||
```
|
||
|
||
### 提现漏洞
|
||
|
||
**负数提现:**
|
||
```json
|
||
{
|
||
"amount": -1000.00 # 可能导致账户余额增加
|
||
}
|
||
```
|
||
|
||
**超出余额:**
|
||
```json
|
||
{
|
||
"amount": 999999.00 # 超出账户余额
|
||
}
|
||
```
|
||
|
||
### 时间竞争
|
||
|
||
**并发购买:**
|
||
```python
|
||
import threading
|
||
import requests
|
||
|
||
def buy():
|
||
requests.post('https://target.com/api/purchase',
|
||
json={'product_id': 123, 'quantity': 1})
|
||
|
||
# 限时抢购,并发请求
|
||
for i in range(100):
|
||
threading.Thread(target=buy).start()
|
||
```
|
||
|
||
## 绕过技术
|
||
|
||
### 前端验证绕过
|
||
|
||
**直接调用API:**
|
||
- 绕过前端JavaScript验证
|
||
- 直接发送API请求
|
||
|
||
**修改请求:**
|
||
- 使用Burp Suite拦截
|
||
- 修改参数后发送
|
||
|
||
### 状态码分析
|
||
|
||
**观察响应:**
|
||
- 200 OK - 可能成功
|
||
- 400 Bad Request - 参数错误
|
||
- 403 Forbidden - 权限不足
|
||
- 500 Internal Server Error - 服务器错误
|
||
|
||
### 错误信息利用
|
||
|
||
**从错误信息获取信息:**
|
||
```
|
||
错误: "余额不足,当前余额: 100.00"
|
||
→ 可以获取账户余额信息
|
||
```
|
||
|
||
## 工具使用
|
||
|
||
### Burp Suite
|
||
|
||
**使用Repeater:**
|
||
1. 拦截业务请求
|
||
2. 修改关键参数
|
||
3. 观察响应
|
||
|
||
**使用Intruder:**
|
||
1. 标记参数
|
||
2. 使用Payload列表
|
||
3. 批量测试
|
||
|
||
### 自定义脚本
|
||
|
||
```python
|
||
import requests
|
||
import json
|
||
|
||
def test_price_manipulation():
|
||
# 测试价格修改
|
||
for price in [0.01, -100, 0, 999999]:
|
||
data = {
|
||
"product_id": 123,
|
||
"price": price,
|
||
"quantity": 1
|
||
}
|
||
response = requests.post('https://target.com/api/purchase',
|
||
json=data)
|
||
print(f"Price {price}: {response.status_code}")
|
||
|
||
test_price_manipulation()
|
||
```
|
||
|
||
## 验证和报告
|
||
|
||
### 验证步骤
|
||
|
||
1. 确认可以绕过业务逻辑限制
|
||
2. 验证可以执行未授权操作
|
||
3. 评估影响(资金损失、数据篡改等)
|
||
4. 记录完整的POC
|
||
|
||
### 报告要点
|
||
|
||
- 漏洞位置和业务流程
|
||
- 可执行的未授权操作
|
||
- 完整的利用步骤和PoC
|
||
- 修复建议(服务端验证、业务规则检查等)
|
||
|
||
## 防护措施
|
||
|
||
### 推荐方案
|
||
|
||
1. **服务端验证**
|
||
```python
|
||
def process_purchase(product_id, quantity, price):
|
||
# 从数据库获取真实价格
|
||
real_price = db.get_product_price(product_id)
|
||
|
||
# 验证价格
|
||
if price != real_price:
|
||
raise ValueError("Price mismatch")
|
||
|
||
# 验证数量
|
||
if quantity <= 0:
|
||
raise ValueError("Invalid quantity")
|
||
|
||
# 处理购买
|
||
process_order(product_id, quantity, real_price)
|
||
```
|
||
|
||
2. **状态机验证**
|
||
```python
|
||
class OrderState:
|
||
PENDING = "pending"
|
||
PAID = "paid"
|
||
SHIPPED = "shipped"
|
||
COMPLETED = "completed"
|
||
|
||
TRANSITIONS = {
|
||
PENDING: [PAID],
|
||
PAID: [SHIPPED],
|
||
SHIPPED: [COMPLETED]
|
||
}
|
||
|
||
def can_transition(self, from_state, to_state):
|
||
return to_state in self.TRANSITIONS.get(from_state, [])
|
||
```
|
||
|
||
3. **并发控制**
|
||
```python
|
||
import threading
|
||
|
||
lock = threading.Lock()
|
||
|
||
def process_order(order_id):
|
||
with lock:
|
||
# 检查订单状态
|
||
order = db.get_order(order_id)
|
||
if order.status != 'pending':
|
||
raise ValueError("Order already processed")
|
||
|
||
# 处理订单
|
||
process(order)
|
||
```
|
||
|
||
4. **业务规则验证**
|
||
```python
|
||
def validate_business_rules(order):
|
||
# 验证数量限制
|
||
if order.quantity > MAX_QUANTITY:
|
||
raise ValueError("Quantity exceeds limit")
|
||
|
||
# 验证价格范围
|
||
if order.price <= 0:
|
||
raise ValueError("Invalid price")
|
||
|
||
# 验证库存
|
||
if order.quantity > get_stock(order.product_id):
|
||
raise ValueError("Insufficient stock")
|
||
```
|
||
|
||
5. **审计日志**
|
||
```python
|
||
def log_business_action(user_id, action, details):
|
||
log_entry = {
|
||
"user_id": user_id,
|
||
"action": action,
|
||
"details": details,
|
||
"timestamp": datetime.now()
|
||
}
|
||
db.log_action(log_entry)
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
- 仅在授权测试环境中进行
|
||
- 避免对业务造成实际影响
|
||
- 注意不同业务流程的差异
|
||
- 测试时注意数据一致性 |