这算小BUG,无关安全问题,所以就直接写公众号里了。
首先还是先拜读
https://xz.aliyun.com/t/11682
这篇文章介绍了关于<!--<script>的一个特性,用来绕过一个非常困难的XSS题目。我们都知道,对于反射XSS来说,如果反射点在js当中,比如下面这样。
<script>
var a = '我是反射点';
</script>
我们无需构造那些随着js和反射点增多的复杂payload,只需要简单粗暴的
</script><script>alert(1)</script>
<script>
var a = '</script><script>alert(1)</script>';
</script>
在一般语言来说,想要突破单引号,只有第二个单引号将其闭合才行,但</script>标签闭合显然优先级比单引号更高,于是上述代码被分割成了三段。
<script>var a = '</script>
<script>alert(1)</script>
';</script>
第一段语法不合格被忽视,因此最终只执行了第二段。
由此衍生出了一个特性,也就是你是无法直接打印</script>字符串的。
<script>
alert('</script>')
</script>
而<!--<script>可以突破这个限制。
<script>
alert('<!--<script>');
alert('</script>');
</script>
因为<!--<script>同样有很高的优先级,它会吞掉最下一个</script>使其失效,如果不加后面alert('</script>');,整个js就会被破坏掉。
在源码页面可以看到,原本正常的</script>被视为js代码,完全失效了。
那么这样有什么用呢?通常我们的html页面都是一段script标签,再加一段其他html标签的,如果能在js中插入一段<!--<script>,那么很可能祸害一大堆html代码。
在原文中,就因为该题能控制两个传参,因此将A到B所有的js和html,都当成了反引号引起来的字符串,得以实现XSS。
简化一下就是这样。
<script>var a = '反射点一<!--<script>'+`';
</script>
<img src="反射点二`+alert(1);</script>">
<script>var b ='b';</script>
这样实际上等于。
<script>
var a = '反射点一<!--<script>'
+ `';</script><img src="反射点二`
+ alert(1);
</script>
"><script>var b = 'b';</script>
不过这种XSS的办法还是要求使用单引号或者反斜杠突破var a =''的单引号束缚,但即使无法突破,我们还是可以拿<!--<script>去祸害一下各种网站,看它们是否对<!--<script>进行了额外处理。
比如百度首页,搜索<!--<script>是这样的。
再点一下左边的蓝色百度一下会变成这样。
很显然,两种排版都出问题了,我们查看网页源代码。
<!--<script>被插入到js当中,这代表着它吞掉了很多的代码。如下,很多标签都没有高亮,意味着它们被当成了错误的js代码。
当然,百度还是将单引号反斜杠正斜杠都转义了,这意味着我们无法实现XSS。
考虑到现在就连CTF都几乎没有XSS了,实战中更不可能遇上这么苛刻的东西,所以这似乎又是个没有卵用的文章。
结尾也给一个简单的小题,是我在实战中碰上的一种XSS绕过情况。
<html>
<body>
<?php
$a = $_GET['a'];
$a = str_replace("'","\'",$a);
$a = str_replace("<","<",$a);
$a = str_replace(">",">",$a);
?>
<script type="text/javascript">
if('<?php echo $a;?>' != ''){
var a = '<?php echo $a;?>';
}
</script>
</body>
</html>
有兴趣的自己搭建试一试。