界: 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