什么是CSRF

跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

CSRF和XSS的区别

  • xss利用站点内的信任用户,盗取cookie。
  • csrf通过伪装成受信任用户请求受信任网站

CSRF漏洞原理

一个用户正常访问登陆一个网站(A)之后,用户会存下A的cookie。当用户未退出网站并在同一浏览器中去访问恶意网站(B)。B发出向A的请求,浏览器接收到这个请求之后,会带上A的cookie去请求A。A不知道这是B的恶意请求,会根据用户的cookie信息和权限处理这个请求,这样就导致B的恶意请求被执行。

image.png

利用目标用户的合法身份,以目标用户的名义执行某些非法的操作。

eg.

假设去登陆一个网站

image.png

登陆成功之后,我们这个用户拥有更改密码的权限。

image.png

更改密码

image.png

image.png

这就是浏览正常网站的操作流程。

修改密码的链接 http://localhost//testinfo/update.php?user=aaa&passwd=456

构造恶意链接 http://localhost//testinfo/update.php?user=aaa&passwd=123456

然后我们在去访问这个恶意链接

image.png

代码示例

1
2
3
4
5
6
<?php 
//会话验证cookie 确保用户登陆
$user=$_GET["user"];
$passwd=$_GET["passwd"];
//更改密码
?>

CSRF利用条件

  • 用户已经登陆
  • 用户访问对应url

漏洞利用的一些技巧

  1. 链接利用
  2. img标签利用
  3. iframe利用
  4. css-background利用

iframe标签内容将在页面加载过程中自动进行加载,src指向的位置就是页面请求的地址。

注意:iframe加载会出现白框,可以设置iframe的style->display:none,来不显示iframe加载内容。

可以利用css中background样式中的url来加载远程机器上的内容,从而对url中的内容发送http请求。

eg.

1
2
3
body{
background:#00FF00 url(a.gif);
}

PSOT型CSRF可以设置表单用于提交,使用hidden属性来隐藏。

1
<input type="hidden" name="user" value="123456">

CSRF防御措施

  • 二次验证(js验证)取决于用户,不建议使用
  • http referer头
  • 设置token
  • http自定义头