Nginx понимает несколько специальных заголовков от бэкенда при проксировании через
proxy_pass. Пример — в конфиге выше ⤴️Бэкенду требуется возможность (или уязвимость), позволяющая внедрять произвольные заголовки ответа. Это часто встречается при SSRF — когда запросы идут на сервер атакующего.
@app.route('/')
def index():
headers = json.loads(unquote(request.args.get("headers")))
return Response("Hello, world!", headers=headers)Заголовок ответа
X-Accel-Redirect перепишет URL и выполнит повторную оценку конфигурации — в результате будет возвращён ответ по новому пути. Если установить его значение в
/internal, то будет использован обработчик для location /internal, даже несмотря на то, что запрошенный путь остаётся /. Это позволяет обойти проверку internal;, что обычно было бы невозможно при удалённом обращении.GET /?headers={"X-Accel-Redirect":"/internal"} HTTP/1.1HTTP/1.1 200 OK
...
Internal
💡 Ещё несколько внутренних заголовков, которые можно использовать в комбинации с этим:
💚
X-Accel-Charset: задаёт charset в Content-Type💚
X-Accel-Buffering: включает или отключает буферизацию ответа💚
X-Accel-Limit-Rate: скорость (в байтах в секунду) передачи клиенту💚
X-Accel-Expires: время истечения кеша для ответа
