Reino: Security Features
La seguridad de un software no es un software de seguridad. Nos preocupamos de cuestiones como la autenticación, el control de acceso, la confidencialidad, la criptografía y la gestión de privilegios.
Django Bad Practices: Overly Broad Host Header Verification
Abstract
Si no se valida el encabezado de
Host
se puede permitir que un usuario malintencionado envíe un valor de Host
falso que se puede utilizar para falsificación de solicitud de Cross-Site Scripting, ataques de envenenamiento de caché y envenenamiento de vínculos en correos electrónicos.Explanation
La configuración de las aplicaciones de Django especifica "
Ejemplo 1: Una aplicación ofrece una función para restablecer contraseñas donde los usuarios pueden enviar algún tipo de valor único para identificarse (por ej.: dirección de correo electrónico) y luego se enviará un correo electrónico para restablecer la contraseña con un vínculo a una página para establecer una contraseña nueva. El vínculo enviado al usuario se puede construir con el valor de
Un atacante podría intentar restablecer la contraseña de una víctima enviando el correo electrónico de la víctima y un valor de encabezado de
*
" como una entrada en la configuración de ALLOWED_HOSTS
. django.http.HttpRequest.get_host()
utiliza esta configuración para validar el encabezado de Host
. Un valor de "*
" permitirá cualquier host en el encabezado de Host
. Un atacante podría utilizar esto en ataques de envenenamiento de caché o para el envenenamiento de vínculos en correos electrónicos.Ejemplo 1: Una aplicación ofrece una función para restablecer contraseñas donde los usuarios pueden enviar algún tipo de valor único para identificarse (por ej.: dirección de correo electrónico) y luego se enviará un correo electrónico para restablecer la contraseña con un vínculo a una página para establecer una contraseña nueva. El vínculo enviado al usuario se puede construir con el valor de
Host
para hacer referencia al sitio que facilita la función para restablecer la contraseña a fin de evitar direcciones URL con codificación rígida. Por ejemplo:
...
def reset_password(request):
url = "http://%s/new_password/?token=%s" % (request.get_host(), generate_token())
send_email(reset_link=url)
redirect("home")
...
Un atacante podría intentar restablecer la contraseña de una víctima enviando el correo electrónico de la víctima y un valor de encabezado de
Host
falso que señale un servidor que controla. La víctima recibirá un correo electrónico con un vínculo al sistema para restablecer contraseñas y si decide visitar el vínculo, estará visitando el sitio controlado por el usuario malintencionado que facilitará un formulario falso para recopilar las credenciales de la víctima.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