xss.haozi.me靶场详解
由于xss.haozi.me是一个在线靶场,服务部署在Github,若网速不好,则需要科学上网。由于本靶场是一个白盒测试的靶场,我们可以看到代码的源码,所以可以直接根据源码的限制的条件来思考如何绕过。...
前言
由于xss.haozi.me是一个在线靶场, 服务部署在 Github,若网速不好,则需要科学上网。由于本靶场是一个白盒测试的靶场,我们可以看到代码的源码,所以可以直接根据源码的限制的条件来思考如何绕过。
0x00
通过源码我们发现本关没有任何限制所以直接输入
payload:<script>alert(1)</script>
就可以过关了
0x01
进入第一关分析源码得知,将我们输入的数据包裹在<textarea>
标签中返回,因为<textarea>
为RCDATA元素,在此标签中,只能返回</textarea>
标签无法创建其他标签,所以这一关我们需要将<textarea>
标签闭合输入其他标签
如果想具体了解<textarea>
元素为什么无法创建其他标签可以查看这一篇我写的文章 从XSS Payload学习浏览器解码
payload为:</textarea><script>alert(1)</script>
0x02
分析源码可以得知,将输入数据的返回值放在input标签中的value值里,因为本关没有做任何过滤,所以这里有两种绕过方法。
第一种:闭合vlaue值直接写input事件
第二种:闭合input标签,重新写入恶意标签
payload如下:
方法1:aaa" οnclick="alert(1)
方法2:"> <script>alert(1)</script>
由于方法1为点击事件,需要点击文本框才能生效,所以本关推荐方法2。
0x03
进入第三关发现本关通过使用正则表达式来过滤了我们的()
,将()
替换为空
若对正则表达式不了解的可以查看这篇文章链接: 正则表达式常用语法解析
所以本关我们的思路就是尝试写不带括号的标签,或者通过编码的形式来绕过。
以下给出两种payload方法绕过
方法1:使用反引号代替括号
<script>alert`1`</script>
方法二:使用html实体编码对括号进行编码
<img src=1 onerror="alert(1)">
注:若要使用编码的方法绕过,需要注意html解析规范
例:<script>alert(1)</script>将不会成功
因为<script>标签中解析编码后,不会执行编码后的函数只会将编码后的文本打印出来
所以若要使用编码,通常使用在on事件中的语句进行编码
0x04
进入这一关分析源码发现,在上一关的基础上将我们的反引号也过滤掉了,所以我们直接使用上一关的方法二就能成功绕过了。
0x05
进入第五关,分析源码发现将我们输入的数据放在html注释符中,并使用替换函数将注释符-->
替换为一个emoji符号。
所以我们的绕过思路就是如何从注释行中逃逸出来。
正常的html注释格式为<!--aaaaa-->
,但经过测试可以发现,在html中使用
<!--aaaa--!>
的方法也达到注释的效果。
所以本关我们的payload为:--!><script>alert(1)</script>
0x06
分析代码可以发现本关将输入数据放在input标签中,并将auto和on关键字>
字符进行了一个替换添加。目的防止我们在input标签中使用事件弹窗,也不让使用>对input标签进行闭合。
但因为html的特性,可以不同行执行命令,我们可以在auto、on关键字后换行,再书写=alert(1)函数。payload如下:
type="image" src=1 onerror
=alert(1)
0x07
分析代码发现本关将<>
和尖括号中的字符全部过滤,防止我们书写新的标签造成恶意弹窗。
这里就需要利用一个html的特性了,html在解析中有一种纠错机制,img标签不写后面的“>”仍然是可以正常执行的。
payload的为:<img src="1" onerror="alert(1)"
0x08
通过分析源码发现,本关将输入数据放入在一个<style>
标签中,并过滤了</style>
标签防止我们进行闭合操作。
本关的绕过思路是使用换行操作,因为他只识别某一行特定字符进行过滤,但html可以执行不同行的命令,所以使用换行操作进行闭合style标签绕过过滤。
payload为:
</style
>
<script>alert(1)</script>
0x09
进入本关分析源码可以发现,如果不输入domainRe
变量中的字符串则会直接返回语句Invalid URL
,输入正确语句后放入script标签中。
所以本关需要考虑如何把变量中的url闭合
将第一个script闭合后,由于有return的返回值">
,所以还需要使用注释符注释就可以绕过了。
payload为:
https://www.segmentfault.com"></script><script>alert(1)//
0x0A
进入本关后发现,本关在上一关的基础上,过滤了&、'、"、<、>、\
等字符转换为实体编码。
所以本关不能想上一关一样闭合标签了,所以只能思考别的方法进行绕过。
本关可以使用url@重定向的方式进行绕过
在网址中间使用符号@
(例如https://www.google.com@stackoverflow.com)将重定向到
https://stackoverflow.com/网站(@字符后的域URL)。
其中以@分隔的话前面表示的是用户名和密码,后面表示的是登录的网站和端口,
也可以以表示重定向到第二个网站。
所以本关可以在本地写入一个test.js文件,在js文件中写入alert(1)进行重定向
payload为:
http://www.segmentfault.com@127.0.0.1/test.js
注意:由于不同的浏览器可能会有保护机制,所以本关可能不会显示成功。
0x0B
本关使用了toUpperCase()
函数,将我们输入的数据转换为大写。
这里需要注意一点,在html中语句是不区分大小写的,但在js中语句是严格区分大小写的。所以例如我们直接输入<SCRIPT>ALERT(1)</SCRIPT>
,标签语句可以正常生效,但是标签中的alert函数是js解析,所以导致不会弹窗,所以本关我们将alert函数进行编码就可以绕过了,payload如下:
<img src=1 onerror='alert(1)'>
0x0C
进入本关发现在上一关的基础上过滤了script字符,所以我们直接使用上一关的payload就能直接绕过了。
0x0D
进入本关发现使用正则表达式过滤<、/、"、'
几个符号。又将我们输入的数据放在注释行中。
所以本关想要绕过就只能使用换行符,使用换行符将我们要输入的alert(1)与注释符不在同一行,再将后面的注释符进行注释,就能成功绕过了。
payload如下:
aaaa
alert(1)
-->
0x0E
进入本关发现将所有用<开头的字母都进行了替换,让我们无法正常输入标签。
这里需要使用一个xss特殊的绕过技巧,在html中ſ
这个字符转换为s,所以我们通过使用这个字符绕过这里的过滤函数。
payload如下:
<ſvg/onload='alert(1)'>
0x0F
我们发现本关将特殊字符转换为html实体编码放入img标签中的onerror事件中。
但是在onerror事件中html实体编码是可以正常转换调用的,所以我们可以直接输入')
将前面闭合再输入,或;或换行
将alert(1)分隔开来,就可以正常执行了。
payload如下:
aaaa');alert(1)//
0x10
进入本关发现,将输入的数据直接放入在一个window.data
中
而这个就相当于windows中弹窗调用,所以直接输入alert(1)就可以成功弹窗了
payload为:
alert(1)
0x11
进入本关发现在过滤了许多字符的基础上还将,\n、\r等换行操作给过滤了。
所以我们可以先把前面函数闭合,虽然不能使用换行操作,但是我们可以使用,
或者;
将代码分隔开来,再把后面字符使用注释符注释就可以成功绕过了。
payload如下:
"),alert(1)//
0x12
本关本质其实和上一关一样,就是将"
替换为\
,防止闭合前面函数。
但是我们可以通过先输入\
符号将\进行转义了,这样双引号就能成功闭合了。
payload为:
\"),alert(1)//
总结:本靶场主要是白盒测试,多用于拓展xss绕过思路和技巧。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)