[点晴永久免费OA][转帖]计算机网络知识----网络安全----CSRF(跨站请求伪造 )
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
一、简介跨站请求伪造攻击,英文全称是Cross-site request forgery,简称为CSRF。 攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。 CSRF 攻击的本质:本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充。 如何攻击从简介中我们得知,攻击者需要诱导用户进入一个第三方网站。
从总结中可以看出,若想完成CSRF攻击,要同时满足2各条件
总结来说天时地利人和。 二、CSRF攻击分类2.1 GET 类型的 CSRFGET 类型的 CSRF 利用非常简单,只需要一个 HTTP 请求,一般这样使用 假设:网站A,银行账户转行,通过GET请求来完成 危险网站B,其中有一段代码 <img src="http://mybank.example/transfer?account=ying&for=hacker&money=10000"> 若这时候访问了网站B,黑客将转账的请求接口隐藏在 img 标签内,欺骗浏览器这是一张图片资源。当该页面被加载时,浏览器会自动发起 img 的资源请求,如果服务器没有对该请求做判断的话,那么服务器就会认为该请求是一个转账请求,于是用户账户上的 10000 就被转移到黑客的账户上去了。 2.2 POST类型的 CSRF还以上面的转账为例子进行说明 <form action="http://mybank.example/transfer" method=POST> <input type="hidden" name="account" value="ying" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script> 若访问了该页面,表单会自定提交。相当于进行了一次POST请求。 POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。 2.3 链接类型的CSRF这点通俗来说,就是点击了危险网站的链接。通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招。 <a href="http://mybank.example/transfer?account=ying&for=hacker&money=10000" taget="_blank"> 惊喜惊喜,快来领取!! <a/> 三、防御3.1 同源检测CSRF大多来自第三方网站,那么我们就直接禁止外域(或者不受信任的域名)对我们发起请求。 在HTTP协议中,每一个异步请求都会携带两个Header,用于标记来源域名:
这两个Header在浏览器发起请求时,大多数情况会自动带上,并且不能由前端自定义内容。 服务器可以通过解析这两个Header中的域名,确定请求的来源域。 使用Origin Header确定来源域名在部分与CSRF有关的请求中,请求的Header中会携带Origin字段。字段内包含请求的域名(不包含path及query),如果Origin存在,那么直接使用Origin中的字段确认来源域名就可以。 但是会有2种特殊情况,Origin是不存在的:
使用Referer Header确定来源域名根据HTTP协议,在HTTP头中有一个字段叫Referer,记录了该HTTP请求的来源地址。 这种方法并非万无一失,Referer的值是由浏览器提供的,虽然HTTP协议上有明确的要求,但是每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不是很安全。在部分情况下,攻击者可以隐藏,甚至修改自己请求的Referer。 在以下情况下Referer没有或者不可信:
因此,服务器的策略是优先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际情况判断是否使用 Referer 值,从而增加攻击难度。 无法确认来源域名情况如果 Origin 和 Referer 都不存在,建议直接进行阻止,特别是如果您没有使用随机 CSRF Token(参考下方)作为第二次检查。 如何阻止外域请求通过Header的验证,我们可以知道发起请求的来源域名,这些来源域名可能是网站本域,或者子域名,或者有授权的第三方域名,又或者来自不可信的未知域名。 我们已经知道了请求域名是否是来自不可信的域名,我们直接阻止掉这些的请求,就能防御CSRF攻击了吗? 且慢!当一个请求是页面请求(比如网站的主页),而来源是搜索引擎的链接(例如百度的搜索结果),也会被当成疑似CSRF攻击。所以在判断的时候需要过滤掉页面请求情况,通常Header符合以下情况: Accept: text/html Method: GET 但相应的,页面请求就暴露在了CSRF的攻击范围之中。如果你的网站中,在页面的GET请求中对当前用户做了什么操作的话,防范就失效了。 例如,下面的页面请求: GET https://example.com/addComment?comment=XXX&dest=orderId 注:这种严格来说并不一定存在CSRF攻击的风险,但仍然有很多网站经常把主文档GET请求挂上参数来实现产品功能,但是这样做对于自身来说是存在安全风险的。 另外,前面说过,CSRF大多数情况下来自第三方域名,但并不能排除本域发起。如果攻击者有权限在本域发布评论(含链接、图片等,统称UGC),那么它可以直接在本域发起攻击,这种情况下同源策略无法达到防护的作用。 综上所述:同源验证是一个相对简单的防范方法,能够防范绝大多数的CSRF攻击。但这并不是万无一失的,对于安全性要求较高,或者有较多用户输入内容的网站,我们就要对关键的接口做额外的防护措施。 3.2 CSRF TokenCSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。 CSRF Token 原理
我们需要知道的是:
3.3 双重 Cookie 认证
3.4 Samesite Cookie 属性Google起草了一份草案来改进HTTP协议,那就是为Set-Cookie响应头新增Samesite属性,它用来标明这个 Cookie是个“同站 Cookie”,同站Cookie只能作为第一方Cookie,不能作为第三方Cookie,Samesite 有两个属性值,Strict 为任何情况下都不可以作为第三方 Cookie ,Lax 为可以作为第三方 Cookie , 但必须是Get请求 参考: 3.5 其他方法验证码和密码被认为是对抗CSRF攻击最简洁而有效的防御方法。 四、总结4.1 CSRF攻击特点
CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
4.2 与XSS的区别本质来说:
该文章在 2023/5/17 16:37:45 编辑过 |
关键字查询
相关文章
正在查询... |