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:callback#userdata

alert(1) to win 7

两个参数,两个输出点,要执行alert(1)或alert`1`就必须隔离,通过引号可以达到这样的效果,但双引号被转义了,可尝试单引号:

alert(1) to win 7

 

 这里使用单引号闭合一堆无用内容而不用双引号,是因为JSON.stringify()有下面的特性:

alert(1) to win 7

 

相关文章: