查看原文
其他

一些BAT的XSS实例(三)中级篇

px1624 威努特工控安全 2021-07-06

前面发表了一些BAT的XSS实例(一)基础篇》《一些BAT的XSS实例(二)进阶篇》,主要详细的讲了下1~5题的思路,错过的朋友可以点击上面链接,去查看相应的文章,下面我们来看下后面其他的题。


背 景

有很多人私信问我,能不能来一些XSS绕过实例分析,我选了些N年前的BAT的XSS实例来聊聊构造和绕过思路。(这些实例都是已经公开并且修补完毕的,这里是只是以此为原型,并做了一定的修改,进行了一些XSS题目的设计而已。)

先一次性把10道题发出来(弹框1就算成功,大部分的题都是一题多解,尽量给出多种思路,或者最短的解法。)

http://px1624.sinaapp.com/test/xsstest1/

(其他题目,将xsstest1依次改为xsstest2~xsstest10即可获取)

有兴趣的朋友,可以先不看文章,自己尝试的做一做题目,有答案的话可以发到我的邮箱 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

威努特简介

北京威努特技术有限公司(以下简称“威努特”), 是国内工控网络安全领军企业、全球六家荣获国际自动化协会安全合规学会ISASecure CRT Tool认证企业之一和亚太地区唯一国际自动化学会(ISA)全球网络安全联盟(GCA)创始成员。

威努特作为国家高新技术企业,以创新的“白环境”整体解决方案为核心,自主研发了全系列工控网络安全专用产品,拥有52项发明专利、50项软件著作权、52项原创漏洞证明等核心知识产权。积极牵头和参与工控网络安全领域国家、行业标准制定,受邀出色完成新中国70周年庆典、中共十九大、全国两会等重大活动的网络安保任务,被授予“国家重大活动网络安保技术支持单位”,得到了中央网信办、公安部、工信部等国家政府部门的高度认可。迄今已成功为电力、轨道交通、石油石化、军工、烟草、市政、智能制造、冶金等国家重要行业1000多家工业企业提供了全面有效的安全保障。

威努特始终以“专注工控,捍卫安全”为使命,致力于为我国关键信息基础设施网络空间安全保驾护航!

渠道合作咨询   张先生 18201311186

稿件合作   微信:Luo_xiaoran



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存