跨站点请求伪造(CSRF)

CSRF的全名是Cross Site Request Forgery,翻译成中文就是跨站点请求伪造。

 

1)CSRF 简介

什么是CSRF呢?我们先看一个例子。

在介绍XSS Payload时那个“删除搜狐博客”的例子,登录Sohu博客后,只需请求这个URL,就能把编号为“156713012”的博客删除。

http://blog.sohu.com/manage/entry.do?m=delete&id=156713012

这个URL同时还存在CSRF漏洞,我们将尝试利用CSRF漏洞,删除编号为“156714243”的博客文件。这篇文章的标题是“test1”。

跨站点请求伪造(CSRF)_第1张图片

攻击者首先在自己的域构造一个页面:

http://www.a.com/csrf.html

其内容为:

使用了一个 标签,其地址指向了删除博客文章的链接。

攻击者诱使目标用户,也就是博客主“test1test” 访问这个页面:

跨站点请求伪造(CSRF)_第2张图片

该用户看到了一张无法显示的图片,再回头看看搜狐博客:

跨站点请求伪造(CSRF)_第3张图片

发现原来存在的标题为“test1”的博客文章,已经被删除了!

原来刚才访问 http://www.a.com/csrf.html 时,图片标签向搜狐发送了一次GET请求:

跨站点请求伪造(CSRF)_第4张图片

而这次请求,导致了搜狐博客上的一篇文章被删除。

回顾整个攻击过程,攻击者仅仅诱使用户访问了一个页面,就以该用户身份在第三方站点里执行了一次操作。这个删除博客文章的请求,是攻击者所伪造的,所以这种攻击就叫做“跨站点请求伪造”。

 

2)GET?POST?

在CSRF攻击流行之初,曾有一种错误的观点,认为CSRF攻击只能有GET请求发起,因此很多开发者都认为只要把重要的操作改成只允许POST请求,就能防止CSRF攻击。这种错误的观点形成的原因主要在于,大多数CSRF攻击发起时,使用的HTML标签是