感谢大佬的文章参考学习。
SSTI:https://www.cnblogs.com/bmjoker/p/13508538.html
Homebrew:快速开始 - Homebrew 中文网
Homebrew安装
一键快捷安装:默认使用中科大的源
如果命令执行中卡在下面信息:
==> 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
成功执行之后重新执行安装命令。
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
按照提示一步一步进行初始化
几个难懂的初始化选项:
安装完成之后
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漏洞产生的原因:服务端将用户的输入作为了模板的一部分,并且在解析模版时将用户输入一并解析。