今天在看大佬文章的时候,发现一个xss的在线网站:地址。
事情就从这里开始啦!!!
level1 : Hello, world of XSS
第一关非常简单,是产生xss漏洞最为常见的原因,用户的输入未经任何转义直接包含显示在页面中。
只要输入<script>alert()</script>即可。
level2 : Persistence is Key
Web应用程序通常将用户数据保存在服务器端,并且越来越多地将客户端数据库放在客户端数据库中,然后将其显示给用户。无论用户可以控制的数据来自哪里,都应该谨慎处理。这个级别显示了在复杂的应用程序中可以很容易地引入XSS bug。Level2是一个利用存储型XSS漏洞的题目, <script></script>标签都被过滤不能生效, 使用其他标签就可以绕过了。参考:
<img src='N' οnerrοr=alert(document.domain)>
level3 : That sinking feeling...
正如在第二关看到的,一些常见的JS函数是执行接收器,这意味着它们将导致浏览器执行出现在其输入中的任何脚本。 有时候,这个事实是被更高层次在后台运行的底层API所使用。
客户端从URL读取location.hash未进行安全过滤转义, html += "<img src='/static/level3/cloud" + num + ".jpg' />";,在JS上下文语义中未对变量num进行正确转义,闭合签名的<img>标签即可。参考:'/><sCript>alert();</scrIpt>
这是一个DOM类型的XSS漏洞。Dom-Based XSS与反射型、存储型XSS不同的是,它是在浏览器解析DOM过程中发生的漏洞,恶意JS代码发生在客户端,并不会在服务器端返回响应页面源码直接显示。
level4 : Context matters
必须正确转义用户提供的每一位数据,以便其出现的页面上下文。说明了原因,在输入框输入时间,表单提交至另一个页面,页面上有一个定时器任务,后台功能是用Python开发的。思路与第三题差不多。
查看页面源码,发现<img src="/static/loading.gif" οnlοad="startTimer('{{ timer }}');" />,要闭合。参考:}}');alert();//
Level 5: Breaking protocol
查看源代码,发现这道题是对于输入转为链接过滤不严,导致可以用javascript伪协议来xss。
在注册邮箱的地方输入javascript:alert('xss');
level6: Follow the
最后一关是引入外部js,过滤不严导致绕过造成xss。通过fragment获取外部js路径,然后加载路径。但是不能包含http://或者https://字符。那么我们这里可以使用伪协议来进行绕过。参考:/frame#data:text/javascript,alert(1);