44. CSRF 攻击与防御

Posted 全端学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了44. CSRF 攻击与防御相关的知识,希望对你有一定的参考价值。

CSRF 是 Cross Site Request Forgery 的缩写,中文意思是跨站请求伪造,这个漏洞往往能给用户带来巨大的损失,但是在实际的网站中,很多都没有做 CSRF 的防御,本文就带大家来了解一下 CSRF 的攻击原理与防御办法。

举个栗子

假如小明需要使用在线支付业务,支付网站的域名为 http://www.my-pay.com,支付网站提供了一个在线支付的功能页面,源代码片段如下:

<form method="post" action="/pay"> <input type="text" name="account"/> <input type="text" name="money"/> <input type="submit" value="支付"/></form>

页面提供了一个表单,表单中有两个输入框,一个输入对方账户,一个输入支付金额,还有一个支付按钮。小明登录了支付网站,输入对方账户(xiaohong)及支付金额(199),点击支付按钮,向支付网站的后端发送请求,比如请求内容为:

POST http://www.my-pay.com/pay HTTP/1.1Host: www.my-pay.comCookie: JSESSIONID=1234567890Content-Type: application/x-www-form-urlencoded
account=xiaohong&money=199

请求成功后,小明账户中的 199 元就支付进入了 xiaohong 账户中。(当然实际的支付网站不会这么简单,业务会更加复杂,也会更安全)

小明支付成功后,并没有退出支付网站的登录,这时,他看到另一个网页中(诱导页面)有“领取支付红包 15.37 元”的按钮,这个按钮的背后其实是这样一段代码片段:

<form method="post" action="http://www.my-pay.com/pay"> <input type="hidden" name="account" value="黑客的账户"/> <input type="hidden" name="money" value="1999.00"/> <input type="submit" value="领取支付红包 15.37 元"/></form>

可以看到,在表单中的账户及金额都是被隐藏起来的,只显示一个“领取支付红包 15.37 元”的按钮,当小明忍不住冲动的点击了一下这个按钮时,会发生什么呢?

小明本来是想“领取支付红包 15.37 元”,结果却是向黑客支付了 1999 元,这就是典型的 CSRF 攻击。

攻击原理

将上述例子使用如下图示来描述:

一个典型的 CSRF 攻击流程是这样的:

  1. 受害者登录受信网站 A
  2. 网站 A 将用户的登录凭证保存到客户端浏览器的 cookie
  3. 攻击者引诱受害者访问黑客站点 B
  4. 黑客站点 B 向受害者发送一个伪装页面,页面中包含要求访问站点 A 的代码片段
  5. 受害者打开伪装页面(或者点击页面中的某个按钮)触发对站点 A 的访问,这时浏览器会携带受害者在 A 域下 cookie 中保存的登录凭证到站点 A 的服务器
  6. 站点 A 接收到请求后,对请求进行验证,并确认是受害者的登录凭证,误以为是受害者自己发送的请求
  7. 站点 A 以受害者的名义执行了攻击操作
  8. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让站点 A 执行了自己定义的操作,使受害者蒙受损失

这就是 CSRF 攻击的原理,如果你网站中的用户没有退出登录,攻击者就可以利用这些用户伪造请求,并发送一些敏感的操作请求,比如:支付、转账、购物等,那么将为你网站的用户带来巨大的损失。

防御措施

CSRF 通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对 CSRF 的防御能力来提升安全性。

通过 CSRF 攻击原理的介绍,我们知道 CSRF 有两个特点:

  • CSRF(通常)发生在第三方域名
  • CSRF 攻击者不能获取到 cookie 等信息,只能使用

可针对 CSRF 的这两个特点,专门制定防御策略,通常有如下几种方式:

  • 阻止不明外域的访问
  • 同源检测:在请求头中携带 Origin HeaderReferrer Header 以便判断是否为同源请求
  • Samesite Cookie:当 Samesite Cookie被设置为 Strict 时,浏览器在任何跨域请求中都不会携带Cookie,新标签重新打开也不携带,所以说 CSRF 攻击基本没有机会
  • 提交时要求附加本域才能获取的信息
  • CSRF Token:要求所有的用户请求都携带一个 CSRF 攻击者无法获取到的 Token,服务器会校验请求是否携带正确的 Token
  • 双重 cookie 验证:在用户访问网站页面时,向请求域名注入一个内容随机的 Cookie,当前端向后端发起请求时,取出 Cookie,并添加到 URL 的参数中,由后端接口验证 Cookie 是否一致

对这些防御措施,在此就不一一展开了,如果大家对防御措施感兴趣,可自行查阅相关文档。

以上是关于44. CSRF 攻击与防御的主要内容,如果未能解决你的问题,请参考以下文章

CSRF的攻击与防御

CSRF攻击与防御

CSRF攻击与防御

CSRF攻击与防御

六十五:CSRF攻击与防御之CSRF防御之form表单防御

csrf攻击与csrf防御