Kritische Sicherheitslücke im WordPress AdSanity Plugin. – NinTechNet

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