XSS.haozi.me靶场通关记录

XSS.haozi.me靶场是一个部署在Github的在线靶场,并且是一个白盒,就是说我们能够直接看到页面源代码,所以直接根据源码来判断该使用什么方法绕过。

XSS绕过方法:

闭合标签绕过

<span style="background-color:#f8f8f8"><span style="color:#333333"> <textarea>、<title>等RCDATA标签内无法xss需要先使用</title>闭合
 value等元素属性闭合
 <!-- --!> <!-- -->注释闭合</span></span>

绕过小括号、双引号、单引号

利用反引号``

<script>alert`1`</script>

编码绕过(利用实体编码、unicode编码绕过)

<span style="background-color:#f8f8f8"><span style="color:#333333"> <img src=x onerror="alert&#x28;1&#x29;">    属性内可以识别html实体编码
 <svg><script>alert&#40;1&#41</script>   <svg>遵循XML 和 SVG 的定义</span></span>

混淆绕过(利用html语法不严格、容错性)

换行 缺失>闭合的标签 空格、TAB

关键字绕过

大小写绕过

编码绕过

<span style="background-color:#f8f8f8"><span style="color:#333333"> <img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>
 <svg><script>&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;</script></span></span>

字符拼接

<span style="background-color:#f8f8f8"><span style="color:#333333"> <img src="x" onerror="a=`aler`;b=`t`;c='(1);';eval(a+b+c)">
 <script>top["al"+"ert"](1);</script></span></span>

空格绕过

利用/代替空格

<span style="background-color:#f8f8f8"><span style="color:#333333"> <img/src="x"/onerror=alert(1);></span></span>

编码绕过(利用实体编码、unicode编码绕过)

<span style="background-color:#f8f8f8"><span style="color:#333333"> <img src=x onerror="alert&#x28;1&#x29;">    属性内可以识别html实体编码
 <svg><script>alert&#40;1&#41</script>   <svg>遵循XML 和 SVG 的定义</span></span>

利用eval等方法绕过

<span style="background-color:#f8f8f8"><span style="color:#333333"> <script>eval.call`${'alert\x281)'}`</script>
 <script>prompt.call`${1}`</script>
 img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')></span></span>

可控点在标签内部的绕过

<span style="background-color:#f8f8f8"><span style="color:#333333"> 当某个可控点在标签内部,那么可以利用事件绕过
   <img src=1 onerror=alert(1)>
   <a href=1 onclick=alert(1)>
 标签属性支持javascript:协议
   <iframe src=javascript:alert(1);>
   <a href=javascript:alert(1)></span></span>

接下来我们进入关卡,本靶场通关的条件就是能够使alert(1)成功弹出,成功的时候页面会出现两个人拍手的图案

0x00

服务器代码提示直接返回输入,因此输入payload : <script>alert(1)</script>

0x01

服务器代码有<textarea>标签,我们输入的数据都将被其包裹,百度搜索一下这个标签

可以不懂,但是我们大致肯定知道,我们需要闭合一下这个标签,因此我们

payload为:</textarea><script>alert(1)</script>

 

0x02

为了便于观察我们直接放0x00的payload在输入框里面,发现第二关将输入的数据放在input标签中的value值里面

 这里可以看到,value的值是框在双引号里面的,同时,末尾被加上了一个”>,这样我们所输入的值就被放进input里面了,所以说我们就要通过闭合掉input标签,使它单独出去,我们后面的标签也是独立的,就可以成功了,我先加了一个 > 发现没有什么变化,然后再看value,少了一个 " ,因此我们再在所加的 > 前加上一个 " ,发现成功了,这样就成功闭合了input标签,使我们的script标签独立出来了。

 

0x03

同样直接输入<script>alert(1)</script>,发现显示出的html代码我们的括号被过滤掉了,我们查看服务器代码,没错,就是通过正则表达式把我们的()给过滤掉,将其变成空的。从上面绕过方法我们可以知道,我们可以利用反引号代替括号,因此我们可以构造

payload1:<script>alert'1'</script>

然后,还有一种方式就是使用实体编码对括号进行编码,我们查询()的html编码

 可以看到()的html编码为&#40; &#41; 因此我们构造:

payload2:<script>alert &#40;1&#41;</script>

发现无法成功,网页直接将我们输入的实体编码打了出来,而不是转换成(),搜索得知

<script>标签是会立即执行的,意思就是他不会变成我们想要的()

 查询了好几个不同的攻略,发现都是使用img这一个标签来进行绕过的,可能是没有学过哦html语言的原因,我也不懂为什么要这样,但是我们记住用这个

payload2:<img src=1 οnerrοr="alert&#40;1&#41;">

 发现虽然显示的还是编码,但是我们的编码应该是被函数执行成了(),所以绕过成功。

0x04

本关对括号,引号都进行了过滤,因此我们直接使用第三关的第二种方式编码进行绕过即可

0x05

第五关我们随便复制一个payload放上去,发现我们的输入被注释掉了,我们尝试来闭合它。

 发现闭合失败,还多了个表情,查看服务器代码,原来是为了防止注释符被注释,当想注释掉其时,添加一个表情,不管我怎么添加,都不能将其闭合,于是我搜索了一下,发现还有另外一种闭合方式:<!-- --!>,而服务器只会防止你添加 -->,因此我们使用 --!>即可绕过

 0x06

随便放置payload,发现 ”>“ 被替换成了 ”_“ 查看页面源代码,这也是个正则表达式,这个有点看不懂,只知道会被替换成 "_",我们搜索这个正则表达式看看,发现

/auto|on.*=|>/ig

它匹配了: auto 、以on开头且以=结尾的字符串、 >

所以过滤了autofocus和onerror等事件, 以及防止input标签被闭合

但是它并没有匹配换行符, 可以通过换行来绕过匹配:
————————————————
版权声明:本文为CSDN博主「儒道易行」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48899364/article/details/128834417

因此我们构造的payload需符合input标签的内容,具体为:

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

 至于为什么是这样的格式,由于没有学过html语言,因此不太能够理解 记住如何使用就行了

0x07

输入我们最基础的payload,发现<script>标签被替换为了空,整个输入被放在了<article>标签里面,

正则表达式 /<\/?[^>]+>/gi 的含义如下:

1. /<\/?[^>]+>/: 匹配 < 和 > 之间的任意字符,其中 <\/? 匹配 < 或者 </,[^>]+ 匹配一个或多个非 > 的字符,> 匹配 > 字符本身。这个正则表达式匹配 HTML 标签的开始和结束标记。
2. /g: 表示全局匹配,即匹配到一个后继续匹配,直到没有匹配项。
3. /i: 表示忽略大小写匹配。
因此,这个正则表达式可以匹配所有的 HTML 标签,包括开始标记和结束标记,例如 <p>、</p>、<img>、</img> 等等。将这个正则表达式传递给 replace() 方法,就可以将匹配到的 HTML 标签替换为空字符串,从而去掉 HTML 标签。

————————————————
版权声明:本文为CSDN博主「Lawn_Cat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_67978351/article/details/129787841

因此我们可以理解为,这个正则就会把我们的标签给去掉,但是其匹配的是一个完整的标签,即<>,因此我们只需要舍弃掉后面的>,即可通过正则。

<img src=“szr” οnerrοr="alert(1)"

0x08

这关同样有个正则,但是明显跟上关的不是一个意思,好像是针对</style>闭合标签的,因此我们猜测这关的绕过方式是闭合<style>标签,我们尝试闭合它,发现:

 </style>被替换成了/* 坏人 */ ,因此,这个正则就是如我们开始所想的,针对</style>闭合标签的,但是它只针对了</style>标签,根据上面的对正则的理解,这里也只对大小写进行了匹配,因此我们可以通过换行和空格的方式进行绕过:

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

 

0x09

提示invalid url,就是无效的网址,我发现服务器端有个正则,匹配的就是一个网址,我们输入这个网址试试:

 网址被输出出来了,并且在一个<script>标签里面,我们来尝试闭合它

 (本来就是能成功的闭合方式,我输入之后没有反应,还测试了几种闭合方式,都没有反应,摆烂休息了一会儿它又成功了,我猜测是因为github的原因)

0x0A

这关代码很多,但是大致意思看得出,它将<>"&这些特殊符号替换为了对应的编码,因此我们无法通过这种方式进行闭合绕过,这下就不太懂了,搜索了一下:

所以本关不能想上一关一样闭合标签了,所以只能思考别的方法进行绕过。
本关可以使用url@重定向的方式进行绕过

在网址中间使用符号@
(例如https://www.google.com@stackoverflow.com)将重定向到
https://stackoverflow.com/网站(@字符后的域URL)。
其中以@分隔的话前面表示的是用户名和密码,后面表示的是登录的网站和端口,
也可以以表示重定向到第二个网站。
————————————————
版权声明:本文为CSDN博主「caker丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46467017/article/details/126040869

简单来说就是在网站根目录下创建一个js文件(用notepad++添加alert代码),然后通过url重定向去访问这个文件我们尝试构造:

http://www.segmentfault.com@127.0.0.1/xss-0x0A.js

 

0x0B

我们放入url,发现我们输入的url被大写了,同时,我们了解到:

  1. HTML:不区分大小写
  2. JS:区分大小写

因此我们知道,我们要做的就是防止url被大写,因此我们可以通过使用编码的方式进行绕过

但是url这么长,如果编码发现肯定不合适,我们尝试输入<script>alert(1)</script>,发现能够正常显示(被大写),因此我们只需要对alert(1)进行编码,即可

 0x0C

这关将script过滤且将输入大写了,因此我们使用上一关的payload即可:

0x0D

 这关又是正则,过滤掉了<、/、"、'几个符号,但是我们需要输入的数据又在其中,且被注释了,因此我们猜测需要绕过的就是注释:

我们随便输入一些东西:

发现一个回车,结构就被分裂了,我们再添加一个alert(1),发现后面还有我们不需要的东西,发现注释符不在正则表达式中,因此我们将后面的东西注释掉:

 

 成功绕过。

0x0E

这关也是一个正则,不太看得懂,我放最基础的payload上去,发现除了大写,就是在script标签前加了一个 _ ,无从下手,搜索发现,都是前人栽树后人乘凉,大家好像都是用  ſ 这个符号来代替s,原因我也不明白,我们只需要记住这个特殊的方法以后,然后我们构造

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

0x0F

对常用的注释符,注入符等进行了html编码,但是编码之后的东西处于img标签中,代表即使我们输入//<等,被编码之后,其依然能够被执行,因此我们尝试构建payload来闭合它们:

payload:');alert(1);//

 

0x10

直接输入一个alert(1)即可,因为服务器代码没有做任何防御

0x11

过滤了很多字符,并且加上了对换行的过滤,并且我们输入的每个字符前面都会被添加上一个转义符,但是也只是被添加一个转义符,转义之后还是不影响它的功能,因此我们可以照常将前面闭合,将后面注释

 payload:");alert(1);//

0x12

 我们使用11关的payload,但是没有反应,因为服务器代码将输入的双引号变成了  \" 代表其被转义符转义了,那我们就再添加一个 \ 将转义符给转义,即可绕过:

payload:\");alert(1)//

 至此,本靶场完美结束,本靶场主要是白盒测试,能够看到所有的代码,因此我们通关会比较顺利,这个靶场仅仅用来实现基础的绕过思路和技巧,实际上我感觉我根本不太懂更为复杂的绕过方式,这个靶场对于起步来说还是很好的!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值