粗糙的分析了一下。。2333


首先看看我们的 poc?s=index/think\app/invokefunction

然后在 library\App.phprun 函数中:

此处输入图片的描述

那么 dispatch 是什么呢?
此处输入图片的描述

由于我没有 debug 插件,所以用我最爱的 print_r,这里我用了 laysns(别问,随便挑的):
此处输入图片的描述
此处输入图片的描述
发现在此时 dispatch 是空的且与参数无关,那么就必然进入:if(empty($dispatch))
此时的 $request 是 ThinkPHP 的 request 对象:
此处输入图片的描述

那我们跟入 routeCheck
此处输入图片的描述

首先 path 是获取 参数 s 的值:
此处输入图片的描述

接下来似乎判断了,是否需要检测路由。

是否都无所谓,因为我们传的一般不在路由规则里,再接下来:
此处输入图片的描述

判断是否需要强制路由,如果开启了强制路由,那么就会异常退出。这也就是为什么漏洞描述说:在关闭强制路由的情况下。

然后就到了:
此处输入图片的描述

这里了,如果我们路由没匹配到,此处我们就的 $result 就还是空,此时就会进入 parseUrl 函数,这个函数就不过多分析了,就是拆分 $path(其实是压根没看。233)

看看此处的输出就很明了了:
此处输入图片的描述

数组第一个是控制器,第二个是类,第三个是方法

可以看到已经拆分成这样了,然后返回:
此处输入图片的描述

然后就一路执行到 self:exec 处。此时就执行了 payload 指定的类: think\app 中的方法:invokefunction

没错,但是这个文件:
此处输入图片的描述

这里用了反射,我不是特别明白。。反正能执行就对了。233

end。。。。(说实话这种洞放我我还真看不出来。。。)