暂无简介
前面发表了《一些BAT的XSS实例(一)基础篇》和《一些BAT的XSS实例(二)进阶篇》,主要详细的讲了下1~5题的思路,错过的朋友可以点击上面链接,去查看相应的文章,下面我们来看下后面其他的题。
背 景
有很多人私信问我,能不能来一些XSS绕过实例分析,我选了些N年前的BAT的XSS实例来聊聊构造和绕过思路。(这些实例都是已经公开并且修补完毕的,这里是只是以此为原型,并做了一定的修改,进行了一些XSS题目的设计而已。)
先一次性把16道题发出来(大部分的题都是一题多解,尽量给出多种思路,或者最短的解法。)
http://px1624.sinaapp.com/test/xsstest1/
(其他题目,将xsstest1依次改为xsstest1~xsstest16即可获取)
有兴趣的朋友,可以先不看文章,自己尝试的做一做题目,有答案的话可以发到我的邮箱px1624@qq.com 并附上自己的ID,说不定下篇文章里面就会有你的绕过思路被收录了额。
◇ 1 先看看第七题
因为第六题应该是所有题中最难的,目前只有ID:gainover解出来了所以还是先不公布答案,上篇文章《一些BAT的XSS实例(二)进阶篇》已经给出了部分提示,还是给更多的人留些解题时间,放到最后在公布吧。所以先看第七题。
先来看源码
一看到这个情况,做过前面题的人应该懂,首先要自己写参数px
看着好像蛮简单的,直接去构造下。
如上图,可以发现特殊字符被转义了啊,所以单引号这样子就跳不出了,后面的注释也就用不了了。这时候肯定是想的,再去试试反斜线,如果这个没有过滤,那么 \' 就会被过滤为 \' 这样等于是将反斜线进行了转义,所以后面的单引号就没有被转义了,那么就可以闭合代码里单引号,从而跳出单引号限制了。
大概的意思如上图代码解释
如上图,果然反斜线没有转义。
但是最后面这个多出来的单引号怎么处理?你会发现不管你怎么尝试,这里的单引号就是没法处理掉,基本上到这步,很多人就已经打出GG了。
很多人似乎想到第四题,我们可以不可以把其中一部分内容当做模板字符串,但是你会发现还是有区别的,因为第四题的输出点2个位置都在js环境里,而这里是一个在js中一个在html中,所以直接这样肯定是不行的,因为不管你怎么构造,你都会发现script标签里的输出部分最后面的这个单引号没办法解决。
不过通过观察,我们发现html中的字符的过滤逻辑和js中并不一样。
测试发现,js中的可控点是进行了反斜杠的转义,html中的是进行了html实体编码。一番尝试后,肯定会发现不管是在js中还是html中,都是无法成功构造XSS的。那么如果我们有办法跳出script标签,然后把后面的代码也当做js去解析的话,是不是就和第四题的情况基本一样了?
所以这里是有一个知识点,如果不知道的话,那么这个题是大概率解不出来的。
https://www.dazhuanlan.com/2019/10/25/5db1e6beea817/
具体可以看下上面链接的文章解释,可能一时半会还是比较难理解的,这里大概意思就是说在script标签里面如果遇到了 <!-- 那么这个的解析优先级会变成最高,如果这个后面再出现 <script> 标签,那么最近的另一个</script>标签就会优先去先闭合这个,从而打破了原先跳不出script标签限制的这个点。
可能这么解释大家一时半会还是不太容易理解,这里我用这个实例来给解释吧。
如上图,输入个<!--<script>进去,看看能不能跳出script标签限制,发现貌似没啥作用,仔细看看,因为script标签这里被转义了,所以要给后面加个空字符,这样也是不影响解析的。
如上图,会发现已经成功的跳出了script标签了
<!-- 的出现改变了内部解析优先级,后面出现<script>程序就会去寻找最近的</script> 然后 <!-- 会寻找后面的 -->
进行闭合。
这样下面本来在html位置的输出点,也变成了js代码进行解析了,那么再按照第四题的方法,利用模板字符串,去进行构造就可以了。
首先还是先闭合跳出单引号,然后写入模板字符串,如下图看下代码。
如上图,再调试下使得js代码语法正确就可以了,这里模板字符串可以用运算符隔开,后面多余部分的代码注释掉即可。
如上图,这里等于我是把
<!--<script >
以及其他标签,全部放到了模板字符串里了。这里的script标签其实都是不需要闭合的。
http://px1624.sinaapp.com/test/xsstest7/?px=111\%27-alert(1)-`//%3C!--%3Cscript%20
这里再给出其他一些人的答案,构造思路还是千姿百态的。
ID:Huuuuu 他这里是将无用内容分别放到了单引号的字符串和模板字符串里。
http://px1624.sinaapp.com/test/xsstest7/?px=`//*%3C!--%3Cscript%20%3E\%27-alert(1)-`
ID:香草 他的思路是把无用内容放到了2个模板字符串里,alert放在了hash里。
http://px1624.sinaapp.com/test/xsstest7/?px=\%27-`-eval(location.hash.slice(1))//%3C!--%20%3Cscript%20%3E`-`#alert(1)
ID:zeddy 这个构造思路比较有意思,和其他人不太一样,我重点分享下。
http://px1624.sinaapp.com/test/xsstest7/?px=%3C!--%3Cscript%20`)/*\%27%0aalert(1)%0aalert(`*///
他的这个payload是会弹两次的,这个构造的思路也比较有意思。
首先也是引入了
<!--<script%20
他这里就是用的开口的标签,然后这部分标签第一个输出点放在了单引号字符串里,第二个输出点放在了模板字符串里。然后后面的alert他用的%0a进行了换行,避免了语法错误,同步输出的alert点他用了
/*xxxx*/
进行了注释,最后面多出来的标签用了//进行了注释。
虽然思路比较的绕,但是可以看出来,这哥们在做这道题的时候,构造思路用的还是比较与众不同的。这个payload的思路,可以进行一定的优化的,如下。
比如先去掉后面无用的alert和括号,再把%0a改成运算符号。
http://px1624.sinaapp.com/test/xsstest7/?px=%3C!--%3Cscript%20`/*\%27-alert(1)-`*///
没有了%0a换行有,这里注释也可以精简下,最终就是这样
是不是发现精简后的结果和我一开始给的解法,其实也是差不多的额。
◇ 2 下面来看看第八题
第八题这里可以看到有4个输出点,其中js中有2个,html中有2个(其中第一个点限制了长度),js中的过滤规则和第七题一样,html中一处做了html编码,另一处value属性的位置似乎什么都没过滤。
那么马上心里面就有答案了,直接给这个属性位置的输出点构造
xxx"onxxxx=alert(1)//
应该就可以了。
结果一看,这里是对双引号做了单独的过滤措施,统一过滤成了实体字符。所以说这个题肯定不会这么的简单,如果实际中遇到这种情况,估计很多人会觉得没啥问题,可能直接就放弃了,实际中的输出点可是不会这么高度聚集在一起的额。
这里其实还是要先跳出script标签的,至于为什么要这么设计,只是因为实例中的过滤就是这个样子,我直接移植过来了而已。由于第七题对这个思路已经做了很详细的分析,所以这里就简单的提一提就行了。
这里给出p1g3、zeddy的解法,具体payload有些区别,但是思路都是一样的,而且写的比较复杂,我这里精简下给出他们的思路方法。
http://px1624.sinaapp.com/test/xsstest8/?px=%3C!--%3C/script%3E%3Cscript%20%3Ealert(1)%3C/script%3E
利用<!-- <script> 跳出了原有的script,然后后面写入新的script,由于script标签解析的优先性,就破坏了value属性位置的双引号,从而执行了XSS。
但是他们2人的答案有个共性,那就是不能过谷歌浏览器的xss filter,虽然在测试的时候发现,最新版的谷歌浏览器把xss filter给去掉了,但是这样的答案还是不够通用,因为低版本谷歌浏览器还是有xss filter的,而且谁知道后面谷歌会不会再把xss filter给加回来呢?
ID:香草 的答案就充分的利用了过滤规则,从而绕过了过滤器,payload给的也比较复杂,大概思路是这样绕过xss filter的。
http://px1624.sinaapp.com/test/xsstest8/?px=%3C!--%3C/script%3E%3Cscript%20%3E%22=alert(1)%3C/script%3E
为什么这样就可以了?估计很多人肯定一脸懵逼吧。这个要先了解下谷歌xss filter的运行机制,如下图,主要是将输出的代码和URL中的代码进行对比,如果不同就会默认为安全输出。
那么就很好理解了,前面几个人的这个payload,输出和URL是一样的,所以会被xss filter认为是有XSS风险,进行拦截。
ID:香草 的这个,巧妙的利用了此题对双引号过滤为实体字符的策略,这样输出和URL位置就不一样了,所以xss filter就不会进行拦截了。
此题你会发现,上面的答案控制台是会报错的,因为这里等于是重写写入了一个script标签对,然后报错是因为之前的那个script里面语法各种报错了。
此题ID:gainover、Huuuuu 还都给出了另一个解法,具体细节思路将在下一篇中进行分享。
3 下面再顺便看看第九题吧
此题对第八题做了一定的修改,还是四处输出点,区别就是这里对双引号的过滤方式进行了改变,而且对2处html位置的输出点都做了html编码,并且同步限制了长度。所以想着用上面的方法直接写入标签,那基本上是不可能的了。那么这个应该怎么去解呢?
具体思路和细节,放到下篇再写吧。这里建议大家不要太关注payload答案,主要分享的是构造思路,如果太在意payload的具体内容,可能反而会限制自己的思路,因为这些题都是开放性的,不存在什么标准答案。只要能解出来的,都是好思路。
友情提示:后面的逻辑相对较复杂,在解第九题的时候,建议安装个Visual Studio Code方便调试。
是不是意犹未尽呢?那就关注公众号等待后面的精彩解析吧。
尾 巴
目前最新情况是,一部分的人做出来了1~5题,卡到了第6题。其实卡住了的话,是可以跳着去做其他题的,因为整体来看,第6题应该是最难的了。
ID:gainover 解出了全部10题。
ID:Huuuuu 解出了1~5题,以及7~10题。
ID:香草 解出了1~4题,以及7~10题。
ID:p1g3、zeddy 解出了1~5题,以及7~8题。
其他已经做出未被提及的,可以将自己的答案和ID发我qq邮箱:px1624.qq.com
- 本文作者: px1624
- 本文来源: 先知社区
- 原文链接: https://xz.aliyun.com/t/11682
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!