tp5 代码执行代码审计
-
影响版本:5.0.7<=ThinkPHP5<=5.0.22 、5.1.0<=ThinkPHP<=5.1.30
-
参考链接:https://www.cnblogs.com/haidragon/p/16872969.html
-
复现漏洞:代码执行
-
payload:?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
文章切入点
存在可控get参数s,与之相关的变量为var_pathinfo
作全局搜索
发现在下一步把var_pathinfo变量的值赋给_SERVER并且在下一步去掉了左边的“/”,是对输入url的处理,这里是第一处处理
接下来又在此处把/替换为|
这里是第二处处理,把/替换成|然后装进list
从这里可以看到是以/为界限分成多份
也就变成
根据注释可以知道也就是:
模型:index
控制器:think\app
操作:invokefunction
进行查找发现是官方函数,ReflectionFunction函数创建一个实例叫做reflect,扔给了invokeArgs,进行查找无果是官方函数
执行,回过头来看看
这里第一个参数为function=call_func_array
第二个var[0]=system&var1=id
漏洞修复
上文可以看出本质上这串
s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
就是调用了app文件里面的invokefunction方法,并且进行了参数传入,没有对后者进行过滤,导致代码执行
与之相关的同期漏洞
?s=index/\think\Config/load&file=…/…/test.php # 包含任意.php文件
?s=index/\think\Lang/load&file=…/…/test.*** # 包含任意文件
也是同样原理
现有的工具是直接搜索相关方法并进行网上payload验证
简单修复不妨修改方法名字(bushi)就检测不出来了
正常修复的话
(本人已尝试)可以对执行参数进行过滤,减少可控参数内容,黑白名单之类的
(本人未尝试)还可以过程从中打断,不让他实例化,从另处进行跳转