Le 12 mars 2020, notre équipe Threat Intelligence a découvert une vulnérabilité XSS (Cross-Site Scripting) stockée dans Importateur / exportateur de paramètres de widget, un plugin WordPress avec plus de 40 000 installations. Cette faille a permis à un attaquant authentifié disposant d’autorisations minimales au niveau de l’abonné d’importer et d’activer des widgets personnalisés contenant du JavaScript arbitraire dans un site avec le plugin installé.

Nous avons contacté le fournisseur de plugins le même jour, le 12 mars 2020, mais nous n’avons pas encore reçu de réponse. Le 20 mars 2020, nous avons contacté l’équipe de plugins WordPress et leur avons envoyé la divulgation complète de la vulnérabilité, et après un suivi avec eux le 13 avril 2020, le plugin a été supprimé du référentiel WordPress. Comme il n’y a pas de correctif actuellement disponible, nous vous recommandons fortement de désactiver et de supprimer ce plugin.

Les utilisateurs de Wordfence Premium ont reçu une nouvelle règle de pare-feu le 12 mars 2020 pour se protéger contre les exploits ciblant ces vulnérabilités. Les utilisateurs de Wordfence gratuits ont reçu cette règle le 11 avril 2020.


La description: Script intersite stocké authentifié (XSS)
Plugin concerné: Importateur / exportateur de paramètres de widget
Plugin Slug: widget-settings-importexport
Versions concernées:
ID CVE: En attente
Score CVSS: 7,4 (élevé)
Vecteur CVSS: CVSS: 3.0 / AV: N / AC: L / PR: L / UI: N / S: C / C: L / I: L / A: L
Version entièrement corrigée: N / A

L’importateur / exportateur de paramètres de widget est un plugin WordPress qui offre la possibilité d’importer et d’exporter des widgets WordPress – une fonctionnalité WordPress qui ajoute des fonctionnalités à l’en-tête, aux barres latérales et au pied de page d’un site. Le plugin enregistre une action AJAX qui est utilisée pour effectuer l’importation de widget:

add_action( 'wp_ajax_import_widget_data', array( __CLASS__, 'ajax_import_widget_data' ) );

Comme c’est le cas avec de nombreuses vulnérabilités similaires, la fonction appelée par l’action AJAX ne parvient pas à utiliser les vérifications de capacité ou les vérifications non -ce. Cela signifie que tout utilisateur authentifié, quelles que soient ses autorisations, peut l’utiliser pour importer des widgets dans le site, y compris des widgets contenant du JavaScript malveillant, qui seraient exécutés dans le navigateur de tout visiteur du site.

Plus précisément, le ajax_import_widget_data La fonction obtient les données du widget à importer en appelant file_get_contents sur le fourni import_file paramètre. La plupart des sites sont configurés avec un paramètre, allow_url_fopen, qui permet à cette fonction d’obtenir le contenu d’un fichier hébergé à distance. Cela permet à un attaquant d’importer un widget malveillant sur le site en envoyant un $_POST demande à wp-admin/admin-ajax.php avec le action paramètre défini sur import_widget_data, le import_file paramètre défini sur l’URL d’un fichier JSON spécialement conçu et hébergé à distance, et widgets ensemble de paramètres pour décrire le widget à importer.

Si la clear_current est défini, tous les widgets actuellement actifs sur le site seront également supprimés. Si le widget importé contient du code JavaScript malveillant, il pourrait être utilisé pour rediriger les visiteurs du site vers des sites de publicité malveillante, ou même pour voler une session d’administrateur, ce qui pourrait entraîner une prise de contrôle du site.

La fonction vulnérable:

   public static function ajax_import_widget_data() {
       $response = array(
           'what' => 'widget_import_export',
           'action' => 'import_submit'
       );

       $widgets = isset( $_POST['widgets'] ) ? $_POST['widgets'] : false;
       $import_file = isset( $_POST['import_file'] ) ? $_POST['import_file'] : false;

       if( empty($widgets) || empty($import_file) ){
           $response['id'] = new WP_Error('import_widget_data', 'No widget data posted to import');
           $response = new WP_Ajax_Response( $response );
           $response->send();
       }

       $clear_current = isset( $_POST['clear_current'] );

       if ( $clear_current )
           self::clear_widgets();

       $json_data = file_get_contents( $import_file );
       $json_data = json_decode( $json_data, true );
       $sidebar_data = $json_data[0];
       $widget_data = $json_data[1];
       foreach ( $sidebar_data as $title => $sidebar ) {
           $count = count( $sidebar );
           for ( $i = 0; $i < $count; $i++ ) {
               $widget = array( );
               $widget['type'] = trim( substr( $sidebar[$i], 0, strrpos( $sidebar[$i], '-' ) ) );
               $widget['type-index'] = trim( substr( $sidebar[$i], strrpos( $sidebar[$i], '-' ) + 1 ) );
               if ( !isset( $widgets[$widget['type']][$widget['type-index']] ) ) {
                   unset( $sidebar_data[$title][$i] );
               }
           }
           $sidebar_data[$title] = array_values( $sidebar_data[$title] );
       }

       foreach ( $widgets as $widget_title => $widget_value ) {
           foreach ( $widget_value as $widget_key => $widget_value ) {
               $widgets[$widget_title][$widget_key] = $widget_data[$widget_title][$widget_key];
           }
       }

       $sidebar_data = array( array_filter( $sidebar_data ), $widgets );
       $response['id'] = ( self::parse_import_data( $sidebar_data ) ) ? true : new WP_Error( 'widget_import_submit', 'Unknown Error' );

       $response = new WP_Ajax_Response( $response );
       $response->send();
   }

Que devrais-je faire?

Il est probable que ce plugin ne sera pas corrigé, nous vous recommandons donc fortement de désactiver et de supprimer ce plugin de votre site. Plugins avec des fonctionnalités similaires, tels que Importateur et exportateur de widgets, sont disponibles et devraient être raisonnablement sûrs, bien qu’il soit considéré comme la meilleure pratique de désactiver et de supprimer tous les plugins qui ne sont pas activement utilisés.

Calendrier de divulgation

12 mars 2020 – Vulnérabilité initialement découverte et analysée. Règle de pare-feu publiée pour les utilisateurs de Wordfence Premium. Ouverture initiale au vendeur de plugins.
20 mars 2020 – Nous contactons l’équipe des plugins WordPress et leur fournissons une divulgation complète.
11 avril 2020 – Les utilisateurs gratuits de Wordfence reçoivent une règle de pare-feu.
13 avril 2020 – Nous assurons le suivi avec l’équipe des plugins WordPress et le plugin est supprimé du référentiel WordPress.
15 avril 2020 – Vulnérabilité révélée après plus de 30 jours sans réponse du fournisseur du plugin.

Conclusion

Dans le post d’aujourd’hui, nous avons détaillé une vulnérabilité XSS (Cross-Site Scripting) stockée dans le plugin WordPress Importer / Exporter des paramètres du widget. Ces failles n’ont pas encore été corrigées, nous recommandons donc aux utilisateurs de désactiver et de supprimer ce plugin immédiatement jusqu’à ce qu’un correctif soit disponible. Sites en cours d’exécution Wordfence Premium sont protégés des attaques contre cette vulnérabilité depuis le 12 mars 2020. Les sites exécutant la version gratuite de Wordfence ont reçu une mise à jour des règles de pare-feu le 11 avril 2020.


Source link