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

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漏洞产生的原因:服务端将用户的输入作为了模板的一部分,并且在解析模版时将用户输入一并解析。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【python】30、矩阵加法 tensor.sum
  • 基于DeepCFD模型和CNN/U-Net模型的流场预测
  • 一个简约的uniapp登录界面,基于uniapp+vue3+uview-plus
  • W25QXX系列Flash存储器模块驱动代码
  • 【读论文】End-to-end reproducible AI pipelines in radiology using the cloud
  • Android RecyclerView 缓存机制深度解析与面试题
  • 使用python操作数据库
  • mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(18)
  • PE-PINCodes 规则
  • Apache Spark — Repartition 与 Coalesce(调整数据集分区)
  • 直播标准权威发布,阿里云RTS获首批卓越级评估认证
  • 神经网络通俗理解学习笔记(1)
  • Redisson分布式锁分析,可重入、可续锁(看门狗)
  • Oracle中VARCHAR和VARCHAR2的区别
  • ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯
  • 【知识碎片】第三方登录弹窗效果
  • Apache的80端口被占用以及访问时报错403
  • CSS魔法堂:Absolute Positioning就这个样
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JavaScript DOM 10 - 滚动
  • JavaScript HTML DOM
  • JAVA多线程机制解析-volatilesynchronized
  • js ES6 求数组的交集,并集,还有差集
  • js如何打印object对象
  • Mocha测试初探
  • Xmanager 远程桌面 CentOS 7
  • 搭建gitbook 和 访问权限认证
  • 记一次和乔布斯合作最难忘的经历
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #70结构体案例1(导师,学生,成绩)
  • (1)无线电失控保护(二)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (20)docke容器
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (23)Linux的软硬连接
  • (3)llvm ir转换过程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (动态规划)5. 最长回文子串 java解决
  • (二)pulsar安装在独立的docker中,python测试
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *Django中的Ajax 纯js的书写样式1
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .env.development、.env.production、.env.staging
  • .gitignore文件---让git自动忽略指定文件
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 使用ajax控件后如何调用前端脚本
  • .NET项目中存在多个web.config文件时的加载顺序
  • /3GB和/USERVA开关
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)