
Questa è una ricorrenza di cve-2019-9787 su Wordpress e una difesa basata su hash.
Questo è un progetto di Sijia Zhang(https://github.com/sijiahi) e Bowen Zhou(https://github.com/KonjakZhou)
- Configura e installa Wordpress5.0 su http://localhost/wp-admin/;
- Accedi a Wordpress come amministratore e pubblica almeno un articolo;
- apri mal.html (configurato su un altro dominio, eventualmente aprilo direttamente come file nel browser), clicca su submit request.
- Se funziona, verrai reindirizzato alla pagina dell'articolo con un commento "cilick me"; non appena muovi il mouse su di esso, apparirà una finestra di prompt che indica il successo dell'attacco.
-Sostituisci i file in /wp-includes, aggiungi gli script js in /wp-includes/js.
-Sposta il file del post simulato nell'area WP, apri la pagina del post simulato per testare la funzione PINGBACK/TRACEBACK.
-Se funziona, verrai reindirizzato alla pagina dell'articolo con un commento "legal anchor";
-Apri mal.com da un altro dominio e testa l'attacco CSRF.
Per difendere Wordpress da CVE-2019-9787, viene introdotto un nuovo campo chiamato doggyNonce. Nei casi in cui l'amministratore cerca di adottare la funzione PINGBACK e _wp_unfiltered_html non può essere fornito, chiediamo all'amministratore di firmare con il proprio cookie gli attributi dei Tag caricati; questo ci consente di difenderci dall'attacco CSRF e garantire l'integrità degli attributi dei tag caricati.
Wordpress accetta automaticamente un commento senza un token CSRF corretto come richiesta PINGBACK e TRACEBACK, filtra quel commento con un filtro whitelist, estrae il campo href e ricostruisce un tag "a". Per difendersi da questa vulnerabilità, vengono presi in considerazione due punti chiave: 1. Il server non può distinguere una richiesta CSRF illegale da una richiesta PINGBACK/TRACEBACK legittima. 2. L'attaccante CSRF inietta il proprio codice nel campo href di un tag "a"; l'attributo del Tag viene modificato dopo essere stato filtrato. doggyNonce è un valore hash che dipende da *cookie(wp-setting-time-$uid) e da *uploaded href attrbute: doggyNonce=Hash(*uploaded href attrbute,*cookie) si noti che doggyNonce svolge il ruolo di firma dell'amministratore sull'attributo href caricato.
1. 'mal.html' serve a simulare un attacco CSRF e pertanto deve essere collocato in un dominio diverso da Wordpress;
2. 'post.html' serve a simulare la funzione PINGBACK/TRACEBACK e pertanto deve essere collocato nello stesso dominio di WP;