Skip to content

浏览器安全之 CSRF #13

Open
Open
@myLightLin

Description

@myLightLin

定义

CSRF (Cross-Site Request Forgery)跨站请求伪造,从字面上看,一个是跨站点,表示恶意攻击的请求是来自不同域的;另一个是伪造,表示这个请求并非用户真实意愿发出的,而是通过某种欺骗手段诱使用户去点击从而产生攻击。

一个例子

现在我们有以下两个站点:

假设 a 站点有个文章列表,点击按钮可以删除文章,对应的请求是 www.a.com/article/del?id=1
那么 CSRF 的攻击思路是什么呢?

  • 首先,既然是跨站,那么在 b 站点构造一个 www.b.com/csrf.html 页面
  • 然后,利用 img 标签没有跨域的限制,在页面里放置一张图片 <img src="http://www.a.com/article/del?id=1" />
  • 接下来,还有一个关键点,就是欺骗已经登录网站 a 的用户,来访问 b 站点构造的这个页面,这个时候有了登录态,img 发出请求就会携带 cookie,然后就可以不知不觉地把这篇文章删掉了😱!

上面这种是 GET 请求,另外还有 POST 请求,思路是一样的:例如要在 a 站点新增一篇文章,那就在 b 站点里伪造页面后,使用 JavaScript 构造一个表单, action 地址指向 a 站点新增文章的 api 地址,用户访问后,请求就会携带 cookie,经过身份认证后,就能不知不觉新增一遍文章了。

CSRF 分类

  • HTML CSRF 攻击
  • JSON 劫持攻击
  • Flash CSRF攻击 (Flash 退出历史舞台了,了解就好)

HTML CSRF 攻击简单来说就是请求是由 HTML 元素发出的,比如 img, link, a 这些自带跨域的标签。
JSON HiJacking 攻击就是对 AJAX 请求返回的 json 数据进行劫持,比如某个接口 url 提供了 callback 回调来处理数据,那么利用这个 callback 伪造出 CSRF 请求,对数据进行操纵攻击。

CSRF 的危害

  • 篡改目标网站上的用户数据
  • 传播 CSRF 蠕虫

防范 CSRF

  • 针对跨站问题,可以判断请求来源,具体是优先判断 origin,因为它考虑安全,origin 只包含域名信息;其次是 referrer ,里面包含了详细 path
  • 针对 cookie 被盗用问题,可以对 cookie 设置 Samesite 属性,这个属性支持三个值:
    • Strict:开启严格模式,这种模式下 cookie 在任何时候都不能作为第三方 cookie 来使用
    • Lax:宽松模式,允许部分请求携带 cookie,通常是 GET 请求
    • None:不做啥限制,每次请求都可以携带 cookie 发送
  • CSRF token:既然是通过伪造请求实现攻击,那么可以由服务端下发一个 token 给客户端,客户端妥善保管好它,然后每次请求时携带这个 token ,服务器校验 token 的合法性,以此来区分正常用户请求和非法请求。
  • 对于普通用户来说,不要随便打开一些来路不明的链接,尤其是邮件里收到的一些垃圾邮件

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions