CSRF 跨站请求伪造

https://tech.meituan.com/2018/10/11/fe-security-csrf.html

CSRF 攻击的全称是跨站请求伪造( cross site request forgery),是一种对网站的恶意利用,尽管听起来跟 XSS 跨站脚本攻击有点相似,但事实上 CSRF 与 XSS 差别很大,XSS 利用的是站点内的信任用户,而CSRF 则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。 CRSF 能做的事情包括利用你的身份发邮件、发短信、进行交易转账等,甚至盗取你的账号。

CRSF攻击原理

Drawing
CRSF攻击原理

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

一个典型的CSRF攻击有着如下的流程:

  • 受害者登录a.com,并保留了登录凭证(Cookie)。

  • 攻击者引诱受害者访问了b.com

  • b.coma.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.comCookie

  • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。

  • a.com以受害者的名义执行了act=xx

  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。

CSRF 示例

GET类型的CSRF

假设,你登录了某银行网站(bank.com),该银行系统使用 GET 请求处理转账,其中包含几个参数(收款人、转账金额),HTTP 请求地址可能如下所示:

http://bank.com/transfer?recipient=zs&amount=10

该请求还包含一个会话Cookie,用于标识当前账户的持有人,以便银行知道从哪里取款。

现在,你在没有退出该银行系统的情况下,访问了某钓鱼网站,在钓鱼网站中有这样了一段恶意代码:

<img src="http://bank.com/transfer?recipient=ls&amount=10" alt="恶意攻击图片"/>

当你访问这个页面时,页面上的<img>标签需要浏览器发起一个新的HTTP请求,以获得图片资源,当浏览器发起请求时,请求的就是该银行的转账地址,同时还携带了你在银行系统的Cookie信息,银行服务器在收到这个请求后,会认为这是一次转账操作,从而完成转账操作。

POST类型的CSRF

这种类型的CSRF利用起来通常使用的是一个自动提交的表单,如:

 <form action="http://bank.com/transfer" method=POST>
    <input type="hidden" name="recipient" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
</form>
<script> document.forms[0].submit(); </script> 

访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。

POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。

链接类型的CSRF

链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:

  <a href="http://bank.com/transfer?recipient=ls&amount=10" taget="_blank">
  重磅消息!!
  <a/>

由于之前用户登录了信任的网站A,并且保存登录状态,只要用户主动点击来该链接,就会造成财产的损失。

CSRF 特点

  • 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。

  • 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作,而不是直接窃取数据。

  • 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。

  • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

CSRF 防御

最后更新于

这有帮助吗?