0x1 前言
SSTI(服务端模版注入),或者对其还不够了解,在此之前建议去阅读一下James Kettle写的一篇 文章 问题出在开发者定义一个404错误页面,该开发者选择使用字符串格式化将URL动态添加到模版字符串中并返回到页面中,用户对模板是可控的。
0x2 测试步骤
定义一个错误页面。
定义了一个模板字符串。
使用格式化字符串的方式将URL动态添加到模版字符串中并返回在页面上。
用户对模板是可控的。
触发一个XSShttp://127.0.0.1:5000/
Jinjan2 基础语法{% ... %}
{{ ... }}
{# ... #}
模版引擎成功解析http://127.0.0.1:5000/aaa{{2+2}}
鸡肋拒绝服务攻击request 是Flask模版的一个全局对象,其代表 “当前请求对象(flask.request)”,在request 对象中有一个environ对象名。
request.environ 对象是一个与服务器环境相关的对象字典,字典中一个名为 shutdown_server 的方法名分配的键为 werkzeug.server.shutdown 。
注射 {{ request.environ['werkzeug.server.shutdown']() }} 会造成拒绝服务。
获取配置项目信息config 也是 Flask模版中的一个全局对象,它包含了所有应用程序的配置值。
{{ config.items() }} // 查看配置项目的信息
输入:http://127.0.0.1:5000/a{{ config.items() }}
config是一个类字典对象,它的子类包含很多方法:from_envvar, from_object, from_pyfile, root_path。Flask/config.py
def from_object(self, obj):
1. from_object 遍历新加模块中的所有大写的变量的属性并添加属性
2. 并且这些添加到config对象的属性都会维持他们本来的类型
3. 验证:我们将 {{ config.items() }} 注入到存在SSTI漏洞的应用中,注意当前配置条目
4. 注入 {{ config.from_object('os') }}。这会向config对象添加os库中所有大写变量的属性
5. 再次查看 {{ config.items() }} ; os 模块中大写变量的属性成功添加属性cf