很多朋友私信我,想看XSS绕过实例分析,所以我选了16个BAT的XSS实例来聊聊构造和绕过思路。以下为16道题目(大部分的题都是一题多解,尽量给出多种思路,或者最短的解法。)
http://px1624.sinaapp.com/test/xsstest1/ (其他题目改下标 1~16即可)
有兴趣的朋友,可以先不看文章,自己尝试的做一做题目,有答案的话可以发到我的邮箱 [email protected] 并附上自己的ID。
前面发过的《一些BAT的XSS实例(一)》,主要讲了1~3题的思路,下面来看下后面其他的题。
◇1、先看第四题
这个题属于第三题的升级,蛮多人就卡到这里过不去了。具体代码如下:
可以看到,直接把这里提到的所有运算符都给过滤掉了。
https://www.w3school.com.cn/js/js_operators.asp
那么这个时候运算符全部被过滤了,又应该怎么进行构造,从而绕过限制呢?
我们还是以解题者的角度去看吧,首先肯定是先看源码。
和第三题一样,第一步还是猜参数,很容易得出参数是px,如下图
然后经过一番测试发现,所有的运算符都被过滤掉了,只要出现运算符,直接就会返回error
所以这里我们需要想别的办法,然后可能会想到注释,把多余的部分注释掉就行了,不过这里直接过滤掉了斜线(也就是除号运算符/),所以这个是行不通的,而且由于是同步输出,即使没过滤斜线,这个思路也是很难构造出来的。
那么我们就要思考,这个同步输出的问题,这个特性的话,只能是去找一些前后闭合都一样的去构造,首先立刻就想到了单引号和双引号,这样就可以把中间部分作为字符串去解析了。
像上面这样的思路,这样的话就很容易构造了,但是在js中单引号和双引号这样的字符串中间是不能换行的,如果要换行就必须在行末尾进行转义,如下。
但是这里的环境,显然行末尾是不可能写入反斜线的。其实为了避免解题的人绕路,我这里故意给代码中写入了单引号和双引号,这样即便是代码写在了一行,这个思路也是行不通的,因为中间的引号没法进行转义。
这里其实给的暗示,是让解题者去往模板字符串去联想,具体参考下面的链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings
模板字符串中间是可以包含换行的,所以构造就很简单了,只需要用模板字符串将中间变为字符串解析,然后再进行一定的构造就可以了。
那么按照这个思路,我们先写入一个模板字符串进去。
如上图,先用单引号闭合掉前面的单引号,分号隔开,再写入模板字符串,这样的话就可以很直观的看到,只需要构造后面22222222位置的语法正确就可以了。
由于这个位置后面有 ')} 所以只需要构造闭合即可。方法有很多种,这里随便给出一种,这里是把alert(1)作为$函数的参数去执行的。
再给出目前最短的gainover的解法。【13个字符】
然后此题w8ay和Huuuuu还给出了另一个思路的解法。那就是直接用in去进行构造,如下:
查了下资料才知道,原来in也是一个运算符,之前的
https://www.w3school.com.cn/js/js_operators.asp 不给力,没有覆盖到。
可以参考这里
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference
所以这个题,也可以用in和instanceof,这些知识在我出题的时候,我自己也是不知道的。
虽然说用这个的话控制台会报错,因为放在这里使用的话,数据类型是错误的。但是语法结构是没问题的,而且由于解析顺序,并不会影响alert(1)的执行。
◇ 2 下面来看看第五题
首先还是看下源码
这里我设计一个考点(坑点),也就是这个页面直接访问会跳转。如果没太注意的话,就会直接跳转到php页面,然后没发现这个html页面的话,解题者后续所有的测试将都会在php页面去测试,那么这个题不管怎么测试都是徒劳。
因为php页面的代码其实很简单,就是一个类似jsonp的页面而已。这个考点(坑点)据说考住(坑掉)了蛮多人。
页面中调用了index.js 主要是用来获取url参数用的。
然后可以看到,htm页面的源码里有个document.write写入script标签的操作,这里可以利用这两个参数去改变script标签中src的值,所以我们只需要找到一个路径,可以用参数控制并调用,其中含有alert(1)的文件即可。
再去看这个php文件,这样就有了上述需要的文件了。
思路梳理通了,所以就很容易有答案了,只需要按照代码中的传参逻辑,去拼接出文件路径就可以了。
这个考点其实以前“心伤的瘦子”写过专栏,不过可能很多人没细看,或者没看懂。
那些年我们一起学XSS - 12. Dom Xss进阶 [路径con]https://cloud.tencent.com/developer/article/1541071
◇ 3 下面来看看第六题
首先还是有和第五题一样的跳转的点,看似和第五题差不多,参数由2个变成了1个,去掉了第五题路径中的问号字符。然后参数做了次URL解码操作。看着貌似和第五题没啥区别,那么试试先?就会发现这个题设计的没有那么简单的。
首先还是和第五题类似的思路,构造下路径,然后把可以执行js代码的php文件放进去就可以了。
然后这里没有问号,那就去放个问号进去吧,放进去后发现不行,会直接跳转。断点调试可以看到,参数居然直接变成空字符串了。
然后想的肯定是不允许问号,那就用%3f编码下,然后当你一番构造后去验证,会发现还是不行,百分号没了。
那就挺懵了,一番调试后,感觉明明没问题啊,为什么会跳转?真是BUG啊~
一番郁闷后,应该会去看源码。
看了源码后发现,原来是把问号给过滤掉了,为了防止url编码绕过,这里%号也给过滤掉了。后面的代码的作用就是,对参数进行了校验,如果不符合条件就会返回空,所以就会跳转到php页面了。
那么这个情况我们应该怎么样去构造绕过呢?如果这是你遇到的实例,可能你会觉得这里的防御没问题,所以也就放弃了,那么你将会错过一个XSS漏洞。
具体细节,关注公众号等待后面的精彩解析吧。
尾 巴
目前最新情况是,大部分的人做出来了1~3题,然后卡到第4题这里,还有蛮多人做出来了1~5题,卡到了第6题。其实卡住了的话,是可以跳着去做其他题的,因为整体来看,第6题应该是最难的了。
ID:gainover 解出了全部10题。并且是目前唯一解出第6题的人,以及第4题给出了目前最短payload的解法(13个字符)。
ID:香草 解出了1~4题,以及7~10题。并且给出了通杀9和10的payload。
ID:p1g3、zeddy、Huuuuu 、w8ay 解出了1~5题。p1g3、zeddy、Huuuuu 还做出来了7~8题,但是三人的第8题给的答案,都不能过xss filter。
ID:w8ay、Huuuuu第4题给出了不同于其他人的解法。
ID:zeddy第7题给出了不同于其他人的构造思路。
其他已经做出未被提及的,可以将自己的答案和ID发我qq邮箱:px1624.qq.com