Pterodactyl Panel Unauthenticated Path Traversal via locale.json Leaking Database Credentials (CVE-2025-49132)
by vimmwy · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-49132
- Category
- web
- Affected product
- Pterodactyl Panel (game server management panel)
- Affected versions
- Prior to 1.11.11
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | vimmwy |
| CVE / Advisory | CVE-2025-49132 |
| Category | web |
| Severity | Critical |
| CVSS Score | 10.0 (per NVD) |
| Status | Weaponized |
| Tags | pterodactyl, path-traversal, unauthenticated, information-disclosure, credential-leak, database, php, config-exposure, cwe-22 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Pterodactyl Panel (game server management panel) |
| Versions Affected | Prior to 1.11.11 |
| Language / Platform | Python 3 (requests, colorama) PoC targeting a PHP/Laravel web application |
| Authentication Required | No |
| Network Access Required | Yes (HTTP/HTTPS to the Pterodactyl Panel instance) |
Summary
Pterodactyl Panel prior to version 1.11.11 exposes a /locales/locale.json endpoint that accepts attacker-controlled locale and namespace query parameters without a required integrity/hash check, allowing an unauthenticated attacker to traverse outside the intended locale-file directory and force the panel to load and reflect the contents of arbitrary PHP configuration files as JSON. By pointing locale at a relative path traversal sequence (e.g. ../../../pterodactyl) and namespace at config/database, the attacker causes the panel’s PHP config array for config/database.php to be returned in the JSON response, leaking the live MySQL host, port, database name, username, and password. The included PoC sends this request and parses the leaked credentials directly out of the JSON response. With direct database access (or access to phpMyAdmin), an attacker can insert a row into the users table to create an administrator account and gain full control of the panel and every game server it manages.
Vulnerability Details
Root Cause
The /locales/locale.json endpoint builds a file path from the client-supplied locale and namespace parameters without sanitizing directory traversal sequences, and without enforcing the hash= parameter that is meant to gate which locale files can be requested. Because Pterodactyl’s PHP config files (e.g. config/database.php) return arrays when included, requesting them through the locale-loading mechanism causes their in-memory array contents (including database credentials) to be serialized into the JSON response instead of being treated as an error.
Attack Vector
- Send
GET /locales/locale.jsonto the target and confirm it returns a JSON body without ahash=parameter present — this indicates the traversal check is not enforced (i.e., the instance is vulnerable). - Send
GET /locales/locale.json?locale=../../../pterodactyl&namespace=config/database— the traversal inlocaleescapes the intended locale directory and resolves to the application root, andnamespace=config/databaseselectsconfig/database.phpfor inclusion. - The server responds with JSON containing the parsed contents of the PHP config array, including
connections.mysql.host,port,database,username, andpassword. - The attacker uses the leaked database credentials to connect directly (if port 3306 or a local/hosted phpMyAdmin is reachable) and inserts a new row into the
userstable to create an administrator-level Pterodactyl account. - The attacker logs into the panel with the newly created administrator account, gaining full control of the panel and all managed game servers (which can be used to obtain a reverse shell on the host).
Impact
Complete unauthenticated compromise of the Pterodactyl Panel: disclosure of database credentials, arbitrary code execution potential via crafted config files, database tampering to create administrator accounts, and full takeover of the panel and all managed game servers.
Environment / Lab Setup
Target: Pterodactyl Panel < 1.11.11, network-reachable /locales/locale.json endpoint
Attacker: Python 3 with `requests` and `colorama` installed
Proof of Concept
PoC Script
See
CVE-2025-49132_PoC.pyin this folder.
| |
Sends GET /locales/locale.json?locale=../../../pterodactyl&namespace=config/database to the target and, if vulnerable, parses and prints the leaked MySQL username:password@host:port/database connection string directly from the JSON response.
Detection & Indicators of Compromise
Signs of compromise:
- Access log entries for
/locales/locale.json?locale=../traversal requests - Unexpected new administrator accounts appearing in the panel’s
userstable - Unrecognized direct database connections to the Pterodactyl MySQL instance
- Unexplained server/game-instance creation or reverse shell activity originating from panel-managed servers
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade Pterodactyl Panel to version 1.11.11 or later, which patches the locale.json path traversal |
| Interim mitigation | No official software workaround exists; deploy an external Web Application Firewall (WAF) to block traversal sequences (../) in requests to /locales/locale.json, and restrict direct network access to the database port |
References
Notes
Mirrored from https://github.com/vimmwy/CVE-2025-49132 on 2026-07-06. CVE-2025-49132_PoC.py sends the real locale.json path-traversal request and parses leaked Pterodactyl DB credentials.
| |