[ POP链 ] thinkphp_5.0.x

thinkphp_5.0.24 rce漏洞思路学习

起点:

thinkphp/library/think/process/pipes/Windows.php

removeFiles方法
在这里插入图片描述

跳板:

file_exists方法能够触发__toString魔术方法

$filename

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulWxQWmI-1632723261067)(https://secure.wostatic.cn/static/f8ouHu3DA4hkKDE4eWABo2/image.png)]

跳板利用点:

thinkphp/library/think/Model.php

Model抽象类的 __toString

在这里插入图片描述
跟进toJson方法至toArray方法

如下图Model抽象类的toArray方法,存在三个地方可以执行__call

但是我们目的是调用Output类的__call且能够继续利用,调试后选择第三处当做调板

$item[$key] = $value ? $value->getAttr($attr) : null;

在这里插入图片描述观察第三处
$item[$key] = $value ? $value->getAttr($attr) : null;

在这里插入图片描述
溯源$values变量,比较关键是下面两行

$modelRelation = $this->$relation();
$value         = $this->getRelationData($modelRelation);

$modelRelation值可以利用Model类中的getError方法

在这里插入图片描述
跟进getRelationData方法,这里最后传入的$modelRelation需要Relation类型

最后返回值$values需要经过if语句判断

$this->parent && !$modelRelation->isSelfRelation() && get_class($modelRelation->getModel()) == get_class($this->parent)

在这里插入图片描述全局搜索下,可以利用HasOne类
最后$attr值,由$bindAttr = $modelRelation->getBindAttr();执行后的结果.

在这里插入图片描述
在这里插入图片描述至此代码执行到$item[$key] = $value ? $value->getAttr($attr) : null;就能够执行Output类__call魔术方法

在这里插入图片描述
跟进Output类block方法
在这里插入图片描述
继续跟进writelin方法,最后会调用write方法
在这里插入图片描述
这里$this->handle可控,全局搜索write方法,进一步利用

定位到:thinkphp/library/think/session/driver/Memcached.php

类: Memcached

在这里插入图片描述
继续搜索可用set方法

定位到:thinkphp/library/think/cache/driver/File.php
类:File

最后可以直接执行file_put_contents方法写入shell

在这里插入图片描述
$filename可控且可以利用伪协议绕过exit
在这里插入图片描述

$data值比较棘手,这里有个坑,由于最后调用set方法中的参数来自先前调用的write方法

只能为true,且这里$expire只能为数值,这样文件内容就无法写shell

在这里插入图片描述继续执行,跟进下方的setTagItem方法

在这里插入图片描述
会再执行一次set方法,且这里文件内容$value通过$name赋值(文件名)

所以可以在文件名上做手脚

示例:php://filter/write=string.rot13/resource=./<?cuc cucvasb();?>

在这里插入图片描述
POP链:
在这里插入图片描述

来源: https://www.anquanke.com/post/id/196364

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值