×

【2022争霸赛*干货满满】网络安全之CSRF攻击与防护
  

莫冷 17091人觉得有帮助

{{ttag.title}}
      哈喽,大家好,纯洁的小莫冷又来给大家科普了
      最近天天加班,都没时间写案例了   
      今天跟大家探讨一下CSRF攻击的原理及对应方案,各位大佬对本文章有什么见解的话还请不吝赐教。
CSRF攻击,又叫做跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
CSRF攻击攻击原理及过程如下:
1.    用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
通俗的讲,就是你在网站B上执行了网站A的操作,这就是典型的CSRF攻击,也就是跨站请求伪造攻击,看到这可能有的小朋友就要问了,我在网站A上的账号密码信息是不存在在网站B上的,那么网站B是如何登录的网站A呢?
到这我需要提醒下各位,网站A是您自己登录的,看上面的攻击过程,1-3步是不是您登录的网站A呢?
还有的同学可能也有疑问,我登录了网站A,访问网站B的时候把网站A关掉不就行了,网站B不就没法操作网站A了?
兄弟,好好想想哦,您在某网站登录时是不是有这么一个选项:7/10天内免登录,而各位是不是为了避免麻烦往往都会勾选这个选项?
这里问题就来了,你一旦设置了免登录,那么网站就会为你开一条绿色通道,届时你无论任何操作都不需要验证,想象一下如果这是银行网站,而你又恰巧点了一个对应的CSRF攻击的网站,那你的钱是不是就可以分分钟被转走了?
当然,例子永远只是例子,银行网站也不可能这么傻,大多数的银行、购物网站都可以完全避免此类攻击,大家可以放心的访问。
CSRF漏洞验证方法
       检测CSRF漏洞其实是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
    当然,也可以使用CSRF攻击测试工具来检测网站是否存在CSRF漏洞,如CSRFTester,CSRF Request Builder等。
CSRF攻击的防御方法
       目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。
   (1)验证 HTTP Referer 字段
       当你访问网站时,除直接访问网站根目录外,访问任何网站都有一个Referer字段,而通常网站根目录是不存在后台处理操作的,你进行的转账、购物等操作都不在根目录处理范围之内,而当你在网站B访问网站A时,你的HTTP请求的Referer字段的值则是你当前的网站B的地址,因此,要防御 CSRF 攻击,网站A只需要对于每一个转账请求验证其 Referer 值,如果是以本地网站请求开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
      这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。
      然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果网站A支持IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 网站A域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。
即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问
     (2)在请求地址中添加 token 并验证
      CSRF攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
      这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden”name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。
该方法还有一个缺点是难以保证token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。
     (3)在 HTTP 头中自定义属性并验证
      这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
然而这种方法的局限性非常大。XMLHttpRequest请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
(4)AF防护CSRF
AF防护CSRF攻击主要是使用的第一种方法,即验证Referer字段,下面为AF防护CSRF攻击操作步骤
首先在对象-安全策略模板-WEB应用防护侧新建模板
然后点击高级配置-CSRF防护,勾选启用
点击新增,输入域名后,点击新增防护列表,输入需要防护的页面(如果是目录则必须以/结尾),输入允许访问的来源列表,此来源即是你点击转账、购物等操作时的页面。
编辑完成之后,保存,然后新建业务防护规则,勾选WEB应用防护,选择新建的规则即可。
好了,今天的分享就到这里了,大家走过路过不要错过,点个赞再走呗

打赏鼓励作者,期待更多好文!

打赏
5人已打赏

339015 发表于 2022-10-17 23:19
  
感谢楼主分享,文章分享了CSRF攻击原理以及AF的防御手段,内容清晰全面,期待更多优秀的分享
天堂之龙 发表于 2022-10-15 16:04
  
每天学习一点,每天进步一点。
沧海 发表于 2022-10-15 20:10
  
感谢楼主无私奉献,学习一下
Mr程 发表于 2022-10-15 22:54
  

每天学习一点,每天进步一点。
临兵斗者 发表于 2023-1-5 10:06
  
学习了,内容总结的很实用。
头像被屏蔽
新手780102 发表于 2023-2-14 10:33
  
提示: 作者被禁止或删除 内容自动屏蔽
蟲爺 发表于 2023-4-6 01:08
  
感谢分享
蟲爺 发表于 2023-4-20 04:46
  
感谢分享
kfkaka 发表于 2024-5-17 09:40
  
每天学习一点,每天进步一点。
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
安全效果
干货满满
西北区每日一问
技术笔记
新版本体验
功能体验
【 社区to talk】
技术咨询
标准化排查
2023技术争霸赛专题
产品连连看
GIF动图学习
信服课堂视频
每周精选
自助服务平台操作指引
秒懂零信任
技术晨报
技术圆桌
通用技术
答题自测
安装部署配置
每日一记
原创分享
玩转零信任
场景专题
升级&主动服务
社区新周刊
POC测试案例
畅聊IT
专家问答
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
故障笔记
排障那些事
高手请过招
高频问题集锦
全能先锋系列
云化安全能力

本版版主

1
3
10

发帖

粉丝

关注

396
142
63

发帖

粉丝

关注

5
7
7

发帖

粉丝

关注

0
1
0

发帖

粉丝

关注

本版达人

新手61940...

本周建议达人

BGP网络

本周分享达人

BGP网络

本周提问达人