OMGF Pro v5.2.7 Closes the Breach: A Full Breakdown of the Exploit
On June 25, 2026, a critical vulnerability in OMGF Pro was actively exploited in the wild. I’ve spent the past hours investigating the exploit, analyzing the post-exploitation payloads, and shipping a fix. Now that the dust has settled, I want to walk you through exactly what happened, what the attackers did, and how to verify your site is clean.
The fix is available now. Update OMGF Pro to v5.2.7 immediately.
Table of contents
How the attack worked
The exploit was fully automated. From first request to full server access: about 15 seconds.
Here’s the chain:
- The attacker hit a site with a crafted URL that triggered OMGF Pro’s auto-configuration mode — the routine that normally runs during setup to detect which Google Fonts your site uses.
- The URL included a WordPress search query containing a CSS
@importstatement pointing to a malicious.phpfile on the attacker’s server. - Most themes display the search query somewhere on the results page. OMGF Pro saw the
@importin the rendered HTML and treated it as a legitimate stylesheet reference. - OMGF Pro downloaded the file and saved it to
wp-content/uploads/omgf/— with its original.phpextension intact. - The attacker visited the uploaded file directly. The server executed it as PHP. Game over.
No authentication required. No user interaction needed. Fully automated.
What the attackers deployed
The initial file (the “dropper”) didn’t do much on its own. Its real job was to download and install a self-deleting WordPress plugin — innocuously named Charming Quirk — that did all the actual work.
Once that plugin had run, it erased itself, which is why first responders often only see traces of it in their logs and not the plugin itself.
This plugin is not a simple backdoor. It’s a structured, reusable deployment framework with a single public REST endpoint (/wp-json/charming-quirk/v1/check_version) that runs a four-stage pipeline and reports the results back to the attacker. And notably: it was written specifically to target OMGF Pro. One of its stages references the exact internal code of my plugin. This was not a generic attack that happened to catch OMGF Pro — it was built for it.
Here’s what each stage did.
Stage 1 — Planting the backdoors
The plugin downloaded three payloads from the attacker’s server and placed them on the site:
wordfence-security.phpinwp-content/mu-plugins/— a fake “Wordfence” plugin (nothing to do with the real one). It gave the attacker silent admin access through a secret URL parameter and recorded every username and password entered on the login page, forwarding them in cleartext to the attacker’s server.sso.phpinwp-content/mu-plugins/— a fake single sign-on plugin. It registered a public, unauthenticated endpoint that logged the attacker in as admin. Chosen because it looks legitimate and is commonly whitelisted by scanners. (A variant namedsso-1.phpalso exists.)- A randomly named webshell, dropped into a random date folder inside
wp-content/uploads/— for examplewp-content/uploads/2014/07/22/xVbdeffg.php. Note: this is not inuploads/omgf/. It’s deliberately hidden among your legitimate media uploads, in a folder with a believable old date.
Here’s the part that makes detection genuinely hard: after writing each file, the plugin copied the modification date from existing, legitimate files onto the new ones — and even onto the WordPress root directory.
This means a scan that looks for “recently modified files” will not find these backdoors. They look just as old as the rest of your site. You cannot rely on file dates to find this infection. You have to look at file contents and locations.
Stage 2 — Patching the vulnerability behind them
This is the stage that stood out the most. The plugin modified OMGF Pro’s own src/Wrapper.php, injecting a gatekeeper that blocks anyone else from using the same exploit — returning a 403 error to any repeat of the attack — unless the request carries a secret password matching a hardcoded hash.
In other words: after breaking in, they closed the hole behind them to lock out rival attackers, while keeping a key for themselves.
This has an important consequence: a site that returns a 403 error when you try to reproduce the exploit may already be compromised. Don’t treat a 403 as proof you’re safe. The hardcoded hash they injected is a reliable fingerprint — see the checklist below.
Stage 3 — Removing rival administrators
The plugin pulled the list of all administrators and stripped the admin role from any account created after a certain cutoff date — except the original site owner and their own account. The purpose: if a competing attacker had already created their own rogue admin, this kicks them out. It’s territorial. They clean up after other intruders to keep the site to themselves.
Stage 4 — Creating the rogue admin and scanning for neighbours
Finally, the plugin created a new administrator account. On the sites I’ve looked at, it used the display name “Yuna Mochi” with a username consisting of the site’s domain name followed by three random characters. It then backdated the account’s registration date — copying it from an existing user — so the account blends in with your legitimate users. It also suppressed all of WordPress’ email notifications, so no “new administrator created” message ever reached the real site owner.
In the same stage, the plugin walked the entire filesystem from the server’s root, looking for other WordPress installations. For every wp-config.php it found, it read the database credentials, connected directly to that database, and pulled the site’s URL.
On shared or reseller hosting, this means a breach on one site could hand the attacker an inventory — and the database credentials — of every other WordPress site on the same server. If one of your sites was compromised, treat all of them as potentially exposed.
It cleaned up after itself
Once the pipeline finished, the Charming Quirk plugin deleted itself — either on the next shutdown or via a 90-second timer after activation. That’s why the plugin itself is usually gone by the time anyone investigates, leaving only the backdoors it planted and a trace of its REST endpoint in the access logs.
When you’re not affected
While I still recommend updating to v5.2.7 as soon as possible, your site was likely not vulnerable to this specific exploit if any of the following apply:
- You only use OMGF (the free version). This exploit specifically targets OMGF Pro.
- Your server blocks PHP execution in the
wp-content/uploads/directory. Many managed hosting providers enforce this by default. - You’ve disabled WordPress’ search functionality entirely.
- Your theme doesn’t display the search query on the results page.
Keep in mind, though: a clean uploads/omgf/ folder is not proof you’re safe. Because the attacker hid the webshell in a random date folder and patched the vulnerability behind them, a site can look perfectly normal and still be compromised. If you were running a vulnerable version, go through the full checklist below regardless.
A note about daan.dev
This site was not compromised. If you’re a (previous) customer of Daan.dev, your data is safe.
Kinsta, my hosting provider, blocks PHP execution from the wp-content/uploads/ directory by default, which prevented the exploit from doing any damage. This is one more reason I’d recommend choosing a managed hosting provider that enforces this kind of server-level protection.
How to check if your site was affected
If you were running OMGF Pro before v5.2.7, go through all of the following. Don’t rely on file modification dates — the attacker forged them.
- Check
wp-content/mu-plugins/for files namedwordfence-security.php,sso.php, orsso-1.phpthat you didn’t install yourself. - Check
wp-content/plugins/for a plugin folder calledcharming-quirk. If it’s there, your site was targeted and you should assume the backdoors below were planted — but because it normally deletes itself, its absence tells you nothing either way. Check the rest of this list regardless. - Look through
wp-content/uploads/for stray.phpfiles, especially inside date folders (likeuploads/2014/07/22/). Uploads folders should never contain PHP files. A search across the whole uploads directory for.phpfiles is the fastest way to spot them. - Open
wp-content/plugins/host-google-fonts-pro/src/Wrapper.phpand search it for the stringwp_passor the hash$2y$10$EKS7KS20XuJoxuXgMyxthu.rXmhMiFyx5b/39bEbXacoLz.8ZAcve. If either is present, the attacker patched your plugin and your site was compromised. - Review your WordPress user list for admin accounts you don’t recognize — even if the registration date looks old. Watch for the display name “Yuna Mochi” or a username that’s your domain followed by three random characters.
- Check your access logs for requests to
/wp-json/charming-quirk/v1/check_version, or from the IP143.110.232.91. - If you’re on shared or reseller hosting, run all of these checks on every other WordPress site on the same account — the attacker actively scanned for them and harvested their database credentials.
If your site was compromised
If you find any of the above, here’s what to do:
- Remove all identified backdoor files:
wordfence-security.php,sso.php/sso-1.phpfrommu-plugins/, thecharming-quirkplugin if present, and any stray.phpfiles in your uploads folders. - Restore OMGF Pro from a clean copy (delete the plugin entirely and reinstall v5.2.7), so the infected
Wrapper.phpis gone. - Delete any admin accounts you don’t recognize.
- Change all administrator passwords.
- Rotate your WordPress security salts in
wp-config.php. - Change your database password and any API keys stored on the server. The attacker read your database credentials directly, so treat them as compromised.
- Run a full malware scan.
- If your server doesn’t already block PHP execution in the uploads directory, fix that. E.g. for Apache, add an
.htaccessto the uploads directory that denies PHP execution. For Nginx, ask your hosting provider. - If you’re on shared or reseller hosting, repeat every step for each other WordPress site on the same account.
When in doubt, bring in a professional incident responder. Backdoors can be chained and nested, and a single missed file can re-infect everything.
Indicators of compromise
For those who want the raw fingerprints:
- Payload source:
code.elemetate.com(served the dropper and thewordfence-security.txt,sso.txt,file.txtpayloads) - Attacker IP:
143.110.232.91(DigitalOcean) - C2 endpoint:
/wp-json/charming-quirk/v1/check_version - Dropped files:
mu-plugins/wordfence-security.php,mu-plugins/sso.php,mu-plugins/sso-1.php, a random webshell inuploads/<year>/<month>/<day>/, thecharming-quirkplugin, and a modifiedhost-google-fonts-pro/src/Wrapper.php - Patch fingerprint in
Wrapper.php: the parameterwp_passand the hash$2y$10$EKS7KS20XuJoxuXgMyxthu.rXmhMiFyx5b/39bEbXacoLz.8ZAcve - Rogue admin: display name “Yuna Mochi”, username = domain + 3 random characters, registration date copied from an existing user
- Note: file modification dates are forged to match legitimate files — do not rely on them
What I fixed
OMGF Pro v5.2.7 addresses this at multiple levels. The plugin now validates file extensions before writing anything to disk — only .css files can be saved. It verifies that files stay within the expected upload directory, blocking path traversal. And URLs pointing to non-CSS resources are rejected before they’re fetched.
Update now if you haven’t already.
I’m sorry
I take the security of my plugins seriously, and I take full responsibility for this vulnerability existing in the first place. Your trust in my work is not something I take for granted, and I’m committed to making sure something like this doesn’t happen again.
If you have any questions or need help checking your site, don’t hesitate to reach out.