关于网页引擎
什么是引擎:
网页模板引擎是一种软件库,它的核心作用是将 业务逻辑(数据) 与 表现逻辑(HTML/视图) 分离。它允许开发者编写一个包含特殊标记(占位符、循环、条件判断等)的模板文件,然后用程序提供的数据去“渲染”这个模板,最终生成一个完整的 HTML 页面。引擎的语言:

不同引擎的区别
攻击路径不同:# Jinja2 (Python): '' (任意对象) -> class (获取类) -> mro (追溯基类) -> subclasses() (寻找所有子类) -> 危险模块/函数 (如 os) # Twig (PHP): _self (模板实例) -> env (获取环境对象) -> registerUndefinedFilterCallback (注册回调函数) -> 'exec'/'system' (指定PHP危险函数为回调)
上下文不同:# Jinja2 (Python): { "request": "Flask的请求对象,包含大量信息", "config": "应用的配置对象", "g": "应用上下文的全局变量", "...": "其他由框架注入的对象" } # Twig (PHP): { "_self": "指向当前模板实例,万能, "app": "在Symfony等框架中,可能存在的应用对象", "...": "其他全局变量" }
可用的语法不同:...如何区分

flask
使用jinja2为引擎
当使用 render_template_string 时存在 ssti 漏洞
魔术方法:
1. __class__ 返回类型所属的对象
2. __mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
3. __base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的
4. __subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
5. __init__ 类的初始化方法(构造函数)
6. __globals__ 对包含函数全局变量的字典的引用
ssti(服务器模板注入)
1. 如何辨别 ssti
当网页存在回显,并且没有被解析为 html 元素时,考虑 ssti 注入。(如果被解析为html 元素,如输入 <h1>test</h1> 返回了大号 test,这时候就是考略 XSS 注入了,即Javascript 任意执行)
2. 漏洞原因
程序将字符串渲染成模板时,会执行{{ }}(大多数情况下的通用占位符)里的语句。
3. 限制
本质上是一个沙箱,仅能执行和输出表达式无法执行语句(如 import),但是可以通过访问基类的其它子类获取所需函数。

工具
自动化工具tplmap,拿shell、执行命令、bind_shell、反弹shell、上传下载文件,Tplmap为SSTI的利用提供了很大的便利
Flag
flag可能藏在哪:
根目录或者当前目录下的 flag 文件,(也可能叫Fl4g之类的)
配置文件config中
环境变量 env 中
Jail
一、定义与核心概念
Jail(监狱)在 CTF 比赛中,特指一类安全挑战。其核心是为挑战者提供一个被严格限制的程序执行环境(沙箱),并要求挑战者突破这些限制(“越狱”),以执行非预期的代码或命令,最终获取服务器权限或读取敏感文件(如 flag)。
二、主要的限制手段
黑名单过滤:
- 禁用特定的危险关键字、函数名或命令,例如
import,os,system,exec,eval,open,cat,flag等。
- 禁用特定的危险关键字、函数名或命令,例如
字符集限制:
- 只允许输入特定范围的字符,如仅限字母和数字,从而过滤掉
.、_、"、'、[、]等特殊符号。
- 只允许输入特定范围的字符,如仅限字母和数字,从而过滤掉
长度限制:
- 限制单次输入的代码或命令的长度。
环境配置限制:
- PHP: 使用
php.ini中的disable_functions指令禁用大量可执行系统命令的函数。 - Linux Shell: 使用
rbash(Restricted Bash) 或自定义 Shell 脚本,限制用户可执行的命令集,并禁止目录切换 (cd)、环境变量修改等操作。
- PHP: 使用
三、常见 Jail 类型及通用绕过思路
Python Jail
最常见
核心绕过思路:利用对象的继承链。
在 Python 中,万物皆对象。即使在
import和os等模块被禁用的情况下,依然可以从任意一个基础对象(如'',(),[],0)出发,通过其__class__属性向上追溯到基类object。关键技巧是调用
object类的__subclasses__()方法,该方法会返回当前 Python 解释器加载过的所有类的列表。在这个庞大的类列表中,可以寻找到能够执行系统命令的类(如
os._wrap_close,subprocess.Popen等),并利用它们来执行命令。典型利用链:
().__class__.__mro__[1].__subclasses__()
辅助技巧:
- 使用
getattr()函数替代点(.)操作符来访问属性,以绕过对点号的过滤。 - 使用字符串拼接(
'o'+'s')、编码转换(chr(),hex())等方式绕过对特定关键字的过滤。
- 使用