Blog
Triage First, Patch Second: A Practical WordPress Security Audit
Stop treating every plugin update equally. Learn a triage-first WordPress security audit that focuses on unauthenticated risks and explains findings to non-technical stakeholders.
Summary
This article explains why blanket-patching WordPress plugins is a counterproductive security habit and offers a more targeted, triage-first audit method. It highlights that approximately 43% of plugin vulnerabilities can be exploited without authentication, so those deserve priority. The checklist covers triaging vulnerabilities, pruning your plugin inventory, reading scan results with healthy skepticism, auditing user privileges, checking for webshells and log anomalies, and simplifying audit reporting. Each step includes a practical example and a caveat, written for marketers who have to justify security work to a non-technical manager. By following this approach, you can focus limited resources on the risks that actually matter, rather than chasing every alert.
Patching every plugin on the same day is one of those security habits that feels responsible and can actually be counterproductive. The thinking behind it is sound: industry research consistently attributes more than 96% of WordPress ecosystem vulnerabilities to third-party plugins, and the recent pace of disclosures makes the fear feel urgent — SecurityWeek reported 8,000 new WordPress vulnerabilities in 2024 alone. But "update everything equally" treats all vulnerabilities as if they pose the same risk, and they don't. A large share of plugin flaws require the attacker to be logged in first; estimates put the unauthenticated share at roughly 43%. Those are the flaws an anonymous bot can hit at scale, and they deserve a completely different response from one that requires an existing account.
This article lays out a triage-first audit: a checklist built around reachability, activity, and residual risk rather than patch velocity. It's written with an eye toward the person who has to translate security findings into budget talk with a non-technical decision-maker, because the hardest part of a WordPress audit isn't running the tools — it's explaining why a calm, prioritized list is more useful than a dramatic "patch everything" alarm.
Triage Your Vulnerability List by "Who Can Reach It Without Logging In"
A vulnerability's severity score tells you how bad the damage could be; it doesn't tell you how likely it is that someone will trigger it. Authentication requirements are the first filter to apply.
Imagine your site runs a page builder that has a stored XSS flaw requiring administrator credentials, and a tiny import plugin that lets any visitor upload a file to a temp folder. The page builder's vulnerability might score higher on the CVSS scale, but an attacker needs to already have an admin account to trigger it. The import plugin, by contrast, is exposed to every scanning bot that passes. Patching the page builder first because it scored higher is the kind of mistake that leaves your actual open door unlatched.
Pull the list of plugin vulnerabilities from your security scanner or advisory feeds and split it into two piles: "remote, no auth" and "requires a role." Patch the no-auth pile within hours — and if a vulnerability shows up in the CISA Known Exploited Vulnerabilities catalog, treat it as an emergency, since that catalog tracks flaws already being used in real attacks. The authenticated pile becomes a normal maintenance task, scheduled alongside your update testing.
Does that mean you can ignore authenticated vulnerabilities? No. But they belong on a different cadence, especially if your site has many authors or editors. Triage isn't about ignoring risk; it's about sequencing it. A standard plugin audit tracks versions, but not reachability. This step is what makes the difference.
Delete What You're Not Using (Or At Least Hide It)
Every plugin you've installed is a path an attacker can take, and inactive plugins are often the worst of the bunch: no one watches them, no one updates them, and they sit in a known directory structure that scanners recognize.
Consider the scheduled-posting plugin a former intern used for a two-week launch campaign. It's deactivated but still on disk, and the vendor hasn't released an update in three years. An attacker doesn't care that you aren't using it; they care that the file /wp-content/plugins/launch-scheduler/ajax.php exists and accepts unauthenticated requests. Deactivated plugins are a common source of the "we didn't think we needed to update that" theme in incident reviews. A plugin that exists is an attack surface whether it's active or not.
Make an inventory and label every plugin: "in active use," "needed but not active," or "no longer needed." For anything in the last group, deactivate and delete — not just deactivate, because plugin code remains readable until it's removed. For the "needed but not active" group, at minimum restrict access to the plugin's files or move its data into a locked-down location. You'll be surprised how many plugins were installed for one campaign and never removed. Abandoned plugins have a way of becoming liabilities, as covered in our deep dive on abandoned WordPress plugins.
Even deleting introduces risk. If the plugin supported content that's still on your page, removing it may break something. So the inventory step isn't a mandate to delete recklessly; it's a reason to decide, in writing, what you're keeping and why.
Treat the Scan as a Starting Point, Not a Verdict
An automated scan is a signature matching exercise: it compares your site's known patterns to a database of known bad patterns. It doesn't reason about your configuration, user roles, or custom code interactions.
| What a scan catches | What it routinely misses |
|---|---|
| Outdated plugin versions with known CVEs | Over-privileged user accounts |
| Exposed files and default admin usernames | Unusual login patterns or new admin users |
| Known exploit signatures | Misconfigured file permissions |
| Recent malware patterns | Logic flaws in custom code and plugin interactions |
Guides like SANS's Scanning WordPress Plugins for Vulnerabilities make clear that scanning is a specialist activity with real methodology, and OWASP's Web Security Testing Guide frames static and dynamic testing (SAST and DAST) as complementary layers rather than substitutes. A scan that comes back clean simply means the known signatures didn't match; it says nothing about whether your site is actually safe.
Use the scan to generate leads, then manually verify each finding. And before you install yet another security-scanning plugin, consider that the pile-up of security plugins can backfire and create blind spots. If the cleanliness of the report becomes more important than the actual risk, you've lost the plot.
Audit Users the Way an Attacker Enumerates Them
The "unauthenticated" attack surface gets your urgent attention, but authenticated attacks are affordable for attackers too — they just need credentials. Users are a path into the system, and your user list is a map of that path.
Your WordPress user list probably includes an "admin" account with a username like marketing and a password like Marketing2020, a former freelancer's editor account that was never removed, and a handful of accounts you barely remember creating for outside vendors. Attackers use public-facing email addresses and breach data to build candidate lists, then try those usernames and passwords across millions of sites. A forgotten account with a reused password is a perfectly adequate login: they don't need to break a plugin vulnerability if they can walk in through the front door.
Export a list of all users, set aside time to review it, and remove or downgrade accounts that no longer need access. Enforce two-factor authentication on every administrator account, and change any password that looks like a variant of your company's name. After that, consider a minimal privilege structure: most day-to-day content editors need at most an Editor role — Admin roles should be reserved for people who actually install plugins or change code.
The WordPress REST API exposes user IDs to anyone, so you can't fully hide usernames. But you can make them harder to guess by avoiding predictable naming conventions, and you can auto-block obvious brute-force attempts.
Look for What Attackers Leave Behind
Compromise isn't a single moment; it's a process. The entry point might get patched, but an attacker who establishes a backdoor will still have access after the vulnerability is fixed. Auditing for persistence is different from auditing for entry.
Fastly's security team wrote about active exploitation of unauthenticated stored XSS in WordPress plugins — scripts that let an attacker take over a session from a legitimate user's browser. Independent research from Invicti points to a rise in PHP object injection, a technique that often slips past signature-based scanners. And in the high-profile case of WP2Shell, even core WordPress had RCE flaws with public exploits. None of these are the kind of thing a plain "check for known malware" scan reliably catches. What they have in common is that they leave traces: an extra admin user, a PHP file uploaded to wp-content/uploads/, a login at 3am from a new IP.
At least monthly, review access logs for POST requests to .php files in the uploads folder and for admin logins from unexpected locations. Watch your user list for new administrator accounts you didn't create. If you can run a file-integrity monitor, configure it to alert on changes to wp-admin and wp-includes; if not, a one-line diff of file modification times is a decent low-tech proxy.
Log review produces false positives. The trick is to define your baseline for "normal" before an incident, not after. If you learn what your usual traffic looks like, the anomalies become louder.
Write the One-Page Audit Memo Your Boss Actually Needs
Security advice in a pitch-meeting format is worthless if it doesn't translate into priorities. The goal isn't to convince your boss you're under attack; it's to show that you know what you checked, what you fixed, and what's still an open decision.
When your manager asks "Are we secure?", the honest answer isn't a single word. It's a short narrative: "We checked our plugin list last week and removed four plugins we weren't using. We found one admin account that belonged to a former employee and we deactivated it. There are two open items: we still need to decide whether to replace a legacy plugin, and we haven't enforced 2FA on one account. Our next review is in a month." That answer turns a question about dread into a question about process — and it gives the non-technical listener something they can actually re-explain upstairs.
Write a one-page audit note at the end of your check session. Use a simple table: checked, fixed, open, next review. In plain language, not risk-symbols or dread statistics. If you're going on vacation, the note becomes a handover for whoever else has admin access. This is also what you'll pull out when your boss suddenly asks, "Are we fine?" two weeks later. If this becomes a monthly rhythm, you're doing a proactive security audit rather than a one-off scan.
Don't pad the memo with every vulnerability score from the scan. The point is to show that you maintain a cadence, not that you became a penetration tester overnight. A calm one-pager is more useful than an alarming full report.
The most hardened WordPress site is not the one with the most plugins or the loudest scan reports; it's the one where someone has made deliberate decisions about reachability, access, and persistence. Start with the unauthenticated attack surface, prune what you don't need, treat scans as leads, review user roles, and plan for the aftermath. Patch smarter, not everything — and let the prioritization be what you defend in the next budget conversation.
