Kritische Sicherheitslücke im WordPress AdSanity Plugin. – NinTechNet

4. März 2022

WordPress AdSanity Plugin ist anfällig für eine kritische Sicherheitslücke, die die Version 1.8.1 und darunter betrifft. Diese könnte es einem Benutzer mit geringen Rechten ermöglichen, beliebige Dateien hochzuladen, Remote-Code auszuführen und Cross-Site-Scripting-Angriffe zu starten.

Lückenhafte Zugriffskontrolle

CVSS v3.1: 9.9 (Kritisch)

Beim Erstellen einer Anzeige erlaubt das Plugin den Upload einer ZIP-Datei. Dieser Vorgang wird innerhalb des Skripts "adsanity/views/html5-upload.php" von der adsanity_html5_upload AJAX-Aktion, die die ajax_upload Funktion aufruft:

/**
 * Handles the zip file upload via ajax
 */
public static function ajax_upload() {

   // Check the nonce
   if ( ! array_key_exists( 'security', $_POST ) ||
       ! wp_verify_nonce( $_POST['security'], 'adsanity-html5-upload' ) ) {
      wp_send_json_error( 'Security' );
      return;
   }

   // Check that all of the parts are here
   if ( ! array_key_exists( 'file_upload', $_FILES ) ||
       ! array_key_exists( 'tmp_name', $_FILES['file_upload'] ) ||
       ! array_key_exists( 'type', $_FILES['file_upload'] ) ||
       ! array_key_exists( 'ad_id', $_POST ) ) {
      wp_send_json_error( 'Request is missing parts' );
      return;
   }

   // Possible mime type for a zip file
   $allowed_mime_types = array(
      'application/zip',
      'application/octet-stream',
      'application/x-zip-compressed',
      'multipart/x-zip',
   );

   if ( ! in_array( $_FILES['file_upload']['type'], $allowed_mime_types ) ) {
      wp_send_json_error( [
         'message' => esc_js( __( 'Invalid filetype.', 'adsanity' ) ),
      ], 400 );
      return;
   }

   $upload_dir = wp_upload_dir();
   $upload_base_dir = $upload_dir['basedir'];
   $adsanity_dir = trailingslashit( $upload_base_dir ) . 'adsanity/';
   $ad_id = $_POST['ad_id'];
   $ad_dir = $adsanity_dir . $ad_id;

   // Create the ad src for use in meta
   $ad_src = trailingslashit( trailingslashit( $upload_dir['baseurl'] ) . 'adsanity/' . $ad_id );

   // Get the path to this ad
   $ad_path = trailingslashit( trailingslashit( $upload_dir['basedir'] ) . 'adsanity/' . $ad_id );

   /**
    * Initialize WP_Filesystem
    * Used for unzip_file and rmdir
    */
   global $wp_filesystem;
   WP_Filesystem();

   // Check to see if there has already been an upload to this folder
   if ( is_dir( $ad_path ) ) {
      // Remove the folder
      $wp_filesystem->rmdir( $ad_path, true );
   }

   // Unzip the files
   $unzipped = unzip_file( $_FILES['file_upload']['tmp_name'], $ad_dir );

   if ( ! $unzipped ) {
      wp_send_json_error( 'File upload error', 500 );
      return;
   }

   // Scan the directory for this ad
   $scanned = scandir( $ad_path );

   /**
    * Check to see if this only contains a directory
    * HTML5 ads can be uploaded as a zip file
    * of only files, or a zipped folder
    */
   while (
      3 === count( $scanned ) &&
      is_dir( $ad_path . trailingslashit( $scanned[2] ) ) &&
      ! in_array( 'index.html', $scanned )
   ) {
      // Update the path and src with the new inner folder added
      $ad_path .= trailingslashit( $scanned[2] );
      $ad_src .= trailingslashit( $scanned[2] );
      // Re-scan
      $scanned = scandir( $ad_path );
   }

   // Check for the existence of an index.html file
   if ( ! in_array( 'index.html', $scanned ) ) {
      wp_send_json_error( [
         'message' => esc_js( __( 'Zip file must contain an index.html file.', 'adsanity' ) ),
      ], 400 );
   }

   update_post_meta( $ad_id, 'ad_src', $ad_src );

   wp_send_json_success( array( 'src' => $ad_src ) );

}

Diese Funktion wird verwendet, um den Inhalt eines ZIP-Archivs in den Ordner "wp-content/uploads/adsanity/{post_id}/" hochzuladen und zu extrahieren. Sie hat nur eine Sicherheits-Nonce, auf die jeder Benutzer mit mindestens Contributor-Rechten zugreifen kann, und eine einfache Überprüfung, um sicherzustellen, dass sich eine index.html-Datei im Archiv befindet. Nach dem Upload gibt die Funktion den vollständigen Pfad zu dem Ordner zurück, in dem die Dateien entpackt wurden:

{"success":true,"data":{"src":"http:\/\/example.com\/wp-content\/uploads\/adsanity\/407\/"}}

Ein Benutzer mit geringen Rechten, z. B. ein Contributor, kann jede Datei in diesen Ordner hochladen:

Wenn der Blog über eine .htaccess-Datei verfügt, um die Ausführung von PHP-Code im Ordner /uploads/ zu verhindern, kann der Angreifer diesen Schutz leicht außer Kraft setzen, indem er eine andere .htaccess hochlädt.

Im Bereich der Anzeigenverwaltung fügt das Plugin in einer Metabox einen iframe ein, der auf das Verzeichnis verweist, in dem die Dateien extrahiert wurden:

<?php
// Get ad src
global $post;
$ad_src = get_post_meta( $post->ID, 'ad_src', true );
if ( $ad_src ) { ?>
   <iframe src="https://blog.nintechnet.com/critical-vulnerability-in-wordpress-adsanity-plugin/<?php echo esc_attr( trailingslashit( $ad_src ) ); ?>" scrolling="no" frameborder="0"></iframe>
<?php } ?>

Der Angreifer kann ein index.php-Skript in das ZIP-Archiv einfügen. Sein Code wird von dem Iframe anstelle der index.html-Datei geladen und innerhalb der Metabox jedes Mal ausgeführt, wenn ein Nutzer auf den Anzeigenmanager im Backend zugreift:

Darüber hinaus kann der Angreifer auch Dateien mit JavaScript-Code hochladen, die dazu genutzt werden können, den Administrator, der den Beitrag überprüft, anzugreifen:

Zeitleiste

Das Problem wurde den Entwicklern am 13. Januar 2022 gemeldet und eine neue Version 1.8.2 wurde am 14. Januar 2022 veröffentlicht. Beachte, dass die neue Version Contributor-Benutzern das Hochladen von Dateien verbietet, Author+-Benutzern aber weiterhin erlaubt, dies zu tun. Beachte auch, dass du unsere Web Application Firewall für WordPress verwendest, NinjaFirewall WP Edition (kostenlos) und NinjaFirewall WP+ Edition (Premium), können nur der Admin (Einzelseite) und der Superadmin (Multisite) auf die Upload-Funktion zugreifen, alle anderen Benutzer werden blockiert.

Bleib über die neuesten Sicherheitslücken informiert


Quelle


Dieser Artikel ist im Original von blog.nintechnet.com und wurde übersetzt
https://blog.nintechnet.com/critical-vulnerability-in-wordpress-adsanity-plugin/

Abonniere den RSS-Feed von unseren WP News und verpasse keine Meldung: https://die-mainagentur.de/feed/?post_type=wp-news

Alternativ kannst du unseren WP-Newsletter abonnieren

Mit dem Eintrag in den WP-Newsletter bekommst du per Mail über neue Artikel zugesendet. Du kannst den Newsletter jederzeit abbestellen.
Mehr dazu in der Datenschutzerklärung