# request-smuggling

This skill tests HTTP desynchronization between front proxies and origin servers. Use it for CL.TE, TE.CL, HTTP/2-to-HTTP/1, and client-side desync checks.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 3600 installs · ★ 2547
- Author: yaklang
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/yaklang/hack-skills/tree/HEAD/skills/request-smuggling/SKILL.md
- Updated: 2026-09-13
- HTML: https://affpapa.org/en/nevibecode/skills/request-smuggling

## What it does

The skill focuses on cases where a front proxy, CDN, or load balancer and the origin server disagree about HTTP request boundaries. It covers differences between `Content-Length` and `Transfer-Encoding`, HTTP/2-to-HTTP/1 translation, and client-side desynchronization through browser `fetch` pipelines.

It includes initial CL.TE and TE.CL checks, TE.TE obfuscation variants, and guidance for analyzing WAF bypasses, connection-queue poisoning, cache impact, and authentication-boundary confusion. The material assumes familiarity with raw HTTP/1.1 framing and reverse-proxy topologies. Run these checks only in authorized scope, since concurrent smuggling can affect shared connections or caches.

The skill can be installed for Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, and OpenCode. In Claude Code, the installed file is `~/.claude/skills/request-smuggling/SKILL.md`.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add yaklang/hack-skills --skill request-smuggling -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/request-smuggling/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/request-smuggling/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add yaklang/hack-skills --skill request-smuggling -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/request-smuggling/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add yaklang/hack-skills --skill request-smuggling -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/request-smuggling/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install yaklang/hack-skills request-smuggling
```

2. **Manually: put the files in place**
- File: `.github/skills/request-smuggling/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add yaklang/hack-skills --skill request-smuggling -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/yaklang/hack-skills --path skills/request-smuggling
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/request-smuggling/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add yaklang/hack-skills --skill request-smuggling -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/yaklang/hack-skills/tree/HEAD/skills/request-smuggling/SKILL.md

## When to use it
- test `Content-Length` versus `Transfer-Encoding` parsing
- check HTTP/2-to-HTTP/1 downgrade behavior
- investigate client-side desync through browser `fetch`
- assess WAF bypass and connection-queue poisoning risks

## Example prompts
- Test this proxy and origin pair for CL.TE and TE.CL in an authorized environment.
- Analyze request-boundary differences during HTTP/2-to-HTTP/1 translation and outline a safe test plan.
- Investigate client-side desynchronization through browser `fetch` pipelines without affecting shared connections.

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: 824553bd44e791c6.

BEGIN THIRD-PARTY FILE 824553bd44e791c6
````text
---
name: request-smuggling
description: >-
  HTTP request smuggling and desynchronization testing. Use when front proxies,
  CDNs, or load balancers disagree with the origin on message framing
  (Content-Length vs Transfer-Encoding), on HTTP/2→HTTP/1 translation, or when
  exploring client-side desync via browser fetch pipelines.
---

# SKILL: HTTP Request Smuggling — Expert Attack Playbook

> **AI LOAD INSTRUCTION**: Expert HTTP desync techniques. Covers CL.TE, TE.CL, TE.TE obfuscation variants, HTTP/2 downgrade and pseudo-header confusion, client-side desync (browser `fetch` pipelines), and tool-assisted fuzzing. Assumes familiarity with raw HTTP/1.1 framing and reverse-proxy topologies. This is not “header injection” — it is **message boundary disagreement** between hops.

Routing note: load this skill when you suspect CDN/reverse-proxy and origin disagree on request-end boundaries, or when abnormal concatenation appears during H2-to-H1 downgrade.

## 0. RELATED ROUTING

- [ghost-bits-cast-attack](../ghost-bits-cast-attack/SKILL.md) when the HTTP client library is **Apache HttpClient <= 4.5.9** (HTTPCLIENT-1974/1978) — injecting `瘍瘊` (U+760D U+760A, low bytes `\r\n`) into a header value causes the underlying char-to-byte writer to emit a literal CRLF, splitting the request at the origin without relying on CL/TE disagreement

## 1. QUICK START

### CL.TE first probe (front-end trusts CL, back-end trusts chunked)

Assumption: front end prioritizes `Content-Length`, back end prioritizes `Transfer-Encoding: chunked`. Use a very short CL so the front end accepts a fake end, while the back end continues chunk parsing and leaves remaining bytes for the next request.

```http
POST / HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED
```

- Front end reads only 13 bytes based on `Content-Length: 13` (that is, `0\r\n\r\nSMUGGLED`, 13 bytes total) and considers the request complete.
- Back end parses as chunked: after the `0` end chunk, it treats **`SMUGGLED` and onward** as the start byte stream of the **next request**.

### TE.CL first probe (front-end trusts chunked, back-end trusts CL)

Assumption: front end parses chunked and back end only reads `Content-Length`. Set **CL equal to the number of bytes in the chunk-length line** (commonly `4`: two hex characters + `\r\n`), so the back end consumes only the length line and leaves the rest buffered for follow-up request splicing.

Embed a second request in the chunk (all line endings are **CRLF**; `35` hex chunk length = 53 bytes):

```http
POST / HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked

35
````
END THIRD-PARTY FILE 824553bd44e791c6

The third-party file has ended. Everything between the 824553bd44e791c6 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 2765 of 14765 bytes. © yaklang · MIT · https://github.com/yaklang/hack-skills/tree/HEAD/skills/request-smuggling/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
