Skip to content
SecureKhan
Go back

Business Logic Vulnerabilities: What Scanners Miss

Business Logic Vulnerabilities Explained with Real Examples

TL;DR: Business logic flaws are application-specific vulnerabilities where the code works as designed but the design itself is insecure. Automated scanners miss these because there’s no signature to detect - only human understanding of how the application SHOULD work reveals the flaw.


Table of Contents

Open Table of Contents

Quick Reference

Business Logic Vulnerability Categories

CategoryExampleImpact
Price ManipulationChanging price in requestFinancial loss
Workflow BypassSkipping payment stepUnauthorized access
Race ConditionsDouble-spending rewardsFinancial loss
Limit BypassExceeding quotasResource abuse
Privilege EscalationRole manipulationUnauthorized access
Feature AbuseReferral fraudFinancial loss
Trust Boundary ViolationClient-side validation onlyVarious

Testing Approaches

ApproachWhat to Test
Workflow AnalysisCan steps be skipped/reordered?
Parameter TamperingCan values be manipulated?
Race ConditionsDoes timing affect outcome?
Limit TestingAre limits enforced server-side?
Role TestingCan roles be escalated?
State ManipulationCan state be altered improperly?

What Are Business Logic Flaws

Definition

Business logic vulnerabilities occur when an application’s legitimate functionality can be abused in unintended ways. The code executes correctly - there’s no SQL injection or XSS - but the business rules are flawed or missing.

Technical Vulnerability          Business Logic Vulnerability
─────────────────────           ─────────────────────────────
Code does something             Code does exactly what it's
WRONG (bug)                     supposed to, but the DESIGN
                                is flawed

Example: SQL Injection          Example: Apply coupon after
- Code: SELECT * FROM users       payment is calculated but
  WHERE id = '$input'             before it's finalized
- Input: ' OR 1=1--
- Bug in code execution         - No code bug
                                - Missing business rule

Why They’re Dangerous

  1. Invisible to scanners - No signature or pattern to detect
  2. Application-specific - Unique to each business
  3. Often high impact - Direct financial or access implications
  4. Easy to exploit - Usually just parameter manipulation
  5. Hard to fix - May require business process redesign

Categories of Business Logic Flaws

┌─────────────────────────────────────────────────────────────┐
│              BUSINESS LOGIC VULNERABILITY TYPES              │
├─────────────────────────────────────────────────────────────┤
│  FINANCIAL                                                  │
│  • Price manipulation                                       │
│  • Discount/coupon abuse                                    │
│  • Currency rounding exploitation                           │
│  • Negative quantity/price                                  │
├─────────────────────────────────────────────────────────────┤
│  WORKFLOW                                                   │
│  • Step skipping                                            │
│  • Out-of-order execution                                   │
│  • State manipulation                                       │
│  • Incomplete transaction abuse                             │
├─────────────────────────────────────────────────────────────┤
│  AUTHORIZATION                                              │
│  • Horizontal privilege escalation                          │
│  • Vertical privilege escalation                            │
│  • Function-level access control                            │
├─────────────────────────────────────────────────────────────┤
│  RATE/LIMIT                                                 │
│  • Rate limit bypass                                        │
│  • Quota exhaustion                                         │
│  • Resource abuse                                           │
├─────────────────────────────────────────────────────────────┤
│  TRUST                                                      │
│  • Client-side validation trust                             │
│  • Insecure direct object references                        │
│  • Predictable resource locations                           │
└─────────────────────────────────────────────────────────────┘

Why Automation Fails

Scanner Limitations

What Scanners Do WellWhat They Can’t Do
Pattern matching (SQLi, XSS)Understand business context
Known vulnerability signaturesRecognize missing logic
Fuzzing for crashesEvaluate business impact
Configuration checksDetect workflow flaws

Example: Coupon Logic Flaw

Consider this vulnerable checkout flow:

Normal Flow:
1. Add items to cart        → Cart total: $100
2. Apply coupon "SAVE50"    → Discount: $50
3. Enter payment info       → Amount: $50
4. Complete purchase        → Charged: $50

Attack Flow:
1. Add items to cart        → Cart total: $100
2. Enter payment info       → Amount: $100
3. Apply coupon "SAVE50"    → Discount: $50
4. Complete purchase        → Charged: $50 but
                               coupon applied AFTER
                               payment processing started

Why scanners miss this:

The Human Element

Business logic testing requires:

  1. Understanding the application - What is it supposed to do?
  2. Threat modeling - How could this be abused?
  3. Creative thinking - What if I do X instead of Y?
  4. Business knowledge - What’s the financial/security impact?

Real-World Attack Examples

Example 1: E-commerce Price Manipulation

Scenario: Online store allows adding items to cart

Vulnerable Request:

POST /api/cart/add HTTP/1.1

{
  "product_id": "12345",
  "quantity": 1,
  "price": 99.99
}

Attack:

POST /api/cart/add HTTP/1.1

{
  "product_id": "12345",
  "quantity": 1,
  "price": 0.01
}

Root Cause: Server trusts client-provided price instead of looking up from database.

Fix: Server-side price lookup from product database; never trust client-provided prices.


Example 2: Referral Program Abuse

Scenario: App gives $10 credit for each friend referred

Normal Flow:

  1. User A shares referral link
  2. User B signs up via link
  3. Both get $10 credit
  4. User B makes a purchase

Attack Flow:

  1. Attacker creates account
  2. Attacker gets referral link
  3. Attacker creates 100 fake accounts via referral link
  4. Attacker earns $1,000 in credits
  5. Credits used for real purchases

Root Cause: No validation that referred users are legitimate (unique email domains, phone verification, purchase requirement)

Fix:


Example 3: Race Condition in Funds Transfer

Scenario: Banking app allows transfers between accounts

Normal Flow:

Account A: $100
Account B: $0

Transfer $100 from A to B:
1. Check A balance (100) >= 100 ✓
2. Deduct 100 from A (0)
3. Add 100 to B (100)

Result: A=$0, B=$100

Attack Flow (Race Condition):

Account A: $100

Request 1 (T=0ms):           Request 2 (T=1ms):
1. Check balance: $100       1. Check balance: $100
2. Balance >= 100? YES       2. Balance >= 100? YES
3. Deduct 100                3. Deduct 100
4. Add to B                  4. Add to C

Result: A=-$100 (!), B=$100, C=$100

Root Cause: Non-atomic operations; balance check and deduction not synchronized

Fix:

-- Secure implementation
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE id = 'A' FOR UPDATE;
-- Lock prevents concurrent reads
UPDATE accounts SET balance = balance - 100 WHERE id = 'A' AND balance >= 100;
-- Check affected rows
UPDATE accounts SET balance = balance + 100 WHERE id = 'B';
COMMIT;

Example 4: Multi-Step Workflow Bypass

Scenario: Insurance claim process

Intended Flow:

Step 1: Submit claim form      → claimId created
Step 2: Upload documents       → documents attached
Step 3: Manager approval       → status = "approved"
Step 4: Finance processing     → payment initiated
Step 5: Payment complete       → status = "paid"

Attack:

Step 1: Submit claim form      → Get claimId
Step 4: Direct API call        → Skip steps 2-3
        POST /api/claims/{id}/process

Result: Claim processed without documents or approval

Root Cause: Each step doesn’t verify completion of prior steps

Fix:

def process_claim(claim_id):
    claim = get_claim(claim_id)

    # Verify all prerequisites
    if claim.status != "approved":
        raise BusinessError("Claim not yet approved")
    if not claim.has_documents:
        raise BusinessError("Documents not uploaded")
    if not claim.manager_approval:
        raise BusinessError("Missing manager approval")

    # Now process
    process_payment(claim)

Example 5: Negative Quantity Attack

Scenario: E-commerce shopping cart

Normal Request:

POST /api/cart/update
{
  "product_id": "123",
  "quantity": 2
}

Response: Cart total: $200

Attack:

POST /api/cart/update
{
  "product_id": "123",
  "quantity": -5
}

Response: Cart total: -$500 (refund!)

Root Cause: No validation for negative quantities

Fix:

def update_cart(product_id, quantity):
    if quantity < 0:
        raise ValidationError("Quantity must be positive")
    if quantity > MAX_QUANTITY:
        raise ValidationError("Exceeds maximum quantity")
    # Proceed with update

Example 6: Password Reset Token Prediction

Scenario: Password reset functionality

Vulnerable Implementation:

def generate_reset_token(user_id):
    # INSECURE: Predictable token
    timestamp = int(time.time())
    token = md5(f"{user_id}:{timestamp}").hexdigest()
    return token

Attack:

  1. Attacker requests password reset for victim
  2. Note approximate time of request
  3. Brute-force tokens for that time range:
    for ts in range(known_time - 60, known_time + 60):
        token = md5(f"{victim_id}:{ts}").hexdigest()
        try_reset(token)

Root Cause: Token derived from predictable values

Fix:

import secrets

def generate_reset_token(user_id):
    # SECURE: Cryptographically random
    token = secrets.token_urlsafe(32)
    store_token(user_id, token, expiry=15_minutes)
    return token

Testing Methodology

Phase 1: Understand the Application

## Application Understanding Checklist

### Core Functionality
- [ ] What is the main purpose?
- [ ] What workflows exist?
- [ ] What user roles exist?
- [ ] What are the trust boundaries?

### Business Rules
- [ ] Pricing rules (discounts, taxes)
- [ ] Limits and quotas
- [ ] Approval workflows
- [ ] User privileges per role

### State Management
- [ ] What states can entities be in?
- [ ] What transitions are allowed?
- [ ] Who can trigger transitions?

Phase 2: Map Trust Boundaries

┌───────────────────────────────────────────────────────────┐
│                    TRUST BOUNDARIES                        │
├───────────────────────────────────────────────────────────┤
│                                                           │
│   UNTRUSTED                    TRUSTED                    │
│   ──────────                   ─────────                  │
│                                                           │
│   • User input                 • Server-side              │
│   • Browser data               • Database values          │
│   • Client requests            • Validated input          │
│   • URL parameters             • Signed tokens            │
│   • Hidden form fields         • Server session           │
│   • Cookies (unsigned)         • Internal services        │
│                                                           │
│         NEVER TRUST    ──────►    ALWAYS VERIFY          │
└───────────────────────────────────────────────────────────┘

Phase 3: Testing Techniques

Workflow Testing

For each workflow:
1. Map normal steps (1→2→3→4)
2. Try skipping steps (1→4)
3. Try reordering (1→3→2→4)
4. Try repeating steps (1→2→2→2→3→4)
5. Try going backwards (1→2→3→2→4)

Parameter Tampering

For each parameter:
1. Change to different valid value
2. Change to boundary values (0, -1, MAX_INT)
3. Change to null/empty
4. Change type (string → int)
5. Remove parameter entirely
6. Add unexpected parameters

Race Condition Testing

# Using Burp Turbo Intruder or parallel requests
# Send same request multiple times simultaneously

# Bash example:
for i in {1..10}; do
  curl -X POST https://target.com/api/redeem-coupon \
    -d "code=DISCOUNT50" &
done
wait

Phase 4: Document Findings

## Business Logic Finding Template

**Title:** [Short descriptive title]

**Severity:** [Critical/High/Medium/Low]

**Affected Functionality:** [What feature is affected]

**Business Impact:**
- Financial: [Dollar amount if applicable]
- Security: [Access implications]
- Reputation: [Brand impact]

**Steps to Reproduce:**
1. [Step 1]
2. [Step 2]
3. [Step 3]

**Expected Behavior:**
[What should happen]

**Actual Behavior:**
[What does happen]

**Root Cause:**
[Why this happens technically]

**Recommendation:**
[How to fix it]

Mapping to OWASP

OWASP Top 10 Relationship

Business Logic FlawOWASP Category
Price manipulationA04: Insecure Design
Workflow bypassA04: Insecure Design
Missing rate limitsA04: Insecure Design
Race conditionsA04: Insecure Design
IDORA01: Broken Access Control
Privilege escalationA01: Broken Access Control
Insufficient validationA03: Injection (related)

ASVS Business Logic Requirements

From OWASP ASVS 4.0:

V11: Business Logic Verification

V11.1: Business Logic Security
- [ ] 11.1.1: Application processes requests in defined order
- [ ] 11.1.2: Application processes requests within time limits
- [ ] 11.1.3: Application has limits for business actions
- [ ] 11.1.4: Application has anti-automation controls
- [ ] 11.1.5: Application detects and alerts on unusual behavior

V11.2: Transaction Flow
- [ ] 11.2.1: Application enforces transaction workflow steps
- [ ] 11.2.2: Application validates state transitions

Hands-On Lab

Lab: Exploit a Broken Workflow

Scenario: Test an e-commerce checkout process for logic flaws.

Setup: Use OWASP WebGoat or a similar deliberately vulnerable application.

Task 1: Map the Checkout Flow

Document each step:
1. Add items to cart
2. View cart / Modify quantities
3. Enter shipping info
4. Select shipping method
5. Enter payment info
6. Apply discounts/coupons
7. Review order
8. Confirm purchase

Task 2: Test for Workflow Bypass

# Capture each request in Burp
# Try directly calling later steps

# Example: Skip from step 1 to step 8
curl -X POST https://target.com/api/checkout/confirm \
  -H "Cookie: session=abc123" \
  -d '{"order_id": "12345"}'

Task 3: Test for Price Manipulation

# Intercept add-to-cart request
# Modify price parameter

POST /api/cart/add
{
  "product_id": "SKU-001",
  "quantity": 1,
  "price": 0.01  # Changed from 99.99
}

Task 4: Test for Coupon Abuse

Test scenarios:
- [ ] Apply coupon multiple times
- [ ] Apply coupon after payment started
- [ ] Use expired coupon
- [ ] Use coupon for ineligible products
- [ ] Combine multiple coupons
- [ ] Apply coupon via API after checkout UI

Task 5: Test for Race Conditions

# Python concurrent requests
import concurrent.futures
import requests

def redeem_coupon():
    return requests.post(
        'https://target.com/api/coupon/redeem',
        cookies={'session': 'abc123'},
        json={'code': 'ONETIME50'}
    )

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    futures = [executor.submit(redeem_coupon) for _ in range(10)]
    results = [f.result() for f in futures]

# Check how many succeeded
success_count = sum(1 for r in results if r.status_code == 200)
print(f"Successful redemptions: {success_count}")

Interview Questions & Answers

Basic Questions

Q1: What is a business logic vulnerability?

Strong Answer: “A business logic vulnerability is a flaw in the application’s design or implementation of business rules that allows attackers to abuse legitimate functionality for unintended purposes.

Unlike technical vulnerabilities like SQL injection where code executes incorrectly, business logic flaws occur when code works exactly as designed but the design itself is insecure.

For example, an e-commerce site that lets users modify product prices in their cart has a business logic flaw - the code processes the request correctly, but it shouldn’t trust client-provided prices at all.

These are particularly dangerous because automated scanners can’t detect them - they require human understanding of what the application is supposed to do.”

Q2: Why can’t automated scanners find business logic vulnerabilities?

Strong Answer: “Automated scanners work by:

  1. Pattern matching (finding SQL injection syntax)
  2. Fuzzing for errors (unexpected server responses)
  3. Checking known vulnerable versions

Business logic flaws don’t fit these models because:

  • There’s no malicious pattern - requests look legitimate
  • The server responds normally - no errors or crashes
  • The vulnerability is unique to this specific application

A scanner can’t know that applying a coupon after payment processing is wrong - it would need to understand the intended checkout flow. This requires human analysis: understanding the business process, identifying trust assumptions, and creatively testing ways to abuse the design.”

Q3: Give an example of a business logic vulnerability and how to fix it.

Strong Answer: “A common example is race conditions in balance operations.

Vulnerable scenario: A banking app checks if a user has sufficient balance before allowing a transfer. If two transfers are initiated simultaneously, both might pass the balance check before either deduction occurs, allowing more money to be transferred than available.

Technical explanation:

Thread 1: Check $100 >= $100 → TRUE
Thread 2: Check $100 >= $100 → TRUE  (before Thread 1 deducts)
Thread 1: Deduct $100 → Balance = $0
Thread 2: Deduct $100 → Balance = -$100

Fix: Use database transactions with row-level locking:

BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE id=1 FOR UPDATE;
-- This locks the row, blocking other transactions
UPDATE accounts SET balance = balance - 100 WHERE id=1 AND balance >= 100;
COMMIT;

The FOR UPDATE clause prevents concurrent reads of the same row until the transaction completes.”

Intermediate Questions

Q4: How do you approach testing for business logic vulnerabilities?

Strong Answer: “I follow a structured methodology:

Phase 1: Understanding

  • Map all application workflows
  • Document business rules (pricing, limits, permissions)
  • Identify trust boundaries (what’s validated where)
  • Understand user roles and privileges

Phase 2: Threat Modeling

  • For each workflow: What if steps are skipped/reordered?
  • For each input: What if it’s manipulated?
  • For each limit: Is it enforced server-side?
  • For each state transition: Can it be forced?

Phase 3: Active Testing

  • Workflow bypass attempts
  • Parameter tampering
  • Race condition testing
  • Privilege escalation attempts

Phase 4: Documentation

  • Business impact assessment
  • Clear reproduction steps
  • Root cause analysis
  • Remediation recommendations

The key differentiator from regular testing is that I’m not looking for code bugs - I’m looking for design flaws and missing validation logic.”

Q5: Describe a business logic vulnerability you’ve found or studied.

Strong Answer: “A memorable example is a referral program abuse vulnerability.

The application: A fintech app that gave $20 credit for each referred friend who completed KYC verification.

The flaw: The system validated that:

  • Email was unique
  • Phone was unique
  • KYC documents were submitted

But it didn’t validate:

  • Whether the phone could receive calls (VoIP numbers worked)
  • Whether the email domain was legitimate (temp mail accepted)
  • Geographic clustering of referrals
  • Device fingerprints

The attack: Attackers created hundreds of fake accounts using VoIP numbers and temporary email services, completing KYC with the same (or photoshopped) documents.

Impact: Some attackers earned thousands in fraudulent referral credits.

Fix required:

  • Phone number verification via call (not just SMS)
  • Email domain blocklist for temp mail services
  • Device fingerprinting and limiting
  • Velocity checks on referral patterns
  • Manual review for high-volume referrers
  • Delayed credit release until transaction history established”

Advanced Questions

Q6: How would you explain business logic vulnerabilities to a developer who thinks ‘but the code works correctly’?

Strong Answer: “I’d use an analogy and a specific example.

Analogy: ‘Imagine a bank vault with a perfect lock, but the policy says anyone can request the combination. The lock works perfectly - it’s the policy that’s the problem.’

Then I’d show a specific example from their application:

‘Look at this checkout flow. Your code correctly processes this request to apply a coupon. But watch what happens if I apply it AFTER initiating payment but BEFORE finalization. Your code does exactly what it’s told - it applies the discount. The problem is there’s no business rule preventing this sequence.’

Then I’d frame it in terms they care about:

‘This isn’t a bug report - your code is technically correct. This is a missing requirement. The business rule “coupons cannot be applied after payment begins” was never implemented because it was never specified. We need to add that validation.’

This reframes it from ‘your code is wrong’ to ‘we’re missing a business rule’ - which is more accurate and less defensive.”

Q7: How do you prioritize business logic findings when there are many issues?

Strong Answer: “I prioritize using a business impact framework:

Tier 1 - Critical (Immediate):

  • Direct financial loss (price manipulation, funds theft)
  • Authentication/authorization bypass
  • Data breach potential

Tier 2 - High (This Sprint):

  • Indirect financial loss (coupon abuse, referral fraud)
  • Privilege escalation within application
  • Compliance violations

Tier 3 - Medium (Next Quarter):

  • Rate limit bypass
  • Workflow manipulation without direct loss
  • Information disclosure

Tier 4 - Low (Backlog):

  • Edge cases with limited impact
  • Issues requiring unlikely attack chains
  • Cosmetic or UX-related security issues

For each finding, I calculate:

  • Impact: Financial, data, reputation
  • Likelihood: Skill required, discoverability
  • Exploitability: Complexity, prerequisites

I also consider ‘blast radius’ - a flaw in core checkout affects all users, while a flaw in an admin feature affects few.”


Glossary

TermDefinition
Business LogicRules governing how an application operates
Trust BoundaryPoint where data trustworthiness changes
Race ConditionTiming-dependent vulnerability
TOCTOUTime-of-check to time-of-use vulnerability
Workflow BypassSkipping required steps in a process
Parameter TamperingModifying request parameters
State MachineModel of valid application states and transitions
IdempotencyOperation that can be repeated without side effects

What’s Next

Continue building your application security expertise:

  1. CSRF Attacks and Modern Defenses - Related web vulnerability
  2. DOM-Based XSS Deep Dive - Client-side vulnerabilities
  3. API Security Testing - API business logic flaws

Questions or feedback? Open an issue on GitHub.


Share this post on:

Previous Post
DOM-Based XSS Deep Dive: Client-Side Vulnerabilities Explained
Next Post
Cloud Fundamentals for Security Engineers: AWS First Approach