Understanding security exposures and missing headers detected by our scanner. Click any item to learn what it means, why it matters, and how to fix it.
Critical Issues
Malware Detection Critical Severity
What We Detect
Our scanner looks for common malware patterns in your site's HTML output:
Obfuscated code:eval(base64_decode(...)), eval(gzinflate(...)) - code designed to hide its true purpose
Known backdoors: FilesMan, WSO, c99shell, r57shell, b374k - popular hacker tools
Why It Matters
If malware is detected on your site:
Your site may be sending spam or hosting phishing pages
Visitors could be redirected to malicious sites
Google may blacklist your domain
Your hosting provider may suspend your account
How to Fix
Don't panic — but act quickly
Take a backup of your current state (for forensics)
Scan with multiple tools: Wordfence, Sucuri SiteCheck, or MalCare
Check recently modified files:find /var/www -mtime -7 -type f
Review wp-config.php for injected code at the top or bottom
Check .htaccess in all directories for redirects
Update everything: WordPress core, themes, and plugins
Change all passwords: WordPress admin, FTP, database, hosting panel
Consider professional help: Sucuri or Wordfence offer malware removal services
Fatal PHP Errors High Severity
What It Means
Your site is displaying PHP fatal errors publicly. Common examples:
php_flag display_errors Off
php_flag log_errors On
Exposed Files
Debug Log High Severity
Path: /wp-content/debug.log
What is it?
When WordPress debugging is enabled, PHP errors, warnings, and notices are written to a file called debug.log. This file is meant for developers to troubleshoot issues during development.
Why is it dangerous?
Reveals server file paths (helps attackers map your system)
Shows which plugins/themes have errors (identifies weak points)
May contain database query errors (can expose table structure)
Can contain sensitive data logged by poorly coded plugins
<Files debug.log>
Order allow,deny
Deny from all
</Files>
Option 3: Block access via Nginx:
location ~* debug\.log$ {
deny all;
}
Option 4: Delete the file if you don't need it:
rm wp-content/debug.log
Error Log High Severity
Path: /error_log or /error.log
What is it?
The PHP error log captures runtime errors from your server. It's similar to debug.log but is created by PHP itself rather than WordPress.
Why is it dangerous?
Contains full server file paths
May reveal database connection errors with credentials
Shows PHP version and configuration details
Exposes application logic through stack traces
How to fix it
Move error logs outside the web root in php.ini:
error_log = /var/log/php/error.log
Or block access via .htaccess:
<Files ~ "^error[_\.]?log$">
Order allow,deny
Deny from all
</Files>
PHP Info Medium Severity
Common paths: /info.php, /phpinfo.php, /php.php, /i.php
What is it?
A PHP file containing phpinfo() which outputs detailed information about your server's PHP configuration. Often left behind after initial server setup or debugging.
Why is it dangerous?
Reveals exact PHP version (allows targeting known vulnerabilities)
Shows all loaded PHP modules
Displays server paths and environment variables
May expose database hostnames and internal IPs
Shows email configuration (SMTP settings)
How to fix it
Simply delete the file:
rm info.php phpinfo.php php.php i.php
If you need phpinfo for debugging, protect it:
<Files "phpinfo.php">
Require ip 127.0.0.1
Require ip YOUR.IP.ADDRESS
</Files>
Install.php Critical Severity
Path: /wp-admin/install.php
What is it?
The WordPress installation script. On a properly configured site, this should not be accessible after initial setup.
Why is it dangerous?
An attacker could potentially reinstall WordPress
If database tables are dropped, the installer becomes active again
Can be used to create a new admin account
Indicates the site may have configuration issues
How to fix it
Block access via .htaccess:
<Files install.php>
Order allow,deny
Deny from all
</Files>
Or via Nginx:
location = /wp-admin/install.php {
deny all;
}
XML-RPC Medium Severity
Path: /xmlrpc.php
What is it?
XML-RPC is a remote procedure call protocol that allows external applications to communicate with WordPress. It was used for features like pingbacks, the mobile app, and remote publishing.
Why is it dangerous?
Brute force amplification: Attackers can try hundreds of passwords in a single request
DDoS attacks: Can be used in pingback-based DDoS attacks
Username enumeration: Reveals valid usernames
Most sites don't need it (REST API replaced most functions)
How to fix it
Block access via .htaccess:
<Files xmlrpc.php>
Order allow,deny
Deny from all
</Files>
Or disable via plugin or functions.php:
add_filter('xmlrpc_enabled', '__return_false');
Note: If you use the WordPress mobile app or Jetpack, you may need XML-RPC enabled.
Exposed Directories Medium Severity
Common paths: /wp-content/, /backup/, /dev/, /staging/, /old/, /test/
What is it?
Directories that are publicly browsable (directory listing enabled), exposing the names of every file inside. These may contain sensitive files, backups, or development code that shouldn't be visible to the internet.
Why is it dangerous?
/wp-content/ folder: The most serious. It exposes uploads, plugin and theme folders, and — on many sites — backups or migration archives left in /wp-content/ or /wp-content/uploads/. Attackers can read plugin/theme names and versions to find known vulnerabilities, and download anything that was left there.
Backup folders: May contain database dumps with all your data
Dev/staging folders: Often have debugging enabled and weaker security
Old folders: May contain outdated, vulnerable WordPress versions
Directory listing shows all files to attackers
How to fix it
Disable directory listing site-wide in .htaccess (this is the right fix for /wp-content/, which you cannot delete since WordPress needs it):
Options -Indexes
For Nginx, add this inside the relevant server or location block:
autoindex off;
An exposed /wp-content/ is almost always a sign that directory listing is on for the whole site — the Options -Indexes / autoindex off; fix closes /wp-content/ and every other folder at once. You can also drop an empty index.php or index.html into a folder to stop it listing, which is how WordPress protects its own directories by default.
For stray dev/backup/old folders that aren't needed, remove or password-protect them:
# Delete if not needed
rm -rf /var/www/html/backup/
# Or password protect
<Directory "/var/www/html/backup">
AuthType Basic
AuthName "Restricted"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
User Enumeration Medium Severity
Common vectors: /wp-json/wp/v2/users, /?author=1
What is it?
WordPress can leak the list of usernames (login names) to anyone, without authentication. The REST API endpoint /wp-json/wp/v2/users returns published authors as JSON, and the legacy /?author=1 URL redirects to /author/{username}/, revealing the login name. Either one hands an attacker a valid username.
Why is it dangerous?
Half the work of a break-in done for free: A brute-force or credential-stuffing attack needs a valid username and a password. Leaking usernames removes the first unknown.
Targets admins specifically: Enumeration often reveals which account is the administrator, so attackers focus their password guessing where it counts.
Feeds automated bots: Mass scanners harvest these usernames at scale to seed login attacks.
How to fix it
Block the REST users endpoint for unauthenticated visitors (functions.php or a small plugin):
add_filter('rest_endpoints', function ($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});
Block the ?author= enumeration redirect in .htaccess:
Most security plugins (Wordfence, iThemes Security, All In One WP Security) also offer a one-click toggle to block user enumeration via both vectors.
Security Headers
Security headers are HTTP response headers that tell browsers how to behave when handling your site's content. They add an extra layer of protection against common attacks.
HSTS (Strict-Transport-Security) Medium Severity
What is it?
HSTS tells browsers to only connect to your site via HTTPS, even if the user types http:// or clicks an HTTP link.
CSP tells the browser which sources of content (scripts, styles, images, etc.) are allowed to load. It's a powerful defense against cross-site scripting (XSS) attacks.
Proactive security measures that prevent attacks before they reach your WordPress site.
Web Application Firewalls (WAF) Recommended
What is a WAF?
A Web Application Firewall sits between your website and the internet, filtering malicious traffic before it reaches your server. WAFs block common attacks like SQL injection, XSS, and brute force attempts automatically.
Why does this matter for our scans?
Sites protected by a WAF often block our security scanner, which means we can't check for exposures or missing headers. This is actually a good thing! If a WAF blocks our scanner, it would also block malicious bots and attackers trying to find the same vulnerabilities.
Our detection rate would be nearly twice as high without WAFs — but we'd rather see sites protected than exposed. We focus on helping the ~30-40% of sites that don't yet have this layer of protection.
Popular WAF Options
Cloudflare (Recommended for most sites)
Free tier available with basic WAF protection
Also provides CDN, DDoS protection, and SSL
Easy setup — just change your nameservers
Pro plan ($20/mo) adds advanced WAF rules
Setup: Sign up at cloudflare.com → Add your site → Update nameservers at your registrar → Enable "Under Attack Mode" if needed.