Files planted in uploads
An attacker with write access drops installers, archives, Android packages or script files into wp-content/uploads, often into a dated folder where they look like ordinary media.
Guide · Search Console security issues
Search Console reports that your site serves or links to malicious or unwanted software, and Chrome may already be blocking downloads or warning visitors away from the site. On a WordPress site that does not distribute software, the files almost always arrived through a compromise — planted in the uploads folder, or linked from content an attacker injected. Both the files and whatever put them there have to go before a review can pass.
Published Last reviewed
What the issue means
“Harmful downloads” is a judgement about the software itself: Safe Browsing has classified a file your site serves, or a file on another site your pages link to, as malware or as unwanted software that misleads users or changes their system without consent. Browsers that use Safe Browsing may block the download or warn visitors before they reach the site.
“Uncommon downloads” is a judgement about reputation rather than proven harm. It means visitors are being offered downloadable software that Safe Browsing has not seen often enough to vouch for. If the files are genuinely yours — a desktop app, a plugin you sell, an installer — the issue is about distribution and signing, not about a compromise.
The sample URLs in the report tell you which one applies. A download link you recognise that is flagged as uncommon is a release question. An installer, an Android package or a script you have never seen, or a link to a file host you never used, is evidence of a compromise.
Where they come from
An attacker with write access drops installers, archives, Android packages or script files into wp-content/uploads, often into a dated folder where they look like ordinary media.
Links inserted into posts, widgets or menus, or added by a script at page load, that point at a malicious file elsewhere. Your site serves no file, but it sends visitors to one.
An overlay telling visitors their browser or a player is out of date, offering a “fix” that is the malware. Fake verification lures work the same way with a pasted command instead of a file.
A real download link on your site edited to point at a lookalike file, or a genuine file replaced on disk with a trojanised copy of the same name.
Links to a file-sharing or download host that is itself flagged. Even links you added in good faith count if the destination serves harmful software.
Rewrite rules or scripts that send some visitors through a chain of redirects ending in a download, so the file never touches your server.
Find them
Every command here reads; none of them opens or runs a downloaded file. Do not download the flagged files to your own computer to “check” them.
Figure 1 · Files that should not be in uploads
An uploads folder should hold media. These do not belong there.
find wp-content/uploads -type f \( -iname '*.exe' -o -iname '*.msi' -o -iname '*.apk' -o -iname '*.zip' \) -ls
-rw-r--r-- 1 acct acct 4718592 Oct 14 03:12 wp-content/uploads/2026/10/Setup_Update.exe
-rw-r--r-- 1 acct acct 6291456 Oct 14 03:12 wp-content/uploads/2026/10/viewer.apk
-rw-r--r-- 1 acct acct 208311 Mar 2 2025 wp-content/uploads/2025/03/brochure-pdfs.zip
grep -c 'Setup_Update.exe' /path/to/access.log
1873
# the 2025 archive is yours; both installers were written at 03:12, and one was requested 1,873 times
Search Console’s Security Issues report lists the issue and, where Google provides them, sample URLs. Note whether each sample is a file on your site or a page that links elsewhere.
Media folders should hold images, documents and video. Anything that installs or runs deserves an explanation:
find wp-content/uploads -type f \( -iname '*.exe' -o -iname '*.msi' -o -iname '*.apk' -o -iname '*.dmg' -o -iname '*.scr' -o -iname '*.bat' -o -iname '*.vbs' -o -iname '*.js' -o -iname '*.zip' -o -iname '*.rar' -o -iname '*.7z' \) -ls 2>/dev/null
Legitimate archives you uploaded will appear too. Compare dates: files written together, at an odd hour, in a folder for a month you did not publish in, are the ones to examine.
Injected links live in posts, widgets and options. A read-only query lists posts that mention installer or package extensions:
wp db query "SELECT ID, post_type, post_status, post_title FROM wp_posts WHERE post_content LIKE '%.exe%' OR post_content LIKE '%.msi%' OR post_content LIKE '%.apk%' OR post_content LIKE '%.dmg%' OR post_content LIKE '%.scr%'"
Adjust the wp_ prefix to your own. Check widget and theme options the same way, and read the menus in Appearance → Menus.
The access log shows which files were requested and how often, which tells you how far the exposure went:
grep -E '\.(exe|msi|apk|dmg|scr|zip|rar)( |\?)' /path/to/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30
Fake update overlays and redirect chains are conditional. Open the site in a private window on a phone, arriving from a search result, and use URL Inspection’s live test to see what Google receives.
Clean it
Copy the flagged files with their timestamps and hashes into a folder outside the web root, export the database, and keep the access logs. The download counts in the logs tell you who may have been affected.
Delete planted files, remove injected links from posts, widgets, menus and options, and replace any legitimate download that was swapped with a copy from your own trusted source.
Whatever wrote the files or injected the links is still there: an uploader backdoor, a rogue administrator, a compromised plugin, a startup directive or a scheduled task. Cleaning the output without it brings the files back.
Uploads should never execute code. Blocking script execution in that folder at the web-server level closes a common route for planted tools.
Change control-panel, SFTP, database and WordPress credentials from a clean device; then check that every sample URL returns 404 or clean content to every kind of visitor.
From the Security Issues report, describe what was found (which files, which links), what was removed, and how the entry path was closed.
Afterwards
The access log shows how many times each malicious file was downloaded. If the number is more than zero, visitors may have installed it. Depending on who your visitors are — customers, staff, members — consider telling them what was served, when, and what to do, and take advice on any notification obligations.
Keep watching Search Console, the uploads folder and the logs for several weeks. A new executable appearing in uploads after the cleanup is not a coincidence; it means something that can write there survived.
Common questions
Either files were planted on it — usually in wp-content/uploads — or its pages link to malicious files elsewhere, through links an attacker injected into content or a script that adds them at page load. The sample URLs in Search Console show which.
“Harmful” means Safe Browsing classifies the software as malware or unwanted software. “Uncommon” means the software has not been seen often enough to establish a reputation. The first nearly always means a compromise on a typical business site; the second can be your own legitimate files.
Do not open it on your own computer. Copy it from the server into an evidence folder outside the web root, record its hash, and if you need an opinion, look the hash up on a multi-engine scanner rather than running the file.
Because whatever wrote them is still there — an upload backdoor, a rogue account, a compromised plugin, or a scheduled task. Deleting the files removes the symptom; the mechanism is what the cleanup has to find.
Google does not commit to a fixed time and it varies by issue. Reviews for malware issues are generally quicker than for hacked spam. A request sent before every file and link is gone is the most common reason it takes longer.