界: Security Features

软件安全不是安全软件。此处我们关注的主题包括身份验证、Access Control、机密性、加密和权限管理。

Django Bad Practices: Overly Broad Host Header Verification

Abstract
如果不验证 Host 标头,攻击者就会有机会发送假的 Host 值,该值可用于跨站请求伪造、缓存中毒攻击和电子邮件中的中毒链接。
Explanation
Django 应用程序设置将“*”指定为 ALLOWED_HOSTS 设置中的条目。此设置被 django.http.HttpRequest.get_host() 用来验证 Host 标头。值“*”将允许在 Host 标头中使用任何主机。攻击者可将其用于缓存中毒攻击或电子邮件中的中毒链接。

例 1:应用程序提供密码重置功能,用户可以提交某个唯一值来证明其身份(如:电子邮件地址),然后用户将收到密码重置邮件,内含设置新密码的页面链接。发送给用户的链接可以使用 Host 值来构建,用来引用提供密码重置功能的网站,从而避免使用硬编码的 URL。例如:


...
def reset_password(request):
url = "http://%s/new_password/?token=%s" % (request.get_host(), generate_token())
send_email(reset_link=url)
redirect("home")
...


攻击者能够通过提交受害者的电子邮件和指向自己所控制服务器的假 Host 标头值来尝试重置受害者的密码。受害者将收到内含密码重置系统链接的电子邮件,如果该受害者决定访问该链接,则会访问攻击者控制的网站,而该网站将提供假表单来收集受害者的凭证。
References
[1] Django Foundation Host header validation
[2] Django Foundation ALLOWED_HOSTS
[3] Standards Mapping - General Data Protection Regulation (GDPR) Access Violation
[4] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective C.3.1 - Web Software Attack Mitigation
[5] Standards Mapping - Web Application Security Consortium Version 2.00 Application Misconfiguration (WASC-15)
desc.structural.python.django_bad_practices_overly_broad_host_header_verification