Flask SSTI利用方式的探索
Flask SSTI利用方式的探索
一、SSTI简介&环境搭建
一个统一风格的站点,其大多数页面样式都是一致的,只是每个页面显示的内容各不相同。要是所有的逻辑都放在前端进行,无疑会影响响应效果和效率,很不现实。把所有的逻辑放在后端,又会导致太过复杂,前轻后重。
模板的诞生是为了将显示与数据分离,让前端工作人员专注表现设计,后台人员注重业务逻辑,同时简化代码的复杂程度。模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的HTML代码。
Flask使用Jinja 2作为模板引擎。Jinja的语法很简单,大致有这么几种:
{%....%}语句(Statements)
{f .…H}打印模板输出的表达式(Expressions)
{#....#}注释
#...##行语句(Line Statements)
什么是SSTI,SSTI会导致什么问题?
SSTI,又称服务端模板注入攻击。jinja2模板中使用{{ }}语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换。但是在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题
测试环境搭建:Ubuntu + Docker
题目:https://github.com/Tiaonmmn/pasecactf_2019_web_honey_shop
微调,增加了SSTI~
二、敏感信息泄露导致身份伪造
Flask session机制:
通过.隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将session data,时间戳,和flask的secret key通过sha1运算的结果。
SSTI方式
f12 → Application → Cookies
这里我们只需要找到secret key就可以对其签名,得到一个有效的valid Signature,对其中内容进行替换
查看robots.txt,看看能不能得到有效信息
我们再去访问一下hello,得到Hello guest
这里我们尝试用name对字段进行替换,说明用户可以通过name字段传信息到后台,后台再将信息渲染到页面来
我们再进行测试,发现这里没有对用户输入进行过滤,而是直接执行
我们通过config可以查看到一些重要的信息,这里我们就拿到了secret key
我们在Linux的终端中利用flask-unsign工具,可以进行session的伪造(以修改金钱为例)
flask-unsign --sign --cookie "{'balance':666666}" --secret "获取的secret key"
回到我们获取session的位置,将运行结果替换原来的值,再刷新一下,发现我们的金额成功被修改为我们设定的值
原题解题方式:
原题中图签可以下载,我们获取URL,发现URL通过download?image指明一个参数进行下载,这里我们可以审查一下有没有目录穿越问题
发现passwd可以被下载,说明网站确实存在目录穿越问题
我们再去下载环境变量,获取到文件里的secret key
三、Flask PIN码利用
Flask PIN码机制:
Flask应用在Debug模式下提供的一种页面端的交互调试工具,和我们平时使用的Python命令行是一样的,也就是给我们提供了一个交互式的web端shell。但是PIN码的生成规则是有规律可循的,使得获取PIN码成为可能,之后能够利用的方式有很多。(只有在Debug开启的情况下)
这里我们在原来输入config的位置乱写,然后页面报错
我们如何获得Flask PIN呢?
import hashlib
from itertools import chain
probably_public_bits = [
'flaskweb'# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.7/site-packages/flask/app.py' # getattr(mod, '__file__', None),
]
private_bits = [
'2485377957894',# str(uuid.getnode()), /sys/class/net/ens33/address
'3c7c60af8484830ab0b1e9615fada4e74d93a8a111baa4afcd949feeab56c320'# get_machine_id(), /etc/machine-id
]
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
rv =None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
print(rv)
————————————————
版权声明:本文为CSDN博主「火 柴 人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43536759/article/details/105194333
我们可以通过获取Flask上的六个值来计算出Flask的PIN
1.username:运行当前Flask的用户名(可通过之前下载的passwd文件获取)
2.modename:一般默认值为flask.app
3.getatrr函数的值:一般默认值为Flask
4.Flask的路径(报错信息可以直接查看)
5.网络地址十进制
文件里为十六进制值,可通过命令转换为十进制
int ("十六进制值去掉冒号",16)
6.Flask运行机器的机器码
一般环境在etc/machine-id下,如果报错,可以去proc/self/cgroup尝试,这里docker里面就是我们要找的值
计算出PIN码后我们可以回到报错页面,点击报错信息右边的小窗口,输入PIN码后即可得到一个交互窗口,但在这里只能得到交互命令的返回值,看不到具体输出
但我们可以通过popen+read将返回的值显示出来
四、SSTI导致RCE
Python魔法函数+内置函数
所谓魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()(函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数和__del__函数,其实这也是魔法函数的一种。
在python中,输入可以查看python内建函数。help(dir(._builtins ))。简单理解就是Python中自带的函数,直接拿来用就好了。
这里我们需要定位到popen的位置,这里为302,然后就可以直接利用它,再去找到一些可以利用的子类,比如popen和os
发现这里可以达到直接执行系统命令的操作
Flask SSTI利用方式的探索的更多相关文章
- flask ssti python2和python3 注入总结和区别
总结一下flask ssti的注入语句 代码 import uuid from flask import Flask, request, make_response, session,render_t ...
- Flask SSTI | Python3 学习记录
Flask SSTI | Python3 引言 昨天原本是打算继续python的每日一练的,这次按日程一样是要练习用一个web框架写一个留言板的,于是打算用flask搞一下,但是正打算写的时候,突然想 ...
- Redis未授权漏洞利用方式
总结一下redis未授权拿shell: redis-cli -h ip >info 查看系统类型 Windows: 1.找网站绝对路径 2.config set dir 绝对路径根路径 conf ...
- order by注入点利用方式分析
漏洞分析 使用sqli-lab中的lesson-52作为测试目标.关键代码为: error_reporting(0); $id=$_GET['sort']; if(isset($id)) { //lo ...
- svn泄漏敏感信息利用方式
之前仅知道svn权限配置不当,会导致敏感信息泄漏,但是一直不知道具体利用方式. 今天测试svn dig时抓包分析才知道: http://www.xxx.com/路径/.svn/text-base/文件 ...
- 威胁快报|Solr dataimport成挖矿团伙新型利用方式
概述 近日,阿里云安全团队监测到挖矿团伙利用solr dataimport RCE(CVE-2019-0193)作为新的攻击方式对云上主机进行攻击,攻击成功后下载门罗币挖矿程序进行牟利.该团伙使用的恶 ...
- Druid未授权(弱口令)的一些利用方式
Druid简介 1.Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池. 2.Druid提供的监控功能,监控SQL的执行时间.监控Web URI的请求.Session监控. Druid可能 ...
- python SSTI利用
原理python的SSTI不仅可以向网页插入一些XSS代码,而且还可以获取一些变量和函数信息,尤其是secret_key,如果获取到则可以对flask框架的session可以进行伪造.对于tornad ...
- 【Flask】 利用uWSGI和Nginx发布Flask应用
因为Flask比较容易上手,之前也拿flask写过几个小项目,不过当时天真地以为只要在服务器上nohup跑一个python脚本就算是成功发布了这个flask项目.实际上这还面临很多问题,比如并发性不好 ...
随机推荐
- SpringCloud之Config
1.背景 在前的学习中,我们几乎解决了springCloud的所有常规应用,但是大家有没有想过这样一个问题: 是使用微服务后,有非常多的application.yml文件,每个模块都有一个,实际开发中 ...
- jquery validate 如何校验多个相同name
在表单页中有如下代码 <form> <input name="zhai"/><!-- 三个相同name的input --> <input ...
- ThreadLocal, volatile, synchronized, map, epoll, AQS简单总结
ThreadLocal ThreadLocal主要是为了解决内存泄漏的问题,它是一种弱引用: 引用总共有四种,,我简单列一下: 强引用(Strong Reference):正常引用,根据垃圾回收算法, ...
- Go与接口:接口即约定
接口 接口类型是对其他类型行为的概括与抽象.我们可以通过接口来约定某一类通用行为.Go语言的接口是隐式的:只要实现接口A的所有方法就代表实现了接口A. 接口即约定 接口是什么样的? package i ...
- 【MIT6.S081/6.828】手把手教你搭建开发环境
目录 1. 简介 2. 安装ubuntu20.04 3. 更换源 3.1 更换/etc/apt/sources.list文件里的源 3.2 备份源列表 3.3 打开sources.list文件修改 3 ...
- Mac 安装 Android commandlinetools 各种报错的问题
https://developer.android.com/studio/releases/platform-tools commandlinetools-mac 下载地址 解压后直接运行 sdkma ...
- 通过WebGoat学习java反序列化漏洞
首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...
- 使用Keepalived实现Nginx的双机主备高可用
1.概述 前面我们聊过使用 Nginx 为 后端Tomcat 做负载均衡.高可用,但是这时Nginx又成了单点,如果Nginx不幸挂掉,整个网站便无法访问. 此时我们就会用到另一个软件 -- Keep ...
- MySQL(四)——
MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构.因此索引的本质就是数据结构.索引的目的在于提高查询效率,可类比字典.书籍的目录等这种形式. 可简单理解为" ...
- sed命令的使用
1.sed格式.理解 (1)找谁 干什么 (2)想找谁,就把谁保护起来 2.sed基本操作 操作文件oldboy.txt I am lizhenya teacher! I teach linux. ...