- Vulnerability Background
- CVE-2025-15466 affects the WordPress plugin "Image Photo Gallery Final Tiles Grid" in all versions up to and including 3.6.9.
- The issue is broken access control in multiple AJAX handlers inside
FinalTilesGalleryLite.php. - The plugin exposed management operations for galleries and images via AJAX endpoints that performed nonce validation only, but did not verify that the authenticated requester had the right to act on the targeted resource.
- This is critical because it allows authenticated users with Contributor-level access or higher to manipulate galleries owned by other users, including administrators. Actions include view, create, edit, clone, delete, and reassign ownership.
- The affected systems are WordPress sites running the vulnerable plugin version 3.6.9 or earlier.
- Technical Details
Root cause analysis:
- The plugin used
check_admin_referer('FinalTiles_gallery', 'FinalTiles_gallery')in AJAX actions to confirm the nonce. check_admin_refereris intended to prevent CSRF but does not enforce authorization or ownership.- After nonce verification, several handlers proceeded to act on resource IDs supplied in POST parameters without capability checks or verifying whether the current user could edit the referenced gallery/image.
- Examples include
update_configuration/get_configurationand handlers such asdelete_image,assign_filters,toggle_visibility,assign_group,save_image, andsave_video.
Attack vector and exploitation conditions:
- Attacker needs an authenticated account with Contributor-level access or higher.
- Attacker must be able to obtain a valid
FinalTiles_gallerynonce, which is generally possible from plugin pages accessible to authenticated users. - The attacker sends crafted POST requests to WordPress AJAX endpoints with target gallery or asset identifiers belonging to other users.
- Because the plugin does not verify ownership or adequate privileges, these requests are processed.
Security implications:
- Unauthorized modification of galleries created by other users.
- Unauthorized deletion or cloning of gallery content.
- Reassignment of gallery ownership to attacker-controlled accounts.
- Potential access to administrative content and data escalation within the gallery subsystem.
- This is a broken access control issue, not simply a CSRF bug.
- Patch Analysis
What code changes were made:
- In
FinalTilesGalleryLite.php, patch version 3.6.10 introduced explicit authorization checks after nonce validation. - For gallery-specific operations such as
update_configurationandget_configuration, the patch added:if ( !$this->FinalTilesdb->canUserEdit( $id ) ) { wp_die( 'Forbidden', 403 ); }
- For other AJAX handlers like
delete_image,assign_filters,toggle_visibility,assign_group,save_image, andsave_video, the patch added capability checks such as:if ( !current_user_can( 'edit_posts' ) ) { wp_die( 'Forbidden', 403 ); }
How these changes fix the vulnerability:
- The patch separates CSRF protection from authorization.
- Nonce verification remains in place, but it is now supplemented with permission checks before any destructive or sensitive action is performed.
canUserEdit($id)enforces gallery ownership or edit permission on a per-resource basis.current_user_can('edit_posts')ensures the user has sufficient WordPress capability before executing more general image/gallery operations.- This prevents authenticated low-privilege users from operating on arbitrary gallery IDs simply by supplying them in AJAX requests.
Security improvements introduced:
- Explicit access control in AJAX endpoints.
- Failure modes now return HTTP 403 rather than silently processing requests after nonce validation.
- Reduced attack surface for authenticated users without proper gallery permissions.
- Proof of Concept (PoC) Guide
Prerequisites for exploitation:
- WordPress site with Final Tiles Gallery plugin version 3.6.9 or earlier.
- Attacker account with Contributor role or above.
- Ability to access plugin-admin pages or otherwise obtain a valid
FinalTiles_gallerynonce.
Step-by-step exploitation approach:
- Log in as a Contributor-level user.
- Locate the
FinalTiles_gallerynonce from a plugin page or from page source where the gallery UI is rendered. - Identify a target gallery ID belonging to another user. This may be enumerable by guessing sequential IDs.
- Craft a POST request to
wp-admin/admin-ajax.phpwith:actionset to the appropriate FinalTiles AJAX action (for example the action used byupdate_configurationordelete_image).FinalTiles_galleryset to the valid nonce.galleryIdoridset to the target resource ID.- Additional required parameters such as
config.
- Send the request. If successful, the plugin performs the action on the target gallery/image.
Expected behavior vs exploited behavior:
- Expected behavior: a user can only modify or delete galleries/images they own or have explicit permission to manage.
- Exploited behavior: a user can perform those operations on any gallery/image by supplying an arbitrary ID and a valid nonce, without ownership checks.
How to verify the vulnerability exists:
- Use a Contributor account to invoke a gallery management AJAX action against a gallery owned by another user.
- Confirm that the action succeeds and that the target gallery is changed, deleted, cloned, or reassigned.
- Alternatively, inspect
FinalTilesGalleryLite.phpand verify that handlers performcheck_admin_referer(...)but do not callcurrent_user_can()or a gallery-specific authorization check before using the supplied ID.
- Recommendations
Mitigation strategies:
- Upgrade the plugin to version 3.6.10 or later.
- If immediate upgrade is not possible, patch the plugin by adding explicit authorization checks to every AJAX handler.
- Ensure each AJAX action validates both the nonce and the user’s capability/ownership for the targeted resource.
Detection methods:
- Audit AJAX handlers in WordPress plugins for missing
current_user_can()/ ownership checks. - Monitor requests to
admin-ajax.phpfor FinalTiles actions from low-privilege users. - Look for patterns of POST requests with
actionvalues matching FinalTiles handlers accompanied by gallery or image IDs. - Use host-based logging to detect Contributor accounts acting on resources not owned by them.
Best practices to prevent similar issues:
- Treat nonces as CSRF prevention only, not as authorization enforcement.
- Enforce authorization checks on every action that changes or exposes sensitive data.
- Validate resource ownership explicitly for per-object operations.
- Apply the principle of least privilege: do not allow Contributor-level users to execute actions unless required and authorized.
- Review all AJAX callbacks in plugins when designing admin-facing features.
Summary: CVE-2025-15466 is a clear broken access control vulnerability in the Image Photo Gallery Final Tiles Grid plugin. The fix in 3.6.10 adds the missing capability and ownership checks to AJAX handlers, closing the path that allowed authenticated users to manipulate galleries they did not own.