Level1

分析服务器源码

看到上图的两处还比较有用,意思是只要弹出弹框就会自动到下一关,同时记录payload的长度,因此是无过滤我们直接构造payload
Payload:name=<script>alert(/xss/)</script>

直接进入第二关
Level2

简单尝试

发现没有起作用反而完整的显示在页面中,因此推断输入的语句被实体化了,我们分析服务器源码看看

可以看到htmlspecialchars()
htmlspecialchars()作用:把预定义的字符转换为HTML实体
预定义的字符有:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
再看看网页源码

可以看到<和>被编码成html字符实体,接着往下看可以看到插入到value参数值中的恶意代码并没有被编码而是直接原样返回,但是问题是这里的js代码在标签属性值中,浏览器是无法执行的,那么我们只需要将属性的引号和标签先闭合,因此我们将<input>先闭合,然后构造payload即可弹窗
Payload:"><script>alert(/xss/)</script>

Level3

发现和第二关有点类似,这里仍然是将全部的输入打印到了页面上
查看服务器源码

可以看到仍然使用了htmlspecialchars(),但不同的是第二个箭头处也使用了
那么我们继续看网页源码

也是多在标签处使用了html实体,也就是两处编码成html实体
因此<script>不能使用了,因为<和>都会被转义,我们需要通过<input>标签的一些特殊事件来执行js代码
因此我们只需要先闭合value的’,然后在构造我们的特殊事件即可
Payload:'onfocus=javascript:alert('xss') >

这里仍没有弹框,这是因为这个onfocus事件的特殊性造成的
onfocus事件在对象获得焦点时才发生,且通常用于<input>,<select>和<a>
因此我们点下空白输入框即可发生弹框

Level4

尝试<script>alert('xss')</script>

可以看到输入框内的<和>不在了
查看网页源码

发现第一个箭头处<和>进行了编码html实体
第二个箭头处将<和>进行了删除
我们再看一下服务器源码

可以看到利用str_replace()将<和>替换为空,同时进行html实体
因此我们可以利用level3中的语句进行拼接,因为其没有使用<和>
Payload:" onfocus = javascript:alert('xss') >

可以看到成功了。
注意:输完payload后,鼠标再次点击空白输入框才能生效。
Level5

输入如上命令,发现输入框变成了<scr_ipt>alert('xss')</script>,那么推断是将script换成了scr_ipt
分析网页源码

第一处被html实体编码了<和>,第二处将<script换成了<scr_ipt
再分析服务器源码

可以看到将传入的值全变成小写,将<script替换为<scr_ipt,将on替换为o_n,因此script和onfocus等都不能用了
因此我们使用其他标签,构造payload即可
Payload:"><a href=javascript:alert('xss')>xss</a>

然后点击超链接即可

Level6

尝试我们的语句

发现和level5的情况相似
查看网页源码:

查看服务器源码:
XSS攻防实战:从Level1到Level20的服务器源码解析

最低0.47元/天 解锁文章
1077

被折叠的 条评论
为什么被折叠?



