
Python 包 Flask-Security-Too <=5.3.2 版本中存在一个开放重定向漏洞,攻击者可以通过滥用 /login 和 /register 路由上的 ?next 参数,构造恶意 URL 将毫无戒心的用户重定向至恶意站点。
Flask-Security-Too 包含验证 next 参数中指定的 URL 是否为相对路径或与请求 URL 具有相同网络位置的逻辑。该机制旨在防止开放重定向。
该 Python 包 此前已被发现存在漏洞,可绕过现有的验证逻辑;4.1.0 版本修复了此前已知的示例,例如 https://example/login?next=\\\github.com。
然而,由于 Web 浏览器对 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——这意味着重定向中的 Location 头默认是相对的。因此,如果应用程序使用 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)*[/\\].*"
或
autocorrect_location_header 设置为 True:@app.after_request
def fix_location_header(response):
response.autocorrect_location_header = True
return response
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-49438
https://nvd.nist.gov/vuln/detail/CVE-2023-49438
绕过方法由 Brandon T. Elliott 于 2023 年 11 月发现。