Mac中Twig模版安装与SSTI漏洞学习
感谢大佬的文章参考学习。
SSTI:https://www.cnblogs.com/bmjoker/p/13508538.html
Homebrew:快速开始 - Homebrew 中文网
Homebrew安装
一键快捷安装:默认使用中科大的源
/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"
如果命令执行中卡在下面信息:
==> Tapping homebrew/core Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
请Control + C中断脚本执行如下命令:
cd "$(brew --repo)/Library/Taps/" mkdir homebrew && cd homebrew git clone https://mirrors.ustc.edu.cn/homebrew-core.git
成功执行之后重新执行安装命令。
Homebrew 4.0 版本后默认JSON API获取仓库信息,因此在大部分情况下都不再需要处理下面的cask。
安装cask 同样也有安装失败或者卡住的问题,解决方法也是一样:
cd "$(brew --repo)/Library/Taps/" cd homebrew git clone https://mirrors.ustc.edu.cn/homebrew-cask.git
成功执行之后重新执行安装命令。
/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"
brew --version 验证是否成功安装
brew update 更新 # 这一步一定要做,不然安装可能会很慢
如果遇到 command not found brew,请执行下面脚本完成安装或者直接重新打开终端:
eval "$(/opt/homebrew/bin/brew shellenv)"
Homebrew安装转载来自快速开始 - Homebrew 中文网
安装Twig模版
(1)添加php仓库
brew tap shivammathur/php
(2)安装php
brew install php
(3)检验php是否成功安装
php -v

(4)安装composer
composer 是php的依赖管理工具,Twig需要composer来安装
brew install composer
检验composer是否成功安装
composer --version

(5)切换phpstrom的php环境为8.3
上面有写我们的路径按照自己执行出来的路径在phpstrom页面输入command+,进入设置

切换自己的解释器即可
(6)初始化 composer项目
composer init
按照提示一步一步进行初始化
几个难懂的初始化选项:
# 一开始会让选择工作项目目录这里自己创建一个把绝对路径写上去即可
Minimum Stability []: 定义在安装依赖时所接受的最小稳定性级别,建议选择stable
Package Type (e.g. library, project, metapackage, composer-plugin) []: 选project即可
Lisense:CC BY 4.0
Would you like to define your dependencies (require) interactively [yes]?yes
Search for a package: twig
Enter package # to add, or the complete package name if it is not listed: twig/twig:1.42.5
Enter the version constraint to require (or leave blank to use the latest version): 回车即可
再次出现Search for a package: 直接回车即可
composer install直接一路按照提示不用再额外装东西了全部拒绝即可
Add PSR-4 autoload mapping? Maps namespace "Da\Twig" to the entered relative path. [src/, n to skip]: n
安装完成之后
composer dump-autoload 重新加载配置文件
我们选用1.42.5版本的twig即可
以后我们创建工作目录可以直接
# 进入项目目录
cd /Users/dw/PhpstormProjects/Twig# 删除现有的 Twig
composer remove twig/twig# 安装指定版本的 Twig
composer require twig/twig:1.42.5
类似于这样就可以
测试Twig模版
我们创建一个测试模版的文件,注意由于1.42.5已经有很多函数都已经弃用了,我们需要屏蔽弃用警告就可以了。
<?php
error_reporting(E_ALL & ~E_DEPRECATED);
require_once dirname(__FILE__) . '/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {{name}}", array("name" => isset($_GET["name"]) ? $_GET["name"] : 'World')); // 将用户输入作为模版变量的值echo $output;
?>

可以看到这样的模版是没有注入的 模版引擎一般都默认对渲染的变量值进行编码和转义,所以并不会造成跨站脚本攻击(xss)
<?php
error_reporting(E_ALL & ~E_DEPRECATED);
require_once dirname(__FILE__) . '/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
$twig = new Twig_Environment(new Twig_Loader_String());
$output=$twig->render("Hello {$_GET['name']}");// 将用户输入作为模版内容的一部分
echo $output;?>
但是如果我们直接将用户传入的数值作为模版的数值就会产生XSS漏洞造成SSTI攻击

由此可知如果在我们开发的时候出现没有将某个传参作为变量输入而是直接传入模版时很有可能产生SSTI漏洞。
试一下XSS呢? 
可以看到成功弹出。
如果服务端将用户的输入作为了模板的一部分,那么在页面渲染时也必定会将用户输入的内容进行模版编译和解析最后输出。
由此可见SSTI产生的原因可能就是因为服务端将用户输入作为了模版的一部分,导致用户输入和模版一起编译解析输出了。
在大多数模版中都符合
1. {{ }}• 用途:用于输出变量的值。• 示例:{{ user.name }} 会渲染出 user 对象的 name 属性值。2. {% %}• 用途:用于执行逻辑操作,如循环、条件判断、宏等。• 示例:{% if user.is_admin %} Admin {% endif %} 用于根据 user 对象的 is_admin 属性来判断是否输出 “Admin”。3. {# #}• 用途:用于注释,注释内容不会被渲染到输出中。• 示例:{# This is a comment #} 在模板渲染时不会显示。4. {{% %}} 和 {%{{ }}}• 用途:某些模板引擎可能会使用变体来混合变量输出和逻辑控制,不过这些用法较少见,并且可能取决于特定的模板引擎和其实现。• 示例:这通常不是标准语法,但在某些自定义模板引擎中,可能会看到这些变体。
5. 其他常见标记• Jinja2(Python):• {{ variable }}:输出变量。• {% for item in items %} ... {% endfor %}:循环。• {% if condition %} ... {% endif %}:条件判断。• Mustache:• {{ variable }}:输出变量。• {{#section}} ... {{/section}}:循环或条件。• Handlebars:• {{ variable }}:输出变量。• {{#if condition}} ... {{/if}}:条件判断。• {{#each items}} ... {{/each}}:循环。
于此Twig模版搭建完成并顺便简单说明了Twig模版中SSTI漏洞产生的原因:服务端将用户的输入作为了模板的一部分,并且在解析模版时将用户输入一并解析。
相关文章:
Mac中Twig模版安装与SSTI漏洞学习
感谢大佬的文章参考学习。 SSTI:https://www.cnblogs.com/bmjoker/p/13508538.html Homebrew:快速开始 - Homebrew 中文网 Homebrew安装 一键快捷安装:默认使用中科大的源 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homeb…...
【20.5 python中的FastAPI】
python中的FastAPI FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,基于 Python 3.6 的类型提示。它利用了 Python 3.7 的新特性,如类型提示(Type Hints),来自动生成 A…...
研1日记13
正态分布: toTenor:转数字变为0-1 加载模型: model youmodel() model.load("路径") 测试单个样本:...
Go语言错误处理详解
Go语言以其简洁、高效和并发能力著称。在实际开发中,错误处理是一个不可避免且至关重要的部分。本文将深入探讨Go语言中的错误处理机制,涵盖其原理、使用方法、最佳实践,并提供丰富的代码示例和中文注释。 一、错误处理的基本概念 在Go语言…...
C++基础知识7 list
list 1. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 2.1 模拟实现list 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 l…...
Android 车联网——汽车模块介绍(附1)
汽车模块指的是车辆中独立的电子控制单元(ECUs),如发动机控制单元(ECU)、车身控制模块(BCM)等,它们负责特定的功能或系统。 一、控制类模块 这些模块主要用于控制车辆的不同系统,确保车辆各部分的正常运行。 1、ECM ECM(Electronic Control Module,电子控制模块)…...
Windows下SDL2创建最简单的一个窗口
先看运行效果 再上代码: #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) {// 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) -1){printf("Error: %s\n", SDL_GetError());return -1;} // 创建一个窗口SDL_…...
C++ | Leetcode C++题解之第406题根据身高重建队列
题目: 题解: class Solution { public:vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) …...
【网络安全】-ssrf服务器请求伪造攻击-burp
SSRF攻击服务器请求伪造攻击 CSRF攻击跨站请求伪造攻击也称客户端请求伪造攻击 两种攻击最主要的区别是一个在服务器,一个在客户端。 文章目录 前言 什么是SSRF攻击? 1.分类: 针对服务器的 SSRF 攻击: 针对后端系统的SSRF攻击: …...
C语言 | Leetcode C语言题解之第405题数字转换为十六进制数
题目: 题解: char * toHex(int num){int i0;char *nums(char*)malloc(sizeof(char)*32);unsigned int newnum(unsigned int)num;if(num0){nums[0]0;nums[1]\0;return nums;}while(newnum>1){int flagnewnum%16;newnum/16;if(flag<9){nums[i]flag0…...
Python快速入门 —— 第一节:基础类型
Python 快速教程说明 适用人群 有其他语言编程基础,或了解过python的群体,至少需要知道变量、对象、函数等基本概念想快速通过python实现一些功能,却不想了解python的底层实现的人群想快速了解python语言框架的人群有兴趣了解python的任何人…...
评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
目录 一、 熵权法赋权代码说明1.1 介绍 二、 手把手教你运行代码2.1 数据示例2.2 可直接运行代码2.3 shangquanfa_eg_Sheet1.csv数据可视化2.4 代码运行过程截屏2.5 代码运行结果截屏2.6 对熵权法的结果分析 三、 提供的代码如何修改?四、 为什么确定极小化指标&…...
Redis——通用命令
目录 Redis通用命令Redis中最核心的两个命令getset Redis全局命令keys语法注意事项 existsdel(delete)expirettlredis的key的过期策略是怎么实现的?了解拓展 type总结 Redis通用命令 Redis的命令非常非常多,所以 1. 掌握常用命令(多操作练习…...
(k8s)kubernetes 挂载 minio csi 的方式(pod挂载pvc存在csi驱动问题,挂载不上)
一、安装Minio(Minio分布式集群搭建部署_minio集群最少几台-CSDN博客) 生成accessKeyID和secretAccessKey: 二、安装csi-s3插件(在k8s集群上) 首先我们把插件的yaml文件都下载下来,为了保证版本测试的一致性,我们下载…...
python tkinter
基本使用 基于tkinter创建 GUI基本四步:窗口->组件->布局->事件 1.创建窗口对象 from tkinter import *root Tk() # 创建窗口root.mainloop() # 进入事件循环 2.创建组件 按钮文本等组件 btn Button(root) # 创建Button组件,使组件在…...
Flink CEP(复杂事件处理)高级进阶
Flink CEP(Complex Event Processing,复杂事件处理)是 Apache Flink 中用于复杂事件模式检测的库。它允许用户定义复杂的事件模式,从流数据中检测出符合模式的事件序列。这在实时监控、欺诈检测、用户行为分析等场景中非常有用。 Flink CEP 高级进阶 为了深入理解和使用 …...
libmodbus:写一个modbusTCP服务
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
函数模板(初阶)
Hello,大家好,我们大家都知道,C这个编程语言是由C语言继承而来的,因为是继承,所以我们的C就要做出一些区分,要不然的话,就和C语言没有本质上的区别了,我们现在在社会中使用比较多的是…...
中间件之RocketMQ
RocketMQ是一个开源的分布式消息队列系统,起源于阿里巴巴集团内部。最初,RocketMQ(前身为Metaq)被设计为满足阿里巴巴集团内部大规模分布式系统下的高吞吐量、低延迟和高可靠性的消息传递需求。随着其在阿里巴巴内部的广泛应用和不…...
linux第二课(docker的安装使用)
目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql 编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
