目录
推荐一个比较有意思的xss网站XSS Game - Learning XSS Made Simple! | Created by PwnFunction
Ma Spaghet!
代码通过get传参,并且提示在somebody中输入,我们直接在somebody中插入script脚本检测能否运行.
可以看到,我们的script标签插入成功但是却并没有运行,而且在h2标签下是可以运行script脚本的。通过查阅官方文档element.innerHTML - Web API 接口参考 | MDN ,HTML 5 中指定不执行由 innerHTML
插入的 script脚本,官方文档提示,我们可以插入img标签进行绕过。
Jefff
这关的突破口在eval下的模板字符串,eval会将传入的字符串当做做javascript脚本来执行,模板字符串的运行顺序模板字符串 - JavaScript | MDN,这里定义了一个ma,执行语句为eval(`ma="ma name ${插入的语句}"`,如果直接插入alert其实就相当于执行了ma的值而只会显示一个字符串,所以这里必须考虑先将eval(`ma=“${" jeff}"`)中分割,这样做就相当于闭合了前面的ma,让eval直接执行alert。
Ugandan Knuckles
代码过滤掉了尖括号,所以我们想闭合input标签是不可能的,而且调用了innerhtml函数,我们考虑用onclik标签,
但是官方限制no user interaction,所以我们考虑自动对焦来取消互动
Ricardo Milos
代码使用了action,表单的 action 属性是在服务器上提交表单,这个属性可以被检索或者设置,没有过滤限制,所以直接使用JavaScript伪协议绕过。
Ah That's Hawt
本段代码几乎过滤掉了所有可以使用的符号, 所以想闭合标签是不可能的,我们可以考虑使用代码来绕过。这里并没有限制编码,但是我们应该注意一下编码顺序,我们的插入点必须在url网址搜索框中去插入语句,这里识别url编码,而网页面则识别实体编码,所以我们的顺序应该为要将语句插入网页面识别执行,那么你首先得在url搜索框中让它识别url编码,所以得先进行html编码再进行url编码。
本代码过滤掉所有字母大小写,以及数字0-9,我们只能使用工具jsfuck来进行绕过,JSFuck - Write any JavaScript with 6 Characters: []()!+,我们直接编码alert(1337),然后再进行一次URLencode即可绕过。
Mafia
此代码过滤掉了几乎所有可以闭合的符号,以及关键命令alert,而且有长度限制,jsfuck不可取,我们此时可以采用三十进制来解决问题。我们会用到parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。但是注意在插入时虽然它是在eval中执行的但是还是没有执行成功,你需要再添加一个eval,去让外面的eval执行里面的eval(8680439..toString(30))(1),作者的答案中还有两种解法,其中第三种方法利用了window.location.hash这个属性,该接口的hash属性 Location返回一个字符串,该字符串包含一个 '#'后跟 URL 的片段标识符 - URL 试图定位的页面上的ID。parselnt可以参考parseInt - JavaScript | MDN