tp5 代码执行代码审计

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)就检测不出来了

在这里插入图片描述

正常修复的话
(本人已尝试)可以对执行参数进行过滤,减少可控参数内容,黑白名单之类的

(本人未尝试)还可以过程从中打断,不让他实例化,从另处进行跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值