当前位置: 首页 > 科技观察

Web安全CSRF及防护方法

时间:2023-03-12 04:49:24 科技观察

Part01●什么是CSRF●CSRF(Cross-siterequestforgery)简称:跨站请求伪造,与XSS攻击一样,危害极大。在CSRF攻击场景中,攻击者会伪造一个请求(这个请求通常是一个链接),然后欺骗目标用户点击。一旦用户点击了这个请求,整个攻击就完成了,所以CSRF攻击也被称为一键攻击。Part02●CSRF和XSS的区别●与XSS相比,XSS利用站点内的可信用户,而CSRF通过伪装可信用户的请求来利用可信网站。从漏洞位置来看(CSRF存在于所有请求-响应模式的函数中,XSS存在于用户输入回显到前端网页的位置);从攻击效果来看(CSRF主要是执行网站本身已有的功能,XSS主要是用来获取cookies)。攻击类型攻击示例描述CSRFhttp://www.hack.com/csrf_page(页面包含src="http://www.bank.com/transferFunds?amount=1500&destinationAccount=123456789")Requestsent是页面黑客网站,目标是银行网站的XSS页面'">http://www.bank.com/xss_page?xss_parameter='>'发送的请求是银行网站的页面,目标是hack网站的页面第03部分●CSRF攻击原理●HTTP是一个无状态协议,服务器只能根据当前请求的参数(包括Head和Body数据)来判断本次请求的目的(Get或Post都一样),服务器不知道请求之前做了什么,这是一个无状态的协议。但是我们在现实中有很多情况需要有状态,比如登录状态的身份信息。网页的很多操作都需要登录b在它可以被操作之前。目前的解决方案是每次HTTP请求都将登录状态信息传递给后台服务器,后台根据登录状态信息判断用户的合法性,然后处理本次请求要处理的操作。如何让每一次HTTP请求都带上登录状态信息,从而出现Cookie。登录状态cookie默认由浏览器自动携带。当我们在浏览器上发送HTTP请求时,浏览器会带上该域名下的cookie发送给服务器。那么问题来了,不管浏览器当前是在哪个网站发送请求,在哪个页面发送请求,只要你请求的域名在浏览器中存有cookie信息,浏览器就会带上它。所以只要用户C登录过A网站,在不关闭浏览器的情况下打开一个黑客网页B,黑客页面向A网站后台发送HTTP请求,就会带上A网站的登录状态cookiedefault,也可以模拟UserC进行增删改查等敏感操作。这就是CSRF攻击的原理。Part04CSRF攻击流程●(1)用户C打开浏览器,访问可信网站A,输入用户名和密码请求登录网站A;(2)用户信息通过验证后,A网站生成cookie信息返回给浏览器,此时用户登录A网站成功,可以正常向A网站发送请求;(3)用户在退出网站A前,在同一浏览器中打开一个标签访问危险网站B;(4)B网站收到用户请求后,返回一些攻击性代码,请求访问第三方站点A;(5)浏览器收到攻击性代码后,根据B网站的请求,在用户不知情的情况下携带cookie信息,向A网站发送请求。(6)A网站并不知道该请求实际是由A网站发起的B,所以会根据用户C的cookie信息,以C的权限处理请求,导致网站B的恶意代码执行。我们可以这样理解:攻击者窃取了用户C的身份,以用户C的名义发送了恶意请求,对于服务器来说,这个请求是完全合法的,但是它完成了攻击者预期的操作,比如以用户C的名义发送邮件,甚至购买商品,转虚拟货币等Part05●CSRF保护方法●1.验证HTTP请求头HTTP请求头默认会携带Referer字段和Origin字段。Referer记录了请求的源地址,Origin记录了请求源的域名。通过判断这两个字段的值,我们可以确认请求是否来自安全站点,从而防止第三方恶意请求。由于Referer值会记录用户的访问源地址,一些用户认为这会侵犯他们的隐私,尤其是一些组织担心Referer值会将一些信息从内部网络泄露到外部网络。因此,用户可以设置浏览器在发送请求时不再提供Referer。当他们正常访问银行网站时,网站会因为请求没有Referer值而认为是CSRF攻击,拒绝合法用户访问。所以推荐使用Origin验证。2.Token机制CSRF保护的重点之一就是验证“用户凭证Token”。通过这种机制,可以判断用户请求的合法性,判断是否是跨站攻击。我们在Token中添加随机字符串和过期时间戳,管理其有效期,并添加签名验证。如果凭证被盗,先判断Token中的“签名”和时间戳是否有效,然后再进行正常的业务处理,通过对非法数据的校验和过滤,降低CSRF攻击的成功率。Token由三部分组成:(1)Message[msg]:消息本身由两部分组成:一个随机字符串和一个过期时间戳。(2)分隔符[separator]:用于分隔msg和加密后生成的签名,“;”在这里使用。(3)签名[signature]:签名是对“msg”采用特定算法加密后的字符串。当用户向服务发送请求时,服务端需要先进行分解,得到msg部分和签名部分,比较签名,判断token是否过期。一旦对请求中携带的token校验异常,就可以判断为可疑行为。不处理。3.自定义请求头中的属性,验证该方法是否也使用token并进行验证。不同的是,token不是作为参数放在HTTP请求中,而是放在请求头中自动定义属性。通过XMLHttpRequest请求封装,可以一次性为所有请求添加自定义属性csrftoken,将token值放入其中。同时,通过XHR请求的地址不会记录在浏览器的地址栏中,不用担心token会通过Referer泄露给其他网站。但是,这种方法非常有限。XHR请求通常用于部分页面的异步刷新。并不是所有的请求都适合这个类发起,通过这类请求得到的页面不能被浏览器记录下来,所以不能进行前进、后退、刷新等操作。给用户带来不便。4、cookieCSRF攻击的SameSite属性是利用cookie中携带的用户信息。为了保护cookie不被第三方网站使用,我们可以设置Samesite属性。SameSite最初是为了防止CSRF而设计的。SameSite有Strict/Lax/None三个值。(1)严格是最严格的。如果SameSite的值为Strict,浏览器将全面禁止第三方。(2)lax是比较宽松的。在跨站的情况下,从第三方站点打开链接和从第三方站点提交Get表单的两种方式都会携带cookies。但是如果在第三方站点使用Post方式,或者通过img、iframe等标签加载的URL,这些场景是不会携带cookie的。(3)如果使用None,无论如何都会发送Cookie数据。为了防止CSRF攻击,我们可以根据实际情况,将一些关键cookies设置为Strict或Lax模式,这样在跨站请求时,这些关键cookies就不会发送到服务器,从而使黑客的CSRF攻击无效。以上是技术层面的保护方法。常用的方法是验证HTTP请求头和Token机制。实际的Web应用程序使用的是WAF(WebApplicationFirewall,例如免费的ShareWAF)。因为CSRF只是众多web攻击中的一种,WAF可以低于大部分攻击,大大提高了网站的安全性。参考文献[1]陈真.CSRF攻击原理分析及对策研究[J][2]https://blog.csdn.net/stpeace/article/details/53512283