Slide 1

Slide 1 text

PyGoat: Analizando la seguridad en aplicaciones Django José Manuel Ortega @jmortegac

Slide 2

Slide 2 text

Agenda ● Introducción a la seguridad en aplicaciones Django ● Pygoat como ejemplo de aplicación vulnerable ● Vulnerabilidades OWASP top 10 y mitigación

Slide 3

Slide 3 text

Introducción a la seguridad en aplicaciones Django ● Inyección SQL: El ORM (Object-Relational Mapping) de Django puede prevenir algunos tipos de inyección SQL, pero no es infalible. Se debe tener cuidado de escapar correctamente cualquier entrada suministrada por el usuario al crear consultas SQL. ● Cross-site scripting (XSS): El motor de plantillas de Django escapa automáticamente cualquier dato que se muestre en una página, pero aún es posible crear una vulnerabilidad si los datos suministrados por el usuario se incluyen en un script JavaScript. ● Falsificación de petición en sitios cruzados (CSRF): Django incluye protección contra CSRF por defecto, pero esta protección puede ser eludida si el desarrollador no toma las medidas adecuadas.

Slide 4

Slide 4 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades de carga de archivos: Si una aplicación permite a los usuarios subir archivos, es importante validar correctamente los archivos para evitar que se ejecute código malicioso en el servidor. ● Vulnerabilidades de divulgación de archivos: Los desarrolladores deben asegurarse de que cualquier archivo que no esté destinado a ser accesible públicamente esté debidamente protegido contra el acceso no autorizado. ● Validación de entrada inadecuada: Los desarrolladores no comprueban las entradas del usuario, lo que da lugar a posibles inyecciones de código en la plantilla. Esto se conoce comúnmente como CWE-20: Improper Input Validation.

Slide 5

Slide 5 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades SQL Injection ● CVE-2022-34265: Potential SQL injection via Trunc(kind) and Extract(lookup_name) arguments

Slide 6

Slide 6 text

Introducción a la seguridad en aplicaciones Django ● https://github.com/django/django/commit/54eb8 a374d5d98594b264e8ec22337819b37443c

Slide 7

Slide 7 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades SQL Injection ● CVE-2023-31047: Potential bypass of validation when uploading multiple files using one form field ● https://www.djangoproject.com/weblog/2023/ma y/03/security-releases/ ● https://nvd.nist.gov/vuln/detail/CVE-2023-31047

Slide 8

Slide 8 text

Introducción a la seguridad en aplicaciones Django

Slide 9

Slide 9 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades SQL Injection def insecure(request): with connection.cursor() as cursor: baz = request.GET.get('baz') cursor.execute(f"SELECT foo FROM bar WHERE baz = {baz}") row = cursor.fetchone() # ... 1 ; DELETE FROM users ;

Slide 10

Slide 10 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades SQL Injection def secure(request): with connection.cursor() as cursor: baz = request.GET.get('baz') cursor.execute("SELECT foo FROM bar WHERE baz = %s", [baz]) row = cursor.fetchone()

Slide 11

Slide 11 text

Introducción a la seguridad en aplicaciones Django ● Vulnerabilidades SQL Injection ● Utilizar un mapeador relacional de objetos (ORM). Te ahorra escribir consultas SQL manualmente y previene automáticamente inyecciones SQL. ● El ORM más popular es SQLAlchemy https://www.sqlalchemy.org

Slide 12

Slide 12 text

Introducción a la seguridad en aplicaciones Django ● Impacto SQL Injection ● Exponer información confidencial ● Acceso no autorizado ● Denegación de servicio ● Ejecución de código

Slide 13

Slide 13 text

Introducción a la seguridad en aplicaciones Django ● Prevenir SQL Injection ● Consultas parametrizadas ● Validaciones en parámetros de entrada ● Prácticas de codificación segura ● Firewall de aplicaciones web (WAF)

Slide 14

Slide 14 text

Pygoat como ejemplo de aplicación vulnerable ● https://owasp.org/www-project-pygoat ● https://github.com/adeyosemanputra/pygoat ● https://hub.docker.com/r/pygoat/pygoat $ docker pull pygoat/pygoat $ docker run --rm -p 8000:8000 pygoat/pygoat

Slide 15

Slide 15 text

Vulnerabilidades OWASP top 10 y mitigación ● A1: Broken Access Control(Control de acceso roto) ● El control de acceso, a veces llamado autorización, es la forma en que una aplicación web otorga acceso al contenido y las funciones a algunos usuarios y no a otros. ● Estas comprobaciones se realizan después de la autenticación y rigen lo que los usuarios "autorizados" pueden hacer.

Slide 16

Slide 16 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 17

Slide 17 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 18

Slide 18 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 19

Slide 19 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 20

Slide 20 text

Vulnerabilidades OWASP top 10 y mitigación ● A1: Broken Access Control(Control de acceso roto) ● Implementar mecanismos de control de acceso una vez y reutilizarlos en toda la aplicación. ● Los controles de acceso al modelo deben validar que el usuario pueda crear, leer, actualizar o eliminar cualquier registro. ● Deshabilitar la lista de directorios del servidor web ● Los identificadores de sesión con estado deben invalidarse en el servidor después de cerrar sesión.

Slide 21

Slide 21 text

Vulnerabilidades OWASP top 10 y mitigación ● A1: Broken Access Control(Control de acceso roto) ● Los tokens de sesión (como los JWT) incluyen información sobre el usuario que ha iniciado sesión. ○ Validar que el token de sesión no está caducado ○ Comprobar que el token es válido ○ Verificar si el usuario (su información está en el token de sesión) tiene permitido realizar peticiones al endpoint actual

Slide 22

Slide 22 text

Vulnerabilidades OWASP top 10 y mitigación ● A3: Inyección ● La inyección ocurre cuando un atacante introduce datos que no son de confianza y engaña al intérprete para que haga cosas que no debería, como ejecutar comandos no deseados o acceder a datos no autorizados.

Slide 23

Slide 23 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 24

Slide 24 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 25

Slide 25 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 26

Slide 26 text

Vulnerabilidades OWASP top 10 y mitigación ● A3: Inyección ● Proporcionar una interfaz parametrizada o utilizar otras herramientas de mapeo relacional de objetos (ORM). ● Realizar validación de parámetros de entrada del lado del servidor. ● Para cualquier consulta dinámica, escapar los caracteres especiales utilizando la sintaxis de escape específica para ese intérprete.

Slide 27

Slide 27 text

Vulnerabilidades OWASP top 10 y mitigación ● A5: Security Misconfiguration ● Se habilitan o instalan funciones innecesarias (por ejemplo, puertos, servicios, páginas, cuentas o privilegios innecesarios). ● Las cuentas predeterminadas y sus contraseñas están habilitadas. ● El manejo de errores revela seguimientos de pila u otros mensajes de error demasiado informativos para los usuarios.

Slide 28

Slide 28 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 29

Slide 29 text

Vulnerabilidades OWASP top 10 y mitigación ● A5: Security Misconfiguration ● El modo de depuración de Django estaba habilitado. Esto puede provocar que se muestren a los usuarios mensajes de error y variables de entorno. ● En un entorno de producción, el modo de depuración debe desactivarse utilizando la siguiente configuración de Django (settings.py): ● DEBUG = False

Slide 30

Slide 30 text

Vulnerabilidades OWASP top 10 y mitigación ● A8 Software and Data Integrity Failures ● Las errores de integridad del software y de los datos se relacionan con código e infraestructura que no protegen contra violaciones de integridad. Un ejemplo de esto es cuando una aplicación depende de bibliotecas o módulos de fuentes, repositorios que no son confiables. ● Ataques relacionados con objetos y estructuras de datos en los que el atacante modifica la lógica de la aplicación o logra la ejecución remota de código arbitrario si hay clases disponibles para la aplicación que pueden cambiar el comportamiento durante o después de la deserialización.

Slide 31

Slide 31 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 32

Slide 32 text

Vulnerabilidades OWASP top 10 y mitigación ● A8 Software and Data Integrity Failures ● user+document.getElementById("download_link").setA ttribute("href"%2C"%2Fstatic%2Ffake.txt")%3B<%2Fscript>us er+<script>document.getElementById("download_link").setAttr ibute("href"%2C"%2Fstatic%2Ffake.txt")%3B<%2Fscript> ● La URL de descarga se modifica y el usuario puede descargar un archivo arbitrario confiando en el dominio.

Slide 33

Slide 33 text

Vulnerabilidades OWASP top 10 y mitigación ● A8 Software and Data Integrity Failures

Slide 34

Slide 34 text

Vulnerabilidades OWASP top 10 y mitigación ● A10: Server Side Request Forgery (SSRF) ● Esta vulnerabilidad ocurre cada vez que una aplicación web busca un recurso remoto sin validar la URL proporcionada por el usuario. ● Permite que la aplicación redireccione a una URL controlada por el atacante. ● Ataques comunes: ataques a servicios/archivos internos, ataques a URL externas (DoS)

Slide 35

Slide 35 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 36

Slide 36 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 37

Slide 37 text

Vulnerabilidades OWASP top 10 y mitigación

Slide 38

Slide 38 text

Vulnerabilidades OWASP top 10 y mitigación https://github.com/boomcamp/django-security

Slide 39

Slide 39 text

Vulnerabilidades OWASP top 10 y mitigación from django.contrib.auth.decorators import login_required from django.http import HttpResponse @login_required def secure_view(request): # Your view logic here return HttpResponse(“This is a secure view”)

Slide 40

Slide 40 text

Vulnerabilidades OWASP top 10 y mitigación from functools import wraps from django.http import HttpResponse def admin_only(view_func): @wraps(view_func) def wrapper(request, *args, **kwargs): if request.user.is_superuser: return view_func(request, *args, **kwargs) else: return HttpResponse(“Access Denied”) return wrapper

Slide 41

Slide 41 text

Vulnerabilidades OWASP top 10 y mitigación from django.contrib.auth import authenticate, login from django.http import HttpResponse def login_view(request): if request.method == ‘POST’: username = request.POST[‘username’] password = request.POST[‘password’] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return HttpResponse(“Login successful”) else: return HttpResponse(“Invalid credentials”) else: # Render login form return HttpResponse(“Login form”)

Slide 42

Slide 42 text

Vulnerabilidades OWASP top 10 y mitigación from django.http import HttpResponsePermanentRedirect class EnforceHttpsMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if not request.is_secure(): url = request.build_absolute_uri(request.get_full_path()) secure_url = url.replace(‘http://’, ‘https://’) return HttpResponsePermanentRedirect(secure_url) return self.get_response(request)

Slide 43

Slide 43 text

Vulnerabilidades OWASP top 10 y mitigación from django.core.validators import FileExtensionValidator from django.forms import forms class FileUploadForm(forms.Form): file = forms.FileField(validators=[FileExtensionValidator(allowed_extensions=[‘pdf’, ‘docx’])])

Slide 44

Slide 44 text

Vulnerabilidades OWASP top 10 y mitigación {% csrf_token %} Submit

Slide 45

Slide 45 text

Vulnerabilidades OWASP top 10 y mitigación from django import forms from django.utils.html import escape class SecureForm(forms.Form): name = forms.CharField(max_length=100) email = forms.EmailField() def clean_name(self): name = self.cleaned_data[‘name’] # Sanitize user input sanitized_name = escape(name) return sanitized_name def clean_email(self): email = self.cleaned_data[‘email’] # Validate and sanitize user input if not email.endswith(‘@domain.com’): raise forms.ValidationError(“Invalid email domain”) sanitized_email = escape(email) return sanitized_email

Slide 46

Slide 46 text

¡Gracias! @jmortegac https://www.linkedin.com/in/jmortega1 https://jmortega.github.io https://josemanuelortegablog.com https://www.marcombo.com/desarrollo- de-microservicios-con-python-9788426 737199 https://www.marcombo.com/desarrollo- seguro-en-ingenieria-del-software-aplic aciones-seguras-con-android-nodejs-p ython-y-c-9788426728005/