Csrf
简介
-
Cross-site request forgery)跨站请求伪造:也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。通过伪装来自受信任用户的请求来利用受信任的网站。
-
在跨站请求伪造(CSRF)攻击里面,攻击者通过用户的浏览器来注入额外的网络请求,来破坏一个网站会话的完整性。而浏览器的安全策略是允许当前页面发送到任何地址的请求,因此也就意味着当用户在浏览他/她无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。
-
说白一点儿就是可以劫持其他用户进行一些请求,但与XSS不同,XSS是利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。举个最简单的例子,比如直接请求‘http://a.com/del.php?id=1’可以删除id为1的账号,但只有管理员有这个权限,于是,有人在其他某个网站页面加入‘’再把这个页面发送给管理员,只要管理员打开这个页面,浏览器就会利用当前登录的管理员的权限发出这个请求,就能删掉账户。
原因
- csrf漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态。而在这个期间,攻击者发送了构造好的csrf脚本或包含csrf脚本的链接,可能会执行一些用户不想做的功能(比如是添加账号等)。这个操作不是用户真正想要执行的。
利用条件
- 了解站点
- 具有当前cookie
- 目标站点没有对用户第二授权
CSRF 类型
按请求类型,可分为 GET 型和 POST 型。
按攻击方式,可分为 HTML CSRF、JSON HiJacking、Flash CSRF 等。
HTML CSRF
利用 HTML 元素发出 CSRF 请求,这是最常见的 CSRF 攻击。
HTML 中能设置 src/href
等链接地址的标签都可以发起一个 GET 请求,如:
<link href="">
<img src="">
<img lowsrc="">
<img dynsrc="">
<meta http-equiv="refresh" content="0; url=">
<iframe src="">
<frame src="">
<script src=""></script>
<bgsound src=""></bgsound>
<embed src=""></bgsound>
<video src=""></video>
<audio src=""></audio>
<a href=""></a>
<table background=""></table>
......
还有 CSS 样式中的:
@import ""
background:url("")
......
也可使用表单来对 POST 型的请求进行伪造。
<form action="http://www.a.com/register" id="register" method="post">
<input type=text name="username" value="" />
<input type=password name="password" value="" />
</form>
<script>
var f = document.getElementById("register");
f.inputs[0].value = "test";
f.inputs[1].value = "passwd";
f.submit();
</script>
Flash CSRF
Flash 也有各种方式可以发起网络请求,包括 POST。
import flash.net.URLRequest;
import flash.system.Security;
var url = new URLRequest("http://target/page");
var param = new URLVariables();
param = "test=123";
url.method = "POST";
url.data = param;
sendToURL(url);
stop();
Flash 中还可以使用 getURL
、loadVars
等方式发起请求。
req = new LoadVars();
req.addRequestHeader("foo", "bar");
req.send("http://target/page?v1=123&v2=222", "_blank", "GET");
浏览器的cookie机制
- 分为持久性和临时cookie,区别在于持久性发送时制定了时效,即Expire字段
示例
- 搭建好环境后可以使用burp来构造HTML文件
检测
手工检测
- CSRF只能通过用户的正规操作进行攻击
- 先检测比较敏感的功能如修改密码,发表留言,转账等
- 编写CSRF POC 构造HTML去实验
工具检测
- CSRFTester
防御
- 二次确认
- 类似于二次验证码等
- Token验证
- 通常在cookie中存储
- 详细步骤如下
- 每次登陆随机生成一段字符串,并存储于Session中
- 在敏感操作中加入隐藏标签,value即为Session中保存的字符串
- 提交请求后,对比token值
- 更新token值
注意
- 测试CSRF的时候需要考虑浏览器问题,每一个浏览器的cookie机制是不完全相同的