
CVE-2023-49438 — Уязвимость открытого перенаправления в Flask-Security-Too

Уязвимость открытого перенаправления в пакете python Flask-Security-Too версии <=5.3.2 позволяет злоумышленникам перенаправлять ничего не подозревающих пользователей на вредоносные сайты с помощью специально созданного URL-адреса, используя параметр ?next на маршрутах /login и /register.
Flask-Security-Too содержит логику для проверки того, что URL-адрес, указанный в параметре next, является либо относительным, либо имеет то же сетевое расположение, что и запрашиваемый URL. Это сделано для предотвращения открытых перенаправлений.
Ранее пакет python Flask-Security-Too был признан уязвимым к обходу существующей логики проверки, и версия 4.1.0 исправила ранее известные примеры, такие как https://example/login?next=\\\github.com.
Однако был обнаружен способ обхода, связанный с тем, как веб-браузеры нормализуют слеши в URL-адресах, что делает пакет уязвимым вплоть до версии <=5.3.2.
https://example/login?next=/\github.com
https://example/login?next=\/github.com
Ранее в CVE-2021-32618 отмечалось, что «если используется Werkzeug (что очень распространено в приложениях Flask) в качестве уровня WSGI, он по умолчанию ВСЕГДА гарантирует, что заголовок Location является абсолютным, что делает этот вектор атаки недействительным».
Однако в Werkzeug >=2.1.0 конфигурация autocorrect_location_header была изменена на False, что означает, что заголовки местоположения в перенаправлениях по умолчанию являются относительными. Таким образом, эта проблема может затронуть приложения, которые ранее не были уязвимы, если они используют Werkzeug >=2.1.0 в качестве уровня WSGI.
pip install -U Flask-Security-Too
ИЛИ
app.config['SECURITY_REDIRECT_VALIDATE_MODE'] = "regex"
app.config['SECURITY_REDIRECT_VALIDATE_RE'] = r"^/{4,}|\\{3,}|[\s\000-\037][/\\]{2,}(?![/\\])|[/\\](https://github.com/brandon-t-elliott/cve-2023-49438/blob/main/%5B%5E/%5C%5C%5D%7C/%5B%5E/%5C%5C%5D)*[/\\].*"
ИЛИ
@app.after_request
def fix_location_header(response):
response.autocorrect_location_header = True
return response
Способ обхода обнаружен Brandon T. Elliott, ноябрь 2023 г.