目录
1.Simple_SSTI_1
2.Simple_SSTI_2
3.滑稽
4.计算器
5.矛盾
————————————————————分割线————————————————————
1.Simple_SSTI_1
SSTI是服务器端模板注入
F12查看下源码
在 Flask 中,双大括号 {{ }} 用于表示动态内容的占位符,该内容将由模板引擎渲染。这被称为模板语法。 当你在 Flask 模板中使用双大括号把变量或表达式括起来时,它告诉模板引擎去计算该表达式并将其值插入到渲染后的 HTML 文档中。 例如,你提供的代码 flag={{config.SECRET_KEY}} 将会在 HTML 文档中的该位置渲染 Flask 应用程序的秘密密钥。
在Flask项目的配置中都是通过app.config对象来进行配置的。比如要配置一个项目的SECRET_KEY,可以使用app.config['SECRET_KEY'] = "xxx"来进行设置。
所以综上所诉 我们直接尝试去在url试着访问 config
注意语法格式 ?flag={{config}}
也可用查询语法?flag={{config.SECRET_KEY}}
2.Simple_SSTI_2
打开题目让传入一个flag参数 我们试着看看config文件里
但是好像没有有用的东西 我们试着用模板注入看看怎么个事
?flag={{ config.__class__.__init__.__globals__['os'].popen('ls ../').read() }}
使用了模板引擎的功能来访问Python的config
对象,通过链式属性访问(__class__
, __init__
, __globals__
)来获取对Python标准库的os
模块的访问权。一旦获得对os
模块的访问,攻击者就可以通过popen
方法执行任意的系统命令。
_class_:用来查看变量所属的类,根据前面的变量形式可以得到其所属的类。
__init__ :初始化类,返回的类型是function。
__globals__[]:使用方式是函数名.__globals__获取function所处空间下可使用的module、方法以及所有变量。
os.popen()方法:用于从一个命令打开一个管道。
open() 方法:用于打开一个文件,并返回文件对象。
结果发现app 这个文件 好像不是常见的内部文件名字 我们试着去访问看看 发现了flag文件
cat一下获取flag
3.Flask_FileUpload
Flask是一个轻量级的Python Web框架,主要用于构建和维护Web应用程序。它提供了一组工具和功能,使开发者能够快速轻松地创建动态Web应用程序
一个提交框 查看下网页源码 提示 说是要上传个文件 并且固定了上传文件类型 需要时jpg和png的图片
于是写一段python的脚本文件 并且将后缀名改成jpg
import os
: 这一行导入了Python的内置模块os
。os
模块提供了许多与操作系统交互的功能,比如读写文件、更改和识别路径等。
os.system('ls / ')
: 这一行使用os
模块中的system
函数来执行一个外部命令。这里执行的是ls /
命令。在Unix和类Unix系统中,ls
是一个用于列出目录内容的命令,而/
代表系统的根目录。因此,ls /
会列出根目录下的所有文件和子目录。
上传成功后 页面没有什么特别的回显 我们看一下源代码 发现了我们要找的flag
首先对于这个有flask构建的web文件上传程序,其中包含了一个文件上传的端点 /uploader。当客户端通过 POST 请求发送文件到 /uploader 时,服务器会检查是否有文件被上传,然后将文件保存到指定的上传文件夹中。在文件保存后,os.system(' ls /') 这行代码被执行,它会在服务器上执行 ls / 命令,列出根目录下的所有文件和文件夹。
所以我只需要利用这个漏洞再去修改下我们的python代码重新上传一下我们的文件即可
import osos.system('cat /flag ')
4.滑稽
进入环境 右键查看源代码
5.计算器
让输入验证 但发现只能数一个字 打开源代码发现有输入长度限制是1
将源代码中限制从1改一下 再次输入 正确验证即可获得flag