AI Feeds `actualizador_git.php` Unauthenticated Arbitrary File Upload / RCE (CVE-2025-13597)
by Ryan Kozak (d0n601) · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-13597
- Category
- web
- Affected product
- AI Feeds (WordPress plugin)
- Affected versions
- <= 1.0.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 | Ryan Kozak (d0n601) |
| CVE / Advisory | CVE-2025-13597 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (per NVD) |
| Status | Weaponized |
| Tags | wordpress, ai-feeds, unauthenticated-file-upload, github-mirror-abuse, webshell, python, cwe-434, cwe-306 |
| Related | CVE-2025-13595 |
Affected Target
| Field | Value |
|---|---|
| Software / System | AI Feeds (WordPress plugin) |
| Versions Affected | <= 1.0.11 |
| Language / Platform | Python 3 exploit targeting a PHP/WordPress plugin |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
AI Feeds ships the same vulnerable actualizador_git.php “GitHub mirror updater” helper found in the vendor’s other plugin, Cibeles AI (CVE-2025-13595) — it is directly reachable over HTTP (no ABSPATH guard, no authentication) and blindly downloads and mirrors a GitHub repository into its own plugin directory based on attacker-controlled owner/repo/ref/token query parameters, deleting any local files not present in the attacker’s repo. An unauthenticated attacker can point the endpoint at their own GitHub repo containing a PHP webshell to have it planted and made instantly executable inside wp-content/plugins/ai-feeds/.
Vulnerability Details
Root Cause
Identical logic to CVE-2025-13595, duplicated in the ai-feeds plugin’s copy of actualizador_git.php:
| |
The only validation is that a non-default GitHub token is supplied — any valid PAT works, including the attacker’s own, because $OWNER/$REPO are never restricted to the vendor’s actual repository. The zipball is extracted and mirrored directly on top of the live plugin directory:
| |
rrcopy_into() copies every file from the attacker’s repo into the plugin directory, and mirror_delete_extras() prunes anything not in the manifest — giving the attacker full control over the plugin’s PHP files.
Attack Vector
- Attacker creates a public GitHub repo (e.g.
minimal-rce) containing a PHP webshell (e.g.shell.php). - Attacker sends
GET /wp-content/plugins/ai-feeds/actualizador_git.php?owner=<owner>&repo=<repo>&ref=main&token=<any_valid_PAT>to the target. - The plugin mirrors the attacker’s repository into
wp-content/plugins/ai-feeds/, plantingshell.php. - Attacker requests
/wp-content/plugins/ai-feeds/shell.php?cmd=<command>to execute arbitrary OS commands.
Impact
Unauthenticated arbitrary file write leading directly to remote code execution as the web server user, and full compromise of the WordPress installation.
Environment / Lab Setup
Target: WordPress install with AI Feeds plugin <= 1.0.11 active
Attacker: Python 3, `pip install requests`
Attacker-controlled GitHub repo (e.g. d0n601/minimal-rce) containing shell.php,
and a valid GitHub Personal Access Token (github_pat_...)
Proof of Concept
PoC Script
See
CVE-2025-13597.pyin this folder.
| |
Detection & Indicators of Compromise
GET /wp-content/plugins/ai-feeds/actualizador_git.php?owner=...&repo=...&ref=...&token=... HTTP/1.1
GET /wp-content/plugins/ai-feeds/shell.php?cmd=... HTTP/1.1
Signs of compromise:
- Any external request to
actualizador_git.phpwith non-defaultowner/repoparameters - Recently modified/created PHP files inside
wp-content/plugins/ai-feeds/that don’t match the official plugin release - Presence of
shell.phpor any unexpected single-file PHP scripts under the plugin directory - Outbound HTTPS connections from the web server to
api.github.comcorrelated with plugin file changes
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update AI Feeds to a version that removes or properly authenticates actualizador_git.php (add ABSPATH check, restrict to admin-authenticated + capability-checked requests, and pin the mirrored repository) |
| Interim mitigation | Delete or block direct HTTP access to actualizador_git.php via web server rules; monitor plugin directory file integrity; restrict outbound connections from the web server to api.github.com |
References
Notes
Mirrored from https://github.com/d0n601/CVE-2025-13597 on 2026-07-06. Same vulnerable actualizador_git.php component and vendor as CVE-2025-13595 (Cibeles AI), reused verbatim in the AI Feeds plugin; working exploit script plus a detailed technical README.
| |