首页 > 编程知识 正文

jsonp跨域原理,csrf访问行为是什么意思

时间:2023-05-03 10:07:25 阅读:111053 作者:4068

1 CSRF概念*

CSRF要求在站点之间伪造(Cross—Site Request Forgery ),具有很大的危害性,可以理解为:

攻击者窃取了你的身份,并以你的名义发送了恶意请求。 对于服务器来说,此请求完全合法,但攻击者期望的操作已完成。 例如,以你的名义发送邮件、发送消息、窃取你的账户、添加系统管理员、购买商品、用虚拟货币汇款等。 其中,Web A是存在CSRF漏洞的网站,web是攻击者构建的恶意网站,User C是Web A网站的合法用户。

2 CSRF攻击原理用户c打开浏览器,访问可信网站a,输入用户名和密码要求登录网站a;

验证用户信息后,站点a生成cookie信息并将其返回给浏览器。 此时,用户可以成功登录站点a,并向站点a正常发送请求

在用户未退出站点a之前,在同一浏览器中打开选项卡页以访问站点b

网站b收到用户的请求后,返回几个攻击性代码,发出请求访问第三方网站a的请求

浏览器收到这些攻击性代码后,根据网站b的要求,在用户不知情的情况下携带cookie信息,向网站a发出请求。 因为站点a不知道该请求其实是由b完成的,所以基于用户c的cookie信息,用c的权限处理该请求,从站点b执行恶意代码。

请注意,通过:html标记的src属性启动的请求不遵循相同的策略。

受害者温柔的豌豆在银行有存款,会在银行网站上请求http://bank.example/withdraw吗? Account=bob amount=1000000 For=bob2可以将温柔豌豆为1000000的存款转移到bob 2的账户中。 通常,当请求提交到站点时,服务器首先验证请求是否来自合法的session,然后session用户的温柔豌豆成功登录。

黑客Mallory自己在这家银行有账户,他知道可以通过上述URL转账。 Mallory可以自己向银行发送请求。 http://bank.example/withdraw? account=bob amount=1000000 for=mallory。 然而,该请求来自Mallory而不是慈爱的豌豆,因为他无法通过安全认证,该请求不起作用。

这时,Mallory考虑了使用CSRF的攻击方法,首先自己制作了网站,在网站中放入了以下代码。 “http://bank.example/withdraw? “account=bob amount=1000000 for=mallory”,然后通过广告等引诱他吃温柔的豌豆的网站。

当温柔的豌豆进入该网站时,上述url将从温柔的豌豆浏览器发送到银行,该请求将与温柔的豌豆浏览器的cookie一起发送到银行服务器。

在大多数情况下,这个要求会失败。 因为他要求慈爱的豌豆的认证信息。 但是,如果温柔的豌豆碰巧访问了他的银行,而他的浏览器和银行网站之间的session还没有过期,那么浏览器的cookie就会包含温柔的豌豆凭据。 就在这个时候,发生了悲剧。 这个url请求可以接受。 钱会从慈爱的豌豆账号转移到Mallory的账号,但慈爱的豌豆当时不知道。

后来,温柔的豌豆发现账户里的钱不多了。 即使他去银行查日志,也只能发现他确实通过本人的合法请求转移了资金,没有被攻击的痕迹。 Mallory可以拿到钱自由。

3 CSRF漏洞检测检测CSRF漏洞是一项比较繁琐的工作。 最简单的方法是捕获成功请求的包,删除Referer字段,然后重新提交。 如果这个提交还有效,就可以判断基本上存在CSRF漏洞。

随着对CSRF漏洞研究的深入,CSRFTester、CSRF Request Builder等专门用于检测CSRF漏洞的工具层出不穷。

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下。 使用CSRFTester进行测试时,必须首先捕获浏览器访问的所有链接和所有表单等信息,在CSRFTester中修改并重新提交相应的表单等信息,这相当于伪造客户端请求如果更改的测试请求被web服务器成功接受,则存在CSRF漏洞。 当然,这个工具也可以用于CSRF攻击。

4CSRF攻击的防御目前,防御csrf攻击主要有三种策略。 验证HTTP Referer字段; 在请求中添加token并进行验证; 在HTTP标头中定制和验证属性。

4.1确保HTTP referer字段基于http协议。 在HTTP头部有referer字段,记录有HTTP请求的发送源地址。 通常,同一站点请求访问受安全限制的页面。 例如,是否需要访问http://bank.example/withdraw? 帐户=bob amount=1000000 for=mallory,用户必须首先登录bank。

example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。

而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

​ 这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。

​ 然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。

事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

4.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 的最后加上 ,这样就把 token 以参数的形式加入请求了。

但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。

​ 该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。

为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

4.3 在 HTTP 头中自定义属性并验证

​ 这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

​ 然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。