Call Us: +1-888-227-1645
Inside a Multi-Tier WooCommerce Card Skimmer

Inside a Multi-Tier WooCommerce Card Skimmer: How a “Logo PNG” Helped Us Catch a Rogue Plugin Early

Randy Hedglin

11 min read

Holiday-level traffic. A thriving WooCommerce catalog. And then, suddenly, customers couldn’t check out.

That’s how our client, a large and well-established online retailer, realized something was wrong. Their checkout page began acting unpredictably: card fields flickered, strange duplicate iframes appeared, and the form quietly stopped accepting payments. Not knowing the cause, their team took the safest step they could — they disabled credit card payments entirely.

For an e-commerce business, shutting down your own checkout is the nightmare scenario. The store was open, customers were ready to buy, and something deep inside the site was quietly interfering with the most critical part of the process.

What happened next led us into one of the most layered, evasive, and surprising security investigations we’ve worked on. The skimmer we uncovered resembled techniques that the broader WordPress security community would only begin discussing weeks later. (It’s rare to catch something this early; we only realized the scope after pulling on the first thread.)

The First Symptom: Ghost Iframes on the Checkout

The earliest clue didn’t appear in the error logs or the code. It showed up in the browser during real customer sessions.

Some shoppers began reporting:

But when our developers opened Chrome DevTools or Firefox Inspector to investigate, the problem disappeared completely. The checkout looked clean. No strange frames. No injected code. No errors.

This wasn’t a glitch. It was intentional.

(It took a few rounds of “Why can’t we reproduce this?” before the pattern clicked.)

A Skimmer Engineered to Hide From Developers

As we later discovered, the attack included an anti-forensics technique that allowed it to run only when no one was watching. It shut itself off anytime it detected developer tools.

The script actively monitored the browser for:

If any of these signals appeared, the malicious code quietly refused to run.

This meant customers saw the attack, but developers didn’t. It also meant traditional debugging techniques wouldn’t help — because the moment you looked at it, the skimmer disappeared.

This behavior aligns with trends now widely reported: attackers are increasingly designing skimmers that behave differently depending on who is viewing the page. It’s a frustratingly clever tactic, and one that forces you to rethink old debugging habits.

Why Standard Malware Scanners Didn’t Catch It

The client had an excellent security stack:

All helpful. All necessary. But none initially flagged the compromise.

Not because they failed — but because modern malware is designed to live where scanners don’t usually look. It can:

This attack took advantage of every one of those blind spots.

And the longer we looked, the more it became clear this wasn’t a “single bad file” situation.

Stage 1: A Rogue “WooCommerce Filters” Plugin

Our first breakthrough came from an unusual database entry named:

woocommerce_filters_template

It contained a very long encoded string. No legitimate plugin was used in the environment.

That led us to a plugin in the filesystem with a name resembling a well-known filtering extension. Its header metadata looked entirely legitimate:

/**

 * Plugin Name: WooCommerce Advanced Filters

 * Description: Adds advanced product filters to WooCommerce.

 * Version: 2.5.7

 * Author: BeRocket

 */

But scrolling down revealed something very different.

This plugin:

The decoded payload was a fully interactive webshell — essentially the attacker’s control panel — complete with:

This plugin wasn’t about filtering products. It was the attacker’s command center.

It was the first moment we realized we were dealing with a coordinated system, not a one-off compromise.

Stage 2: The Logo PNG That Wasn’t Just a Logo

Next, we traced the checkout iframe issues back to something unexpected: a file in the Media Library that looked perfectly normal.

/wp-content/uploads/YYYY/MM/cropped-logo-min.png

At first glance, it was a valid PNG:

But right after the IEND marker — which should signal the end of the file — there was more data. Data that didn’t belong in a PNG.

Hidden there was an obfuscated JavaScript credit card–skimming script.

Once decoded and run (but only when DevTools weren’t open), it:

This exact “malware hidden in PNGs” technique was later identified in a broader campaign. Our client just happened to be one of the early cases.

Stage 3: A Database-Backed Backdoor in a Theme Fonts Directory

Even after we removed the fake plugin and malicious PNG, reinfections kept appearing in unexpected places:

That last one was significant. Image folders should never contain PHP files.

Inside one such file, we found code that:

The attackers weren’t just injecting files. They were hiding code inside the database, allowing reinfection even after plugins were cleaned.

Together, these pieces formed a clear multi-tier architecture:

This wasn’t a simple infection. It was a system.

And every time we peeled back one layer, another one was waiting.

How We Contained and Removed the Skimmer

Because this was a live, revenue-critical WooCommerce store, our response had to be swift, precise, and disruption-free.

There wasn’t room for trial and error. Every move had to count.

1. Immediate Containment

2. Eliminate All Known Backdoors

3. Identify and Remove Persistence

4. Partner With Hosting and Security Vendors

5. Harden the Environment

After the final persistence layer was removed, the reinfections stopped. Checkout behaved normally. No more ghost iframes. No more hidden code reviving itself.

It’s the kind of quiet relief you only get after days of chasing something that doesn’t want to be found.

Lessons for WooCommerce Stores and Enterprise WordPress Teams

1. Modern malware blends in

It often hides inside:

2. File-only scanning isn’t enough

If the malware lives in the database, scanners won’t catch it.

3. Cache files exaggerate symptoms

They often contain copies of malicious code, but aren’t the origin.

4. DevTools-aware malware is here

If your malware hides when inspected, traditional debugging falls short.

5. Hosting + security vendors + developers = real protection

Each layer protects in different ways, but only developers who know your codebase can close the gap.

And sometimes the smallest clue, like a single misplaced PNG, ends up being the key.

How Curious Minds Media Helps Secure Enterprise WooCommerce

At Curious Minds Media, security isn’t an afterthought. It’s an integral part of how we design, build, and maintain WordPress and WooCommerce platforms.

We specialize in:

With roots going back to 2004, our team has helped hundreds of site owners scale their online stores securely and confidently.

If Your WooCommerce Checkout Is Behaving Strangely, Don’t Ignore It

Duplicate iframes, intermittent field behavior, unexplainable redirects, or recurring cache files aren’t harmless glitches anymore.

If your team is noticing anything unusual or if you simply want a comprehensive security audit, we’re here to help.

Let’s secure your store, protect your customers, and keep your revenue flowing safely.

Because in cases like this, the difference between a quick recovery and days of lost revenue usually starts with the very first symptom someone almost overlooks.

From the blog

Latest Articles

Let's build something amazing together

Give us a ring and let us know how we can help you reach your goals. Or if you'd like, start a chat. We're usually available 9-5 EST. We try to respond to every inquiry within one business day.

Phone number
+1-888-227-1645

Technologies and services we work with:

Laravel Laravel
WordPress WordPress
React ReactJS
EmberJS EmberJS
woocommerce WooCommerce
next.js NextJS
gatsby Gatsby
Shopify Shopify
VueJs VueJS
contentful Contentful
next.js JAMStack
gatsby Laravel Jigsaw
WPEngine WP Engine
Laravel Livewire Laravel Livewire
Netlify Netlify