SSTI Flask 前置知识
| 2023-4-17
0  |  Read Time 0 min

__mro__和__class__

在Python中,每个对象都有一个__class__属性,它指向该对象所属的类。同时,每个类都有一个__mro__属性,它表示该类的方法解析顺序(MRO,Method Resolution Order),即Python在查找方法时的搜索顺序。Python中的继承是通过MRO实现的,也就是说,当查找某个方法时,Python会按照MRO的顺序依次查找,直到找到对应的方法为止。
在SSTI漏洞攻击中,攻击者可以利用__class____mro__属性来访问对象的类信息和继承信息,从而获取到应用程序的配置信息、执行操作系统命令等。
具体来说,攻击者可以通过访问__class__属性,获取当前对象所属的类的信息。例如,使用{{ ''.__class__ }}可以输出<class 'str'>,表示空字符串的类是str类型。
另外,通过访问__class__.__mro__属性,获取当前类的方法解析顺序。例如,使用{{ ''.__class__.__mro__ }}可以输出(<class 'str'>, <class 'object'>),表示str类的MRO为strobject
 
{{''.__class__}}表示输出空字符串的类,即str类型。在Python中,每个对象都有一个__class__属性,它指向该对象所属的类。因此,在Jinja2模板中,使用{{''.__class__}}可以输出空字符串的类,即str类型。例如说,这里就会返回<class 'str'>
/{{''.__class__.__mro__}}表示输出空字符串类的方法解析顺序,即MRO(Method Resolution Order)。在Python中,类的MRO表示方法的搜索顺序,即Python在查找某个方法时的搜索顺序。在Jinja2模板中,使用/{{''.__class__.__mro__}}可以输出空字符串类的MRO,即(<class 'str'>, <class 'object'>),表示str类型的方法解析顺序为strobject。例如说,这里就会返回 (<class 'str'>, <class 'object'>)

__subclasses__

为什么要用mro呢?目的是为了从object出发,我们就可以通过object访问其他的类。因为str也是object的子类,所以我们要从str找到父类object,再从object找到其他子类,通过使用{{ ‘’.__class__.__mro__[1].__subclasses__() }} (’’.__class__.__mro__[1]就是object)
光拿__subclasses__还不够,还要执行,这里可以得到类似这样的内容
notion image
  • GitTalk
Catalog