Misiones y directrices públicas

Programación segura aplicada

Explore las directrices de programación segura para comprender y mitigar vulnerabilidades de software como el OWASP Top 10, y sumérjase en misiones de formación guiada para practicar en simulaciones de aplicaciones del mundo real.

Reservar una demostración

Explorar todas las misiones

Ver más
Escalable y dinámico

Inyección SQL

Recibimos informes de un usuario que logró explotar una vulnerabilidad de inyección SQL en la función de búsqueda de transacciones de la solución de banca por internet. Indicó que pudo ver transacciones de otros usuarios y señaló que esta vulnerabilidad permitiría a un atacante realizar acciones malintencionadas en la base de datos, como eliminar tablas, consultar datos de otras tablas o insertar información, entre otras. Intenta replicar lo que hizo el usuario en esta misión.

probar ahora
Escalable y dinámico

Spring MvcRequestMatchers

En marzo de 2023, Spring lanzó una solución para una vulnerabilidad descubierta internamente, denominada CVE-2023-20860, donde el uso de un comodín doble ** en mvcRequestMatchers podía causar una discrepancia de patrones entre Spring Security y Spring MVC. Esto podría permitir que los usuarios obtuvieran acceso no autorizado a ciertos endpoints. Hemos configurado una aplicación bancaria muy simplificada con algunos endpoints. Sigue las instrucciones e intenta reproducir el impacto de esta vulnerabilidad de control de acceso.

probar ahora
Escalable y dinámico

Firmas psíquicas: uso de componentes vulnerables conocidos

CVE-2022-21449 tiene el alias más genial para una vulnerabilidad: Firmas psíquicas en Java. ¿Cómo obtuvo ese nombre? Es una referencia a los papeles psíquicos de Doctor Who. Al mostrarlos, estos papeles en blanco se llenaban con lo que la persona esperaba ver. Algo similar ocurría en la implementación del algoritmo ECDSA en Java (versiones 15 a 18), lo cual afecta la verificación de firmas de los JWT. Podemos enviar una firma inválida y Java la considerará válida. ¿Quieres ver cómo funciona? Empecemos.

probar ahora
Escalable y dinámico

Path Traversal en Apache - Uso de componentes vulnerables conocidos

El 4 de octubre de 2021, el equipo de Apache lanzó la versión 2.4.49 para solucionar una vulnerabilidad de path traversal y ejecución remota de código en Apache 2.4.48, conocida como CVE-2021-41773. El 7 de octubre de 2021, lanzaron la versión 2.4.51 debido a que la corrección del hotfix 2.4.50 estaba incompleta. Esta vulnerabilidad se registró como CVE-2021-42013. Prueba esta misión para ver por ti mismo cómo se puede explotar.

probar ahora
Escalable y dinámico

Log4j: uso de componentes vulnerables conocidos

El anuncio a principios de diciembre de 2021 de una vulnerabilidad de día cero (CVE-2021-44228) en la popular biblioteca de registro Log4j causó un gran revuelo en la comunidad Java. El exploit, llamado Log4Shell, afecta a las versiones de Log4j v2 de la 2.0-beta9 a la 2.14.1 y podría permitir la ejecución remota de código. Hemos preparado un entorno para simular el exploit y que puedas ver su impacto de primera mano. Pruébalo ahora.

probar ahora
Escalable y dinámico

Código troyano: uso de componentes de fuentes no confiables

Uno de nuestros desarrolladores de Viking Bank copió ingenuamente código de una fuente de internet no confiable, el cual podría contener componentes vulnerables, para ayudar a escribir una verificación de autorización de administrador para gestionar tarjetas de crédito. Hemos notado que los usuarios han estado cambiando su límite de crédito, a pesar de que solo los administradores deberían tener este privilegio. Creemos que hay algo extraño en ese código. Prueba la misión para investigar el código.

probar ahora
Escalable y dinámico

Codestashbin - Función de restablecimiento de contraseña insegura

CodeStashBin es una de las empresas de alojamiento de control de versiones de código más grandes del mundo. Se rumorea que el proceso de recuperación de contraseña tiene una vulnerabilidad de restablecimiento inseguro. Podría ser posible cambiar la contraseña de un usuario privilegiado y acceder a su cuenta. Únete a esta misión para investigar el problema.

probar ahora
Escalable y dinámico

Cross-site scripting (XSS) en ‘ChatterGPT’

Esta misión muestra la interfaz familiar de un LLM popular y utiliza un fragmento de código real generado a finales de noviembre de 2023. Los usuarios pueden interpretar este fragmento e investigar posibles riesgos de seguridad si se utilizara para su propósito original.

probar ahora

Explorar todas las directrices

Explorar por:
Ocultar filtros
Selección
Mostrar filtros
Selección
Borrar filtros
Etiqueta
Supericono [★]
Tema
Ver más

Registro y supervisión insuficientes

Mejores prácticas:

Auditar el registro de funciones confidenciales
Registro de errores
Almacenar los registros en una ubicación centralizada
Conservar los registros durante un tiempo definido
Auditar periódicamente los registros en busca de PII

El registro y el monitoreo suelen ser una ocurrencia tardía cuando algo ya ha salido mal, pero, en realidad, no garantizar un registro y monitoreo adecuados puede resultar muy costoso. En un extremo, cuando ocurre un incidente (ya sea relacionado con la seguridad o no), tener pocos o ningún registro hace imposible determinar qué ha sucedido realmente. En el otro extremo, registrar demasiados datos puede generar problemas de privacidad que, a su vez, pueden derivar en problemas con los organismos reguladores. Lea nuestra guía de mejores prácticas para evitar un registro y monitoreo insuficientes.

ver directrices

Uso de componentes con vulnerabilidades conocidas

{
 "dependencies": {
   "foo": "1.0.0 - 2.9999.9999",
   "bar": ">=1.0.2 <2.1.2"
 }
}

La mayoría de las aplicaciones utilizan una gran cantidad de componentes de terceros. Estos componentes proporcionan de todo, desde registro de eventos y plantillas hasta acceso a bases de datos y mucho más. Esto facilita enormemente el desarrollo de software y ahorra mucho tiempo. Sin embargo, también son creados por personas, lo que significa que algunos inevitablemente contendrán vulnerabilidades. Lea la guía para obtener más información.

ver directrices

Inyección SQL

import mysql.connector
db = mysql.connector.connect
#Mala práctica. ¡Evítala! Esto es solo para fines educativos.
(host="localhost", user="newuser", passwd="pass", db="sample")
cur = db.cursor()
name = raw_input('Enter Name: ')
cur.execute("SELECT * FROM sample_data WHERE Name = '%s';" % name) for row in cur.fetchall(): print(row)
db.close()

La inyección SQL (SQLi) inserta código en sentencias SQL para atacar y recopilar información importante de una aplicación. Es una vulnerabilidad de seguridad web. Se trata de la técnica de hackeo más común para manipular bases de datos y extraer información crucial de ellas.

ver directrices

Configuración de seguridad incorrecta

Muchos marcos de trabajo también cuentan con un conjunto de puntos finales que se pueden habilitar para permitir el monitoreo de la aplicación, ya sea en un entorno de producción o de prueba/desarrollo. Estos pueden incluir:

Métricas (Prometheus)
Registros
Información del entorno
Asignaciones de rutas/URL

La configuración de seguridad incorrecta es un término general que abarca vulnerabilidades comunes que surgen debido a los ajustes de configuración de una aplicación, más que por un código deficiente. Es un tema amplio que depende en gran medida de factores como su pila tecnológica. A menudo, solucionar estos problemas parece sencillo, como cambiar un archivo de configuración o incluso una sola línea de código, pero el impacto y las consecuencias de estas vulnerabilidades pueden ser graves. Lea nuestra guía para obtener más información sobre esta vulnerabilidad y cómo mitigarla.

ver directrices

Falsificación de solicitud del lado del servidor

ts
let url = request.params.url;

let response = http.get(url);
let render = response.render();

return render.export();

Las vulnerabilidades de falsificación de solicitud del lado del servidor (SSRF) ocurren cuando un usuario logra que una aplicación realice solicitudes HTTP a un dominio determinado por un atacante. Si la aplicación tiene acceso a redes privadas o internas, el atacante también podría hacer que la aplicación realice solicitudes a servidores internos. En esta guía, analizaremos esto más a fondo con algunos ejemplos para comprender mejor cómo se manifiesta en la práctica.

ver directrices

Almacenamiento de contraseñas

Feature Cryptographic hash Password hash Speed Very fast Intentionally slow Work factor can be adjusted No Yes

Si su aplicación autentica usuarios, es muy probable que también tenga que gestionar contraseñas. El manejo de las contraseñas de los usuarios es un asunto de gran importancia, y gestionarlas adecuadamente lo es aún más. Es difícil imaginar un escenario peor que el de una aplicación que sufre un ataque y cuyas contraseñas de usuario terminan filtradas en internet para que cualquiera pueda verlas. ¿Cómo se pueden almacenar las contraseñas de forma segura y siguiendo las mejores prácticas? Echemos un vistazo a algunas formas de hacerlo.

ver directrices

Asignación masiva

html
<form method="POST">
<input name="Id" type="hidden" value="666">
<input name="Name" type="text" value="Malhechor">
<input name="EmailAddress" type="text" value="hacker@atacante.com">
<input name="IsAdmin" type="hidden" value="true">
<input type="submit">
</form>

La asignación masiva es una vulnerabilidad que ocurre cuando los puntos finales de una API no restringen qué propiedades de sus objetos asociados pueden ser modificadas por un usuario. Esta vulnerabilidad puede surgir al utilizar una biblioteca o marco de trabajo que permite la vinculación automática de parámetros HTTP a un modelo que luego se utiliza sin ninguna validación. Si bien el uso de la vinculación automática de una solicitud a un objeto puede resultar muy útil en ocasiones, también puede derivar en problemas de seguridad si el modelo contiene propiedades que no deberían ser accesibles para el usuario. Lea la directriz para obtener más detalles.

ver directrices

Configuración de seguridad incorrecta: detalles de XXE

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

La clase de vulnerabilidad “XML eXternal Entities” (XXE) es una mala configuración de seguridad que afecta a los analizadores XML. El estándar XML incluye formas de hacer referencia a “entidades”, como archivos y URL. A menudo, los analizadores están configurados de forma predeterminada para resolver completamente las entidades externas, lo que significa que los documentos XML pueden provocar la divulgación de archivos y otra información confidencial a posibles atacantes. Lea la guía completa para obtener más información.

ver directrices

Inyección - Recorrido de rutas (Path Traversal)

pseudo
let baseFolder = "/var/www/api/documents/"; 
let path = baseFolder + request.params.filename;

return file.read(path);

El recorrido de rutas (Path Traversal) es otro tipo de vulnerabilidad de inyección bastante común. Suele ocurrir cuando la construcción de un URI (ya sea para una URL, una ruta de archivo o cualquier otro elemento) no garantiza adecuadamente que la ruta resuelta no apunte fuera de la raíz prevista. El impacto de una vulnerabilidad de recorrido de rutas depende en gran medida del contexto en el que se produzca y del endurecimiento general que se haya aplicado. Lee la directriz para obtener más información.

ver directrices

Autenticación y autorización

cs

// Asegurar que el comportamiento predeterminado sea autenticar las solicitudes y verificar si son administrador
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // Anula el atributo Authorize heredado para permitir que cualquier usuario acceda a la página

ver directrices

Inyección - XSS

```html
<!--- NO SEGURO: El htmlSnippet se interpretará sin ningún tipo de escape --->
@Html.Raw(htmlSnippet)
```

El Cross-Site Scripting, también conocido como XSS, es otro tipo de vulnerabilidad de inyección que provoca la ejecución de un script controlado por un atacante en el navegador de otro usuario. El XSS también puede considerarse una vulnerabilidad de inyección de HTML/JavaScript. Veamos los tipos de XSS que puede encontrar.

ver directrices

Inyecciones: conceptos básicos

Algunos de los tipos de inyección más comunes incluyen:

Inyección SQL
Cross-Site Scripting (inyección de HTML/Javascript)
Path Traversal (inyección de rutas/URL)
Inyección de comandos
Inyección de código

Una de las clases de vulnerabilidades más conocidas suele ser la de inyección, especialmente, y para sorpresa de nadie, su ejemplo más emblemático: la inyección SQL. Es difícil no oír hablar de la inyección SQL en el mundo tecnológico, así que vamos a tratar el tema. Sigue leyendo para obtener una breve introducción a los fallos de inyección.

ver directrices

Carga de archivos

public string UploadProfilePicture(FormFile uploadedFile)
{
    // Generar la ruta donde guardar el archivo subido
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // Guardar el archivo
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // Actualizar la foto de perfil 
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

Es muy habitual que las aplicaciones necesiten, en algún momento, permitir que los usuarios suban archivos (ya sea para su uso o simplemente para almacenamiento) en algún punto de la plataforma. Aunque parezca sencillo, la forma en que se implementa esta función puede ser determinante debido a los riesgos potenciales asociados al manejo de dichas cargas. Lee la guía para obtener más información.

ver directrices

Inyección de comandos

let ip = request.params.ipAddress;

system("ping " + ip);

Analicemos la inyección de comandos por sí sola. Nos centraremos principalmente en varios ejemplos para que sea más fácil ver cómo se manifiesta. A modo de recordatorio, las vulnerabilidades de inyección de comandos ocurren cuando la entrada del usuario se utiliza como parte de un comando del sistema operativo. Lee la guía para obtener más información.

ver directrices