web安全之 CSRF 攻击

什么是CSRF

CSRF定义: 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
CSRF 利用的是网站对用户网页浏览器的信任。服务器只能确定请求是从用户浏览器发出的,而不能确定是用户自愿发出的,CSRF就是利用了这个漏洞。
完成CSRF攻击的前提有两个:

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

CSRF实现

通过get请求攻击

假如现在有一个目标网站a,需要用户名密码登录。网站有一个get接口 a.example.com/sendMoney?for=xxx&number=888 这个接口的作用是向xxx用户转账number元。那么我们就可以诱导用户点击伪装的正经网站b,b网站中隐藏着向该转账接口发请求的代码,如

通常用户登录后,系统会保存用户登录的session值(可能是用户手机号、账号等),在用户打开b网站后,会发送一条转账的请求,如果a网站的session还在有效期内,这条请求就会附带上session值,从而骗过服务器,转账成功。

通过post请求攻击

假如我们想要伪装成用户,访问一个接口,但这个接口限制了只能通过post方法访问,这个时候就做一个第三方的页面,但里面包含form提交代码,然后通过QQ、邮箱等社交工具传播,诱惑用户去打开。只要用户之前打开过我们的目标网站,就中招了。
注意事项:

  • 调用其他网站接口会有跨域的问题,但在web页中调用任何js都不受跨域限制(历史原因)。
  • 表单 本质上是post发送到服务器的键值对
  • 诱导用户点击的页面需要足够隐藏性。

展示给用户的页面如下:

页面中隐藏的页面如下:

  • 嵌在iframe中,防止页面submit后跳走,增加隐蔽性。

CSRF的防护

CSRF攻击是黑客伪装成用户,利用Web的隐式身份验证机制,黑客利用已经存储的session向服务端发送请求,但无法看到具体的session数据,也无法对服务端返回的数据进行处理。因此,只需要对能够影响服务端数据的请求进行CSRF防护。

  • 无序列表可以更改数据库的请求,用post请求替代get
  • 验证document.referer
  • 在请求地址中添加 token 并验证
  • 客户端加密,服务端解密
  • Chrome浏览器端启用SameSite cookie
评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复