PHP backdoors leave a hidden way back into a website.
PHP backdoors are files or injected hooks that give an attacker continued access to a website. They can expose a webshell, grant a WordPress administrator session, hide an account, log passwords or load more code. Since 1 August we have matched PHP-backdoor code on 1,134 sites.
PHP backdoors in numbers
Since 1 August, when our rule-match records begin, counted on 12 November 2026. How we count.
| Sites with PHP-backdoor code | 1,134 |
|---|---|
| Sites with a match in the last 30 days | 820 |
| New sites in October | 218 |
| Still serving a PHP backdoor when recaptured at least 25 days later | 515 of 565 sites (91%) |
| Sites running WordPress (captured since 25 September) | 75% |
| Named kits | 3 |
Kits compared
Kits with the most sites in the last 30 days first. One site can carry more than one kit. The last column counts sites recaptured at least 25 days after their first match, where there are at least 50.
| Kit | Last 30 days | All sites | First match | Still serving 25 days on |
|---|---|---|---|---|
| FleetSync | 768 | 1,068 | 91% of 552 | |
| StainedHeart | 4 | 5 |
What the infected sites run
696 of the 922 sites we captured since 25 September 2026 run WordPress (75%). Shares below are of the WordPress sites, by the version and plugins on each site's latest capture.
| WordPress version | Sites | Share |
|---|---|---|
| WordPress 7.1 | 403 | 58% |
| WordPress 7.0 | 26 | 4% |
| WordPress 6.9 | 60 | 9% |
| WordPress 6.8 | 23 | 3% |
| Other releases from 6.0 | 71 | 10% |
| Older than 6.0 | 45 | 6% |
| Rare or unreadable version | 68 | 10% |
| Plugin | Sites | Share |
|---|---|---|
elementor | 311 | 45% |
contact-form-7 | 208 | 30% |
elementor-pro | 135 | 19% |
woocommerce | 105 | 15% |
revslider | 93 | 13% |
google-site-kit | 69 | 10% |
essential-addons-for-elementor-lite | 53 | 8% |
header-footer-elementor | 48 | 7% |
js_composer | 45 | 6% |
elementskit-lite | 42 | 6% |
wordfence | 6 | 1% |
Smart contracts
One of these kits reads 3 contracts on Ethereum. Today they return 3 destinations.
A PHP backdoor is code planted on a website to preserve access after the first break-in. It can sit in a standalone webshell, a plugin, a theme or an injected WordPress hook, then act when a request, login or scheduled task reaches it.
compromised website
-> planted PHP file, plugin or hook
-> hidden request, login event or scheduled poll
-> administrator session, credential log or file change
-> backdoor remains in the site for the next request
Webshells and backdoor loaders
A webshell exposes a request-driven action through a PHP file. A backdoor loader can blend into WordPress and ask a controller for work. FleetSync reads its controller through eth_call, sends a site inventory and polls for tasks that execute supplied PHP or write files. Its ea_fleet_sync cron event keeps the polling routine scheduled, and its theme-writing task plants an autologin hook in functions.php. SC Backdoor reads controller addresses from Ethereum with selector 0x3bc5de30, generates administrator cookies and restores its plugin through planted files and database state.
SUGA Mini Uploader is a small upload webshell that prints CVE-UP and ALREADY markers above its form, which makes it easy to spot in a response.
The same habits reach servers that are not WordPress. A script run after gaining root on FreePBX servers adds several accounts with user ID 0, drops Base64-encoded PHP webshells, reinstalls itself from the root and asterisk crontabs and rc.local, stops fail2ban, turns off the FreePBX firewall with fwconsole firewall disable and fetches k.php from 111.223.32[.]50.
Small hooks can provide the same lasting access. FleetSync's // _ea_al snippet accepts ?al=true, selects an administrator or editor and grants a logged-in session. Another plugin creates an administrator, hides both the plugin and user, then sends the new credentials to a remote endpoint.
Hidden accounts and password logs
A hidden WordPress administrator can disappear from several views at once. The code we detect filters user queries, the REST API, XML-RPC, user sitemaps, the administrator list and the displayed account count. Checking only the Users screen can miss it.
We also match an authentication hook that records successful WordPress usernames and passwords in a file disguised as an image upload. The website can keep working normally while each valid login adds another line.
What we see across infected sites
| Month | New sites |
|---|---|
| September | 807 |
| October | 218 |
| November so far | 109 |
75% of the PHP-backdoor sites captured since 25 September run WordPress. Of those, 58% run WordPress 7.1. Of the 565 sites recaptured at least 25 days after their first match, 515 still served PHP-backdoor code (91%).
Finding and removing the planted code
Compare the entire site with trusted releases and a known-good deployment. Check:
- WordPress core, plugins, themes and must-use plugins for added PHP
- uploads for PHP files or files whose contents do not match their extension
- scheduled events such as
ea_fleet_sync, theme files,wp-config.phpand server configuration // _ea_alautologin hooks in every installed theme'sfunctions.php- administrator and capability records directly in the database
- plugins that disappear from the normal plugin list
- login hooks that write usernames or passwords into uploads
- unexpected PHP source printed into an HTML response
Remove every copy of the backdoor and restore changed files from trusted sources. Review site and hosting users, rotate WordPress and hosting credentials, invalidate active sessions, clear caches and inspect adjacent sites under the same hosting account.
Kits
FleetSync
768 sites in the last 30 days
FleetSync is a WordPress backdoor that polls a controller for work and writes an autologin hook into theme files.
StainedHeart
4 sites in the last 30 days
StainedHeart is a PHP credential logger planted in WordPress authentication.
SC Backdoor
SC Backdoor is a WordPress implant that reads its controller from an Ethereum contract, generates administrator cookies and repairs deleted copies of itself..