重新研究一下CSRF的攻击与防御

CSRF

定义:

跨站请求伪造

挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法

对比XSS: 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

1
2
3
4
5
1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

要被CSRF攻击,必须同时满足两个条件:

1
2
1. 登录受信任网站A,并在本地生成Cookie。
2. 在不登出A的情况下,访问危险网站B

GET型CSRF

乌云社区某删除功能存在CSRF漏洞(简单利用需诱骗管理员触发)

https://wooyun.website/show.php?uid=S8XttXpbELTcgJTjRpr0Gq6dLdNmnRagM9rJmzPt

新浪微博某处小功能存在CSRF漏洞(可修改用户微博某元素)

https://wooyun.website/show.php?uid=6HimWDmTrwk2d0kEhtwey5NJihxQEID4pPWgrsWp

POST型CSRF

中国网络电视台官方CSRF刷微博粉

https://wooyun.website/show.php?uid=pmxEDefy2wx977fTMeNj9NCHGkxJ5eTMh3pUlXPh

新浪微博csrf刷粉丝

https://wooyun.website/show.php?uid=eUTLauXnYMYB2oRcmcV6F4krh3q0HyGJF9IcMnyC

补充一点东西

GET CSRF使用方法

GET请求不一定必须限制为FORM表单,JS请求进行提交,img、iframe、link等标签,css属性都可以进行GET请求

1
2
3
4
5
6
7
8
9
10
11
12
13
1. script标签利用
<a href="恶意CSRF_URL">请点击我
2. iframe利用
<iframe src="恶意CSRF_URL"></iframe>
3. img标签利用
<img src="恶意CSRF_URL"/>
远程加载图片,这个利用点一般在引入远程图片时,例如 头像
4.link标签利用
<link rel="stylesheet" type='text/css' href="恶意CSRF_URL">
4. CSS - backgroud利用
利用 CSS中 background样式中的url来加载远程机器上的内容,从而对url中的内容发送HTTP请求
body
{background:url("恶意CSRF_URL");}

CSRF蠕虫

音悦台一处CSRF(2)[已经证明可构造蠕虫]

https://wooyun.website/show.php?uid=0uuWjJIpThFyMfSHQaiWRvV9YutUbbnmD9NAz6MD

XSS+CSRF组合拳

普通的CSRF需要诱导受害者点击构造的CSRF连接,但当CSRF与XSS组合之后,就能实现无意识的攻击了

壹心理存储型XSS+CSRF造成蠕虫攻击

https://wooyun.website/show.php?uid=wWfl0XRqzAeneYfhEsjb0tmnQ71JE6xqubtOH5kl

在业界目前防御 CSRF 攻击主要有四种策略

  1. 验证 HTTP Referer 字段;
  2. 在请求地址中添加 token 并验证;
  3. 在 HTTP 头中自定义属性并验证;
  4. Chrome 浏览器端启用 SameSite cookie

对于绕过的方法,之后再讲