WP Clinic
Log in Sign up

SECURITY KNOWLEDGE BASE

WordPress security problems, explained

Plain-language explanations of 54 common WordPress security findings — what each one is and how to fix it.

Finding

Admin email found in a data breach

The email address tied to the WordPress admin account appears in known public data breaches. This does NOT mean the site itself has been ha…

Finding

Broken link on the home page

A link on the home page points to a page that no longer works. Broken links hurt visitor trust and SEO, and — if the URL was reused by some…

Finding

Comments open with no anti-spam protection

Comments are open across the entire site with no anti-spam protection in place — an easy target for spam bots and malicious links, and occa…

Finding

Confirmed executable PHP backdoor in uploads

A PHP file in the uploads folder wasn't just found — it was confirmed to actually run when requested. Since uploads should only ever serve …

Finding

Cookie missing Secure, HttpOnly or SameSite flags

A cookie is missing one or more security flags (Secure, HttpOnly, SameSite). Without them, that cookie can be sent over plain HTTP, read by…

Finding

Cryptomining script injected on the home page

The home page loads a cryptomining script. Visitors' browsers get used to mine cryptocurrency for whoever injected it, without their consen…

Finding

Default 'admin' username (easy to brute-force)

One of the administrator accounts uses a predictable username, such as "admin" or the site's domain name — handing an attacker half of the …

Finding

Directory listing enabled on wp-content/uploads

Directory listing is enabled on wp-content/uploads — anyone can browse the full contents of that folder in a web browser, including files t…

Finding

Disguised malware file (double extension)

A file was found with two extensions, like image.jpg.php — a classic way to disguise malicious code as a harmless picture or document, sinc…

Finding

Executable PHP file hidden in your uploads folder

A PHP file was found inside the uploads folder — a location meant only for images and attachments, never executable code. This is one of th…

Finding

Expired SSL/TLS certificate

The site's SSL/TLS certificate has expired. Every visitor's browser shows a full-page security warning before they can even reach the site …

Finding

Exposed .env file with secrets

A .env file is publicly downloadable. These files commonly hold API keys, database credentials or other secrets for the site or its plugins.

Finding

Exposed WordPress debug.log file

WordPress's debug.log file is publicly downloadable. It can contain file paths, plugin/theme errors and, occasionally, sensitive data from …

Finding

Exposed wp-config.php.bak backup file

A backup copy of wp-config.php (wp-config.php.bak) is publicly downloadable. This file normally contains your database name, username and p…

Finding

Exposed wp-config.php~ editor backup file

An editor backup copy of wp-config.php (wp-config.php~, left behind by some text editors) is publicly downloadable, exposing the same datab…

Finding

Hidden iframe injected on the home page

The home page loads an invisible (zero-size or hidden) iframe from a domain we don't recognize as a common embed/ad/analytics provider. Thi…

Finding

Hidden SEO spam links injected on the page

The home page contains a hidden block of links (positioned off-screen or display:none) — a classic SEO-spam injection technique that shows …

Finding

Injected script or iframe in a WordPress post

A published post or page contains a <script src> or iframe loading code from an external domain. Unless it's an embed, ad or analytics snip…

Finding

Malicious document.write() injection

The home page writes encoded content into itself via document.write — often used to smuggle a malicious script or redirect past a casual lo…

Finding

Malware hidden in WordPress database settings

A suspicious value was found in WordPress's internal settings (the "options" table, loaded on every single page view) — a favorite hiding s…

Finding

Malware or backdoor signature found in a file

The scan found code that matches known malware or webshell signatures — code built to give an attacker remote control of the site, hidden i…

Finding

Missing Content-Security-Policy header

There's no Content-Security-Policy header. This header is an extra layer of defense that limits which scripts, styles and resources a page …

Finding

Missing HSTS header (no forced HTTPS)

Your site doesn't tell browsers to always use a secure (HTTPS) connection. Without this header, a visitor who types the plain http:// addre…

Finding

Missing Permissions-Policy header

Without a Permissions-Policy header, browser features like the camera, microphone or geolocation aren't explicitly restricted at the page l…

Finding

Missing Referrer-Policy header

Without a Referrer-Policy header, the full URL of the page a visitor was on (which can include private details like search terms or an inte…

Finding

Missing X-Content-Type-Options header

Without X-Content-Type-Options: nosniff, some browsers may try to guess a file's type instead of trusting what the server declares — that g…

Finding

Missing X-Frame-Options header (clickjacking risk)

Your site can be loaded inside an invisible frame on someone else's page ("clickjacking") — a common trick to make visitors click a real bu…

Finding

Multiple broken links on the home page

Several more links on the home page also return an error, beyond the ones already listed above.

Finding

No brute-force or login protection on WordPress

No limit on login attempts and no two-factor authentication was detected, so automated bots can try unlimited passwords against the login p…

Finding

Nulled/pirated plugin with a hidden backdoor

This plugin or theme is an unofficial ("nulled") copy of a paid product, altered to include a backdoor that gives an attacker remote access…

Finding

Obfuscated JavaScript injected on the home page

The home page contains obfuscated JavaScript (encoded/decoded at runtime) — a technique legitimate code rarely needs, and a common way malw…

Finding

Public backup file (.zip/.sql) exposed on the server

A backup-looking file (for example a .zip or .sql database export) was found sitting inside the web root, downloadable by anyone who finds …

Finding

Publicly exposed file or information

Our scan found information or a file on this site that's publicly accessible and shouldn't be — this can range from revealing internal deta…

Finding

Self-signed SSL certificate

The certificate isn't signed by a certificate authority browsers trust (self-signed, or issued by an unknown authority), so visitors see a …

Finding

Server or PHP version disclosed in response headers

The server's response headers reveal the exact web server and/or PHP version in use. That's free reconnaissance for an attacker looking for…

Finding

Sign of a compromised WordPress site on the home page

Our scan found a pattern on the home page that's a common sign of a compromised site (injected/obfuscated code, a hidden redirect, spam con…

Finding

Site blocked for visitors in some regions (geo-blocking)

Our scan reached this site normally from some of our network exits but not from others (different regions/continents). This usually means a…

Finding

Spam content injected on the page (SEO spam)

The home page has an unusually high density of spam-associated terms (casino/pharma/betting and similar). On a site that isn't actually abo…

Finding

SSL certificate hostname mismatch

The certificate installed doesn't cover this exact domain. Browsers show a 'your connection is not private' warning before visitors can rea…

Finding

TLS/HTTPS handshake failed

We couldn't establish a secure (HTTPS) connection at all. This is usually an outdated TLS configuration (very old protocol/cipher support o…

Finding

Too many WordPress administrator accounts

This site has more administrator accounts than is typical for its size. Every admin account is a possible way in for an attacker, so the mo…

Finding

Unauthorized redirect via a meta refresh tag

The home page automatically redirects visitors to another URL via a meta refresh tag. If you didn't set this up, it's a common symptom of a…

Finding

Unrecognized external links on the home page

The home page links to external sites we don't recognize. Links to unknown external sites can be perfectly legitimate, but injected spam or…

Finding

Unrecognized new WordPress administrator account

A new administrator account was found that doesn't look like it was part of the site's original setup — a common sign that an attacker who …

Finding

Untrusted or incomplete SSL certificate chain

The certificate chain couldn't be fully validated — an incomplete chain or an unknown intermediate authority. Depending on their browser, s…

Finding

Unverifiable links on the home page

Some links on the home page couldn't be checked (a timeout or connection issue on our end) — this does NOT mean they're broken, only that t…

Finding

Wildcard CORS header (Access-Control-Allow-Origin: *)

Access-Control-Allow-Origin is set to * (any site). This lets ANY other website's JavaScript read responses from this domain in the visitor…

Finding

WordPress login page at the default address

The login page sits at the default address (/wp-login.php or /wp-admin) — the very first URL every automated attack bot tries against every…

Finding

WordPress readme.html exposes your exact version

readme.html is publicly accessible and reveals the exact WordPress version installed. Combined with a known vulnerability for that exact ve…

Finding

WordPress scheduled tasks (WP-Cron) disabled

WordPress's scheduled tasks (WP-Cron) are turned off, so automatic updates, backups and scheduled scans may silently stop running — leaving…

Finding

WordPress scheduled tasks (WP-Cron) stalled

WordPress's scheduled tasks (WP-Cron) are stuck and haven't fired recently, so automatic updates, backups and scheduled scans may not be ru…

Finding

WordPress username enumeration via the REST API

The WordPress REST API publicly lists real usernames. An attacker uses this to build a precise list of accounts to target with password-gue…

Finding

WP_DEBUG left enabled in production

WP_DEBUG is turned on in production. While it's on, WordPress can print full file paths and detailed error messages directly to visitors — …

Finding

xmlrpc.php enabled and publicly reachable

xmlrpc.php is enabled. It's an old WordPress API that's routinely abused for amplified brute-force login attempts (many password guesses hi…

Scan your WordPress site free

No signup, no credit card — enter your URL and get a security report in seconds.