pyc

  • 什么是pyc文件?
    pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code字节码,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由Python的虚拟机来执行的,这个是类似于Java或者.NET的虚拟机的概念,从而实现跨平台。
  • pyc反编译
    Python的编译指的是将py文件编译为pyc文件,反编译则为该操作的逆向动作。
    Python反编译网站

SSTI模板注入

SSTI 指服务器端模板注入(Server-Side Template Injection)

原理

在一些MVC框架中,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。

分类

Python的Flask,php的ThinkPHP,java的Spring等。

验证

构造参数提交后如果代码执行则存在。
如: https://www.example.com/{{1+1}}
如果1+1进行运算了则说明存在模板注入。

利用

Python常见的模板:Jinja2。由于在 Jinja2 中是可以直接访问python的一些对象及其方法的,所以可以通过构造继承链来执行一些操作,比如文件读取,命令执行等。

1
2
3
4
5
6
7
8
9
10
11
12
__dict__:保存类实例或对象实例的属性变量键值对字典。
__class__:返回一个实例所属的类。
__mro__:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__bases__:以元组形式返回一个类直接所继承的类(可以理解为直接父类)。
__base__:和上面的bases大概相同,都是返回当前类所继承的类,即基类,区别是base返回单个,bases返回是元组。
# __base__和__mro__都是用来寻找基类的
__subclasses__:以列表返回类的子类。
__init__:类的初始化方法。
__globals__:对包含函数全局变量的字典的引用。
__builtin__&&__builtins__:python中可以直接运行一些函数,例如int(),list()等等,这些函数可以在__builtin__可以查到,查看的方法是dir(__builtins__),在py3中__builtin__被换成了builtin。
1.在主模块main中,__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__。
2.非主模块main中,__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身。

SSTI模板注入姿势可以参考这篇博客:https://blog.csdn.net/2302_78903258/article/details/140600456