alf.nu/alert1 writeup(1-7)

1.warmup

链接:https://alf.nu/alert1
热身题嘛,没有进行任何过滤,就简单的闭合一下双引号就行了:
payload: 1");alert(1)//

2.adobe

题目:

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

可以看到,想要弹窗必然需要闭合双引号,但是这里双引号时被过滤了的,只有想办法绕过过滤,由题可知过滤方法时将【"】替换为了【"】,我们可以通过输入【"】来进行绕过,我们的【\】会将原本的【\】给转义掉,从而实现绕过!

json

题目:

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

json.stringify()方法,可以将一个传入的对象(这里是字符串)加上双引号,并转义【"】,这就时它的特性,也就是我们输入一个字符串s,在s的两端都会被包裹在双引号当中,那么很明显又是一个绕过双引号的题目,这里其实涉及到html标签的优先级,script标签时具有高优先级的,就是说当我们在script标签中出现了</script>标签,那么就会闭合前面那个<script>,从而实现绕过。(其实上一题也可以这样操作)
payload:

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

javascript

题目:

function escape(s) {
  var url = 'javascript:console.log(' + JSON.stringify(s) + ')';
  console.log(url);

  var a = document.createElement('a');
  a.href = url;
  document.body.appendChild(a);
  a.click();
}

又是拿JSON.stringify()做文章,但是我们应该仔细观察一下他与之前题目的差异,这次字符串出现在了url中,实际上已经给了我们提示了,当然我们的目标还是绕过【"】,怎么绕呢?url编码!在url中url编码会自动解码,但是js是不会解码的,所以url编码后的【"】js是不认识的,所以我们就成功逃过了JSON.stringify对【"】的转义。
payload:

%22);alert(1)//

在线url编码地址:
http://tool.chinaz.com/tools/urlencode.aspx

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

这是某些markdown语法的实现方式,确实过滤的很不错,但是我们也是有机可乘的!仔细阅读源码,【<】【"】都被转义为html实体。
第二条正则:将输入的链接自动生成了a标签!
第三条正则:markdown标准插入图片的语法,【|】走遍是图片的src,右边是图片的alt属性。
跟着思路走,我们一条条正则来谈绕过。从第一条可以基本确定我们想要直接输入<script>等标签以及双引号是不太可能的了,第二条是关于url的,那么我们可不可以使用javascript伪协议呢?答案是不行,正则规定了只有http://开头的才可以生成a标签,那么再看一下最后一条,由于第一条的实体编码导致我们输入【"】与【<】都不行了,难道真的凉了?不是的,实际上我们自己是不能输入双引号了,但是我们可以试试用利用它给我提供的双引号啊,我们输入http://什么的时候就会自动生成a标签,a标签中就会有双引号,这些就可以为我们所用啦:
payload:

[[a|http://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;
}

根据源码,输入Element#div就会创建一个div标签,输入TextNode#123就会输出文字123,输入Comment#test就会输出<!--test-->,就是一个创建dom节点的函数。我们的目的就是能够执行alert(1),那么创建dom节点就那么几个方法,像Element、TextNode这种就没机会了,一个是只能淡出创建空标签,一个是只能输出纯文本,都不能利用,那就只有试试Comment了,实际上这个也是很好利用的,只要想到了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>";
}

由源码可知,回调函数是有限制的(只能由字母、反斜线、单引号组成),不能用任意的,obj是一个序列化后的对象,我们可控的就callback与obj的值,一开是我的思路全部被局限再了callback上了,一直再想什么函数可以实现弹窗,但是后面才发现callback不一定要是一个函数,我们需要做的就是闭合想办法绕过obj,让它不在时一个对象,否则我们是不可能弹窗的,payload:

'#';alert(1);//

如果哪里由错误,或者大家由新的思路欢迎与我分享。

每天进步一点点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值