XSS练习平台【a/lert(1) to win】

这篇博客详细介绍了XSS练习平台中的一系列挑战,涵盖从基础的warmup到复杂的DOM、JSON和Callback等场景。作者通过实践和解析代码,展示了如何在不同过滤和限制条件下构造有效的XSS攻击,如使用JSON.stringify、Markdown规则、DOM操作和JavaScript特性来绕过防护。同时,提醒读者注意不同浏览器可能存在的差异,并分享了在解决难题时的思考过程和解决方案。

题目来源:https://alf.nu/alert1

这一系列的题目目标为alert(1),也就是找出一个XSS利用点。

页面会给出一段需要绕过的过滤函数,Output回显函数生成的HTML代码,方便绕过;

Console out是在控制台输出的值,就是console.log里输出的值

ps:请用chorme进行练习,有的题目在firefox上会出错

一. warmup 

  没有任何过滤,直接闭合前面,注释后面即可

 

二. Adobe

看源代码,发现代码匹配了所有的双引号(/g表示匹配全部),然后把双引号用\"代替,意思就是直接在双引号前面加转义字符“\”,让双引号变成字符而失效,导致前面不能闭合。我们可以在输入时在双引号前面直接加个反斜杠,让我们输的反斜杠转义函数加的反斜杠,从而使得双引号生效。

 

 

三. JSON

   这题函数用了JSON.stringify()使得任意的JS转化为JSON字符串(JSON字符串是一种独立于各种编程语言的字符串,我理解就是字符串)。

这些不管,自己尝试输入,其实就是在我们输入的字符串两边加上双引号,并且在输入的双引号等特殊字符前加反斜杠。

由于前面有双引号无法消除,所以我们考虑用</script>标签闭合前面的<script>(不管其中的语句有没有错误),然后在后面另起<script>alert(1)

 

ps:这里我们可以不规范的HTML代码<script>alert(1),后面没有</script>闭合alert也生效了。

 

四. JavaScript

 

   这道题刚开始看不懂代码,结合了大佬的WP后得知,这段代码大概是插入一个<a>标签,标签里的href属性可由我们控制,并且href属性中的内容会被自动执行。再看看代码url='javasript:console.log(......),就是说我们可以在之中执行JS代码。

这道题也有JSON.stringify,需要我们消掉前面的双引号,但这题没有<stript>标签,所以不能用上道题的闭合方法。但这题的特点是他是执行url中的JS代码,在url中自然可以用url编码啦,双引号的url编码是%22。得出答案。

 

这道题不能用火狐来做,我们在控制台测试得到

chrome控制台测试      

firefox控制台测试        总感觉是这里出了问题,但不知为啥,想到了再来更

 

五. Markdown

首先看函数,一共有三条正则查找替换

第一条:将所有小于号转义(防止闭合、构造标签),将所有双引号转义(防止闭合双引号)

 

第二条:当有http://a被检测出来,将之变为一个a标签<a href="http://a">http://a</a>

 

第三条:当有[[a|b]]这种形式被检测出来时,构造<img alt="b" src="a.gif">

 

这道题思路很明显,就是结合第二第三条规则执行JS代码,但我想的思路有点问题。

先给出大佬答案

这条[[a|http://οnerrοr='alert(1)']]是利用第二三条规则构造出

<img alt="a" onerror='alert(1)' src="a.gif">

这样的句子,让src中错误的图片执行失败从而触发onerror中的JS代码。(ps:在onerror()前面有斜杠/并不影响onerror的执行,且在不相邻属性名的情况下,在属性之间加单引号和双引号也不印象属性的执行,不知道原理,知道再更。)

 我的想法是构造<a href=“aaa”οnerrοr='JS'>来执行的,最后发现onerror根本没有在<a>存在,而且<a href=>还是要a.cleck()的~看来学XSS还是要好好学JS。。留下了没有技术的眼泪wuwuwu。(这道题在firefox也会出错,请用chrome)

 

六. DOM

这题让我们学到:遇到实在弄不明白的代码可以放进控制台实验一下。

先看代码,根据DOM的知识,大概意思是建立一个dir元素,将输入的语句拼接到新的dir元素里面。用#将输入分割成两部分,前面一部分接document.creatxxxxx(比如你输入Element,那么前面的document['create'+m[0]]就等价为document.createElement  ),后面一部分为内容(至于是什么内容根据前面的标签而定。)在控制台实验如下:

当后面m.slice(0)时,列表第一个元素b被构造为元素(虽然不正确),而第二个元素a则变成了元素b的属性(内容),因为slice是截取的是slice(start,end),如果没有end的话就截取到末尾。

所以,当后面m.slice(1)时,只截取了列表m第二个元素a,构成了a标签。

代码明白了开始做题,首先我们不用createElement这样的标签

因为无论你输入什么他都会加上一大堆其他东西很难构造

当然题目给的TextNode也不行,因为<>是特殊字符会被转码。

我们用creatCommend这一个创建注释的标签,后面的值我们可以随便构造,至于包围的注释符号我们匹配掉就好了。

 

后面的<!-我们也可以不要,因为前面没有匹配括号的话那半个标签会被忽略。

 

七. Callback

这题的代码比较清楚,Callback就是回调函数的意思,但这题好像没用到?反正被题目误导了好久

看代码,还是用#分割出两个元素(现在明白了就是模拟真实情况下两个输入框的情况)

第一个输入框用正则过滤指定了大小写字母,[]和单引号,除此之外所有的字符都不能存在。

第二个框又用了JSON函数把<给转义了(这里误导了我。。)

正常输出的话是这样的

后面肯定存在alert(1)//无疑了,但前面怎么构造才能使alert逃出来呢?

小菜鸡我想了好久,开了个脑洞是是在前面构造出thing[1],相当于前后构造一样的字符,从而前后结合绕过中间双引号等符号。(主要受到了题目Callback和前面保留了"[]"的影响)但想了很久却想不到怎么构造thing[1]。

看了大佬的wp发现没那么复杂,以下是语句

两边的双引号弄掉了中间乱七八糟一大段,然后以;作为前面部分的总结,照常用//过滤掉后面的双引号。

(其实这题真不难,就是想得有点多wuwuwuwu)

 

八. Skandia

  首先看着道题代码很简单,就是把输入的字母全部变成大写。

那么我们可以想象:先用一个</script>标签闭合前面的(html标签对大小写不敏感),一个//注释掉后面的,没有疑问。

中间再构造一个可以执行的alert(1)的标签就行了,我选择<img src=1 οnerrοr=alert(1)>//

但是中间的alert(1)是JS是大小写敏感的,所以我们考虑html字符实体(实体字符相对于html代码是无特殊意义,但是通过html转换成了小写的刚好执行JS代码),如下:

九. Template

从代码可以看出,我们输入的s中的<>&"' 都被转义了,然后剩下的被拼接入下面的<script>标签内的v.innerHTML='<a href=#>'{name}</a>';里,这段DOM的意思是给id=name的span标签内加一条<a>标签(就是在html里加一个a标签)。

a标签不是我们想要的,所以首先想到的是闭合、注释a标签构造新标签,可以想到</a><img src=' οnerrοr=alert(1)//

但<>都被转移了,因为没有过滤反斜杠,所以我们可以用\x3c和\x3e这些转义字符代替<>(在html中会被渲染成<>),最终语句如下。(这里不用闭合前面a标签好像也ok)(不能用实体字符因为这里的<>需要在html发挥作用)

十.JSON

这道题比较简单,正则匹配了<script,然后替换成空,但这样的过滤只能过滤一次,所以我们采用嵌套<script>标签绕过。

 

十一.Callback

这道题看代码,也是模拟两个输入框,用#分隔两个输入框内容。

第一个输入框也是过滤了除大小写字母和[]'之外的所有内容,和Callback一样

不一样的是第二个输入框,过滤了正反俩斜杠,让我们不能注释掉后面的内容

wait!html注释符好像不止//这一种吧,<!--是不是也可以?构造语句如下

十二.Skandia

这段代码简单,就是不能出现<>,否则直接输出-(注:[]并没有过滤,这里的[]是正则中代表字符集合)

然后后面也是全部字母被改为大写。首先上答案

输入中间的乱七八糟一大堆是alert(1)的jsfuck,jsfuck是一种编码形式,用于js时可以被渲染为alert(1),网站

然后前面再加上");用于闭合前面的,连接后面的jsfuck后的alert(1)。之后再加上//就行了。

我构造的是");%61%6c%65%72%74(1)// ,用%+十六进制这种转义字符替代字母,失败了,(html实体字符也不行)原因可能是转义字符和实体字符中的十六进制中的字母对大小写敏感?

 

 

十四.iframe

看到代码百思不得其解,看了大神的wp之后得知一个知识点,给属性onload赋值youWon && alert(1),youWon=Ture相当于

if (youWon) alert(1);?如果是这样的话就要弄个youWon,但是在哪里弄呢?大佬说是有个name参数,然后就不知道了

十五.TI(S)M

前面的两个函数以不同的方式对输入的url进行处理。json(s)函数对输入的斜杠与反斜杠转义,而html(s)函数对输入的[]<>"&字符进行html实体字符化处理(两函数是使不同的字符失去作用)

整个函数返回的是一段html代码,我们的目的很明确,构造<script>alert(1)</script>或<img src=1.jpg οnerrοr=alert(1)>这样的语句。

题目的本意是只有http:开头的代码才会被注入到img标签里面去。我们的输入若以http:开头,然后代码会new一个Image对象,将json函数过滤后的url赋值给Image对象的src属性。但XSS不需要按常规思维,首先给大佬payload

如果拿不准哪里是无用代码可以把output的东西复制到控制台看看,控制台会自动进行颜色区分。

1.<!--<script> 这个标签的意思是可以无视后面的</script>,将这个标签以后的代码全部当成js执行。

2.在<!--<script>两边加注释符的意思是这个标签只需要用一次,第一行由于转义了/,所以注释符不起作用。而URL:之后的语句进行的是html过滤,没有过滤/,所以<!--<script>标签被注释掉了。

3.最后的一半注释符/*用的很巧妙,虽然<!--<script>可以无视</script>标签,但若是后面出现<script>标签仍然会对其产生影响,

为了弄掉<script>标签,我们用半个注释符与后面出现在正则表达式中的*/匹配注释调中间部分(包括了其中的<script>标签)

4.if(/b/)是因为if也被注释掉了,为了语法正确而加上的。

十六.JSON3

放py,看了半天不明所以,明白了再上来更。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值