__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为str
和object
。{{''.__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
类型的方法解析顺序为str
和object
。例如说,这里就会返回 (<class 'str'>, <class 'object'>)__subclasses__
为什么要用mro呢?目的是为了从object出发,我们就可以通过object访问其他的类。因为str也是object的子类,所以我们要从str找到父类object,再从object找到其他子类,通过使用{{ ‘’.__class__.__mro__[1].__subclasses__() }}
(’’.__class__.__mro__[1]就是object)
光拿__subclasses__还不够,还要执行,这里可以得到类似这样的内容