CSRF漏洞攻击原理及防御方案
一.CSRF介绍
CSRF(Cross-site request forgery)全称“跨站请求伪造”,也被称为“One Click Attack”或者“Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往更加难以防范。
可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义进行某些非法操作。CSRF能够使用你的账户发送邮件,获取你的敏感信息,甚至盗走你的账户。
二.CSRF的危害
1、篡改目标网站上的用户数据;
2、盗取用户隐私数据;
3、作为其他攻击向量的辅助攻击手法;
4、传播 CSRF 蠕虫。
三.CSRF攻击原理及过程
如上图所示,CSRF攻击攻击原理及过程如下:
1. 用户打开浏览器,访问受信任银行网站A,输入用户名和密码请求登录网站;
2.在用户信息通过验证后,网站产生Cookie信息并返回给浏览器,此时用户登录网站成功,可以正常发送请求到网站;
3. 用户未退出银行网站之前,在同一浏览器中,打开一个TAB页访问其他网站B;
5. 多数情况下,浏览器接收到这个url 请求会失败,因为它要求用户的认证信息。但是,如果用户还未退出网站A,或者当时恰巧刚访问网站A不久,他的浏览器与网站A之间的session 尚未过期,浏览器的cookie 之中含有用户的认证信息。这时,悲剧发生了,这个url 请求就会得到响应,黑客就能以用户的权限修改密码,且用户毫不知情。
CSRF攻击的本质原因:
CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
四.CSRF的特点
➢攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
➢攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
➢整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
➢跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
五.CSRF漏洞利用
利用DVWA靶场进行CSRF漏洞演练:
修改密码为123456,点击change,网页url中暴露出要修改的密码,并且能够发现url的构造如下:
http://127.0.0.1/dwva/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#
为此,我们可以利用漏洞,构造链接:
http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change
诱导受害者点击这个页面,当受害者进入这个页面时,就已经受到了csrf的攻击。
当他重新登录时会发现用自己修改的密码(123456)登录不上
用攻击方设定的密码(111)就可以成功登陆。
六.CSRF防御方案
1.检验HTTP Referer来源
3.在 HTTP 头中自定义属性并验证
4.设置验证码
5.尽量使用POST接口,限制GET接口
下面就分别对这5种策略进行详细介绍:
①检验HTTP Referer来源:
但是即使这样,验证 HTTP Referer 字段 这种方式也存在安全隐患:
1.对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值
2.用户自己可以设置浏览器使其在发送请求时不再提供 Referer
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对。
③在 HTTP 头中自定义属性并验证
④验证码
在发送请求前先需要输入基于服务端判断的验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。
但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。
⑤尽量使用POST接口,限制GET接口
GET接口太容易被拿来做CSRF攻击,只要构造一个链接,便可以进行CSRF攻击。接口最好限制为POST使用,降低攻击风险。
当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
关于美创
杭州美创科技有限公司,敏感数据保护和数据安全领域的拓荒者和领导者,由国内多名数据库资深专家携手于2005年成立,产品及服务覆盖数据安全、数据管理、容灾备份、智能运维等四大领域,广泛应用于医疗、教育、金融、政府、人社、电力能源、物流交通、企业等众多行业。多年来,凭借卓越的技术创新与良好的用户口碑,美创多次入围全国网络安全50强,并参与多项国家及行业标准的编写,引领数据安全领域的规范发展。目前,美创科技已全面推动全国市场化发展战略,相继在北京、广州、武汉、南京、成都、上海等地设立分公司,致力于为更多的客户提供专业的安全解决方案。