thinkphp 一个文件怎么调用另一个文件中的define()_thinkphp6 session 任意文件创建漏洞复现 含POC...

0x1:漏洞复现

首先通过composer创建thinkphp6的框架目录

composer create-project topthink/think think6

创建好了以后,默认是thinkphp6最新版本的,漏洞是已经修复了的,所以我们需要对程序进行降级

编辑程序根目录下的composer.json文件,改成如红框所示

767ec60d57dd1488e2181ee879b157d2.png

然后执行

compose update

如图所示,即是降级成功

f427cf5a52937b7120aecbf3d9bf8623.png

然后是非常重要的一步,很多复现的文章都没有写,就因为这个浪费了我一两个小时的时间.

thinkphp6默认是没有开启session功能的,我们需要在app\middleware.php文件中,取消session中间件的注释,设置为如图

e5c30ab5160b675b63f6cbf7dece77bb.png

终端运行 php think run 启动调试环境

cdd5bd4af7184db80b1b894a8a72e0d9.png

app\controller\Index.php中添加测试代码

c6de52f60afdc32ff00f8e47290ce18c.png

在浏览器f12 console里面执行poc,然后刷新页面

3c985299834978a7ee84161e198a9547.png

document.cookie="PHPSESSID=aaaaaaaaaaaaaaaaaaaaaaaaaaaa.php";

\runtime\session文件夹下就会生成php文件

72b44b8f056ffcb8ceff7e6d66c9c68f.png

如果要利用这个漏洞getshell的话,还要解决两个问题

  1. 文件内容可控,而生成的文件里面的内容,就是将session内容的反序列化

    cef08be35e555e0175d06d7c332fe44b.png

    如果后端代码里面有类似,这种代码的话就是可以利用的

Session::set('name', $_POST['a']);

2.thinkphp的网站一般会把 /public 设置为网站的根目录,而生成的文件是在/runtime/session 文件夹下面的,默认是访问不到的

但是这个通过,即可绕过

PHPSESSID=/../../../public/aaaaaaaaaaa.php

Python漏洞检测POC

https://github.com/lanyi1998/pochub/blob/master/thinkphp6_file_write.py

e73b6d186bc9fef3201d8ee134e777a9.png

0x2:漏洞分析

根据tp官方的提交记录来看,是对setId函数做了修改,那么漏洞一定和这个函数有关,全局搜索一下这个函数

4f81d9d7b7538c5105074cc699f506e6.png

https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2

找到在 vendor/topthink/framework/src/think/middleware/SessionInit.php中

eef97eb72051feb891ff03edfc5863a6.png

第一步:

bdd1739611764f43da2b9774b9850ee3.png

从cookie中取出phpsessid的值,赋值给sessionId

第二步:

71aa5bc3e169c9ad25678b4bfda25e46.png

通过setid函数把session类id设置为,刚才从cookie中取到的值

第三步:

执行session类中的init方法,本来以为写入操作是在这个函数里面进行的,但是debug以后发现不是的

看thinkphp文档

7fc44f7882e2566c422ed257f29c6137.png

tp6会在请求结束的时候进行session写入

vendor\topthink\framework\src\think\Http.php

09ffd34f43000b2faabddd431818b0ee.png

会调用vendor\topthink\framework\src\think\middleware\SessionInit.php下的end方法

bc7824c30b4072de916ef1616d6a405d.png

接下来调用vendor\topthink\framework\src\think\session\Store.php中的save方法

2325204223b9a50650789b5e2aa7fe43.png

跟进到红框所示的write方法,会执行vendor\topthink\framework\src\think\session\driver\File.php中

18e7806cf034b96c1814444220daa06a.png

通过getFileName函数,完成session文件名的拼接,然后再调用writeFile函数

27b1b3bba2df23c78d94d625c483875e.png

session文件写入流程完成!

0x3:漏洞修复

65a24c38faeddfdeb3ff2291d462e367.png

查看补丁是对id增加了一个ctype_alnum函数,查一下文档

2afe770e0b35d8cfeafa7c93da2632c5.png

如果传进来的id里面含有如 . 这样的,就会使用来随机生成一段id,而不会实用传进来的ID

md5(microtime(true) . session_create_id()

f883bb927b1a5fee504f1c59876608a6.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值