ThinkPHP framework 任意代码执行漏洞

最近官方发布了一个安全补丁,官方表述是:该URL安全漏洞会造成用户在客户端伪造URL,执行非法代码。

ps:小安,你倒霉了。

可是貌似大多数开发者和使用者并没有注意到此漏洞的危害性,应者了了,更不用说有多少人去升级了。随后我对其进行了分析,发现此问题果然是一个非常严重的问题,只要使用了thinkphp框架,就可以直接执行任意php代码。特此发帖预警各位。

我们来分析一下官方的补丁:

/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
125  –   $res = preg_replace(‘@(w+)’.$depr.'([^’.$depr.’/]+)@e’, ‘$var[‘1′]=”2″;’, implode($depr,$paths));
125  +   $res = preg_replace(‘@(w+)’.$depr.'([^’.$depr.’/]+)@e’, ‘$var[‘1′]=’2′;’, implode($depr,$paths));

这个代码是把pathinfo当作restful类型url进行解析的,主要作用是把pathinfo中的数据解析并合并到$_GET数组中。
然而在用正则解析pathinfo的时候,主要是这一句:

$res = preg_replace(‘@(w+)’.$depr.'([^’.$depr.’/]+)@e’, ‘$var[‘1′]=”2″;’, implode($depr,$paths));

这里明显使用了preg_replace的/e参数,这是个非常危险的参数,如果用了这个参数,preg_replace第二个参数就会被当做php代码执行,作者用这种方式在第二个参数中,利用PHP代码给数组动态赋值。

‘$var[‘1′]=”2″;’

而这里又是双引号,而双引号中的php变量语法又是能够被解析执行的。因此,攻击者只要对任意一个使用thinkphp框架编写的应用程序,使用如下方式进行访问,即可执行任意PHP代码

index.php/module/action/param1/${@print(THINK_VERSION)}

由于是双引号执行,这里为了保险起见,不给出更有危害性的代码,利用这个还是需要点技巧的。

总之这个问题非常严重,找了一下,发现目前没有修补漏洞的网站还是很多的。而ThinkPHP框架的特征其实非常好识别,有意者直接写个scanner进行扫描也未必不可能。

本文固定链接: https://www.unhonker.com/technical/563.html | 90' s Blog|关注网络信息安全

该日志由 unhonker 于2012年04月16日发表在 技术文章, 漏洞公布 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: ThinkPHP framework 任意代码执行漏洞 | 90' s Blog|关注网络信息安全

ThinkPHP framework 任意代码执行漏洞:目前有2 条留言

  1. 板凳
    fans:

    悲剧的thinkphp

    2012-04-16 09:12
  2. 沙发
    小安:

    我的博客系统虽然是THINKPHP,但是我已经打了补丁了,嘿嘿。。。 😎

    2012-04-23 07:08

发表评论

您必须 [ 登录 ] 才能发表留言!