赞
踩
* 1\. GET型
* 1\. 验证 HTTP Referer 字段
CSRF(Cross Site Request Forgery,跨站域请求伪造),也被称为 “One Click Attack” 或者 Session
Riding,通常缩写为 CSRF 或者 XSRF 。
尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS 利用站点内的信任用户,而 CSRF
则通过伪装成来自受信任用户的请求来利用受信任的网站。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/direct/8d5680cfb1a2479cbd789fe752f1fec6.jpeg)
其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
CSRF攻击攻击原理及过程如下:
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
两个条件:
以下情况都是 CSRF 攻击的潜在风险:
你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF
能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
如果一个网站某个地方的功能,比如用户修改邮箱是通过GET请求进行修改的。如:/user.php?id=1&email=123@163.com
,这个链接的意思是用户id=1将邮箱修改为123@163.com。当我们把这个链接修改为
/user.php?id=1&email=abc@163.com
,然后通过各种手段发送给被攻击者,诱使被攻击者点击我们的链接,当用户刚好在访问这个网站,他同时又点击了这个链接,那么悲剧发生了。这个用户的邮箱被修改为
abc@163.com 了
在普通用户的眼中,点击网页->打开试看视频->购买视频 是一个很正常的流程。可是在攻击者的眼中是不正常的,这是由于开发者安全意识不足所造成的。
攻击者在购买处抓到购买时候网站处理购买(扣除)用户余额的地址。比如:/coures/user/handler/25332/buy.php
。通过提交表单,buy.php处理购买的信息,这里的25532为视频ID。那么攻击者现在构造一个链接,链接中包含以下内容:
<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script> document.forms[0].submit(); </script>
当用户访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作,自动购买了 id 为 25332 的视频,从而导致受害者余额扣除。
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址
。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问
http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆
bank.example,然后通过点击页面上的按钮来触发转账事件。因此,要防御 CSRF 攻击,网站只需要对于每一个转账请求验证其 Referer
值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的
CSRF 攻击,拒绝该请求。
优点:
这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查
Referer 的值就可以。
缺点:
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 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP
头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token
值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心
token 会透过 Referer 泄露到其他网站中去。
缺点:
以上防御是技术层面的讨论。实际中进行 CSRF 防护的是使用 WAF (Web应用防火墙,如免费的ShareWAF)。因为 CSRF
只是众多web攻击中的一种,网络攻击还有很多种。WAF可以低于绝大多数的攻击,可极大的提高网站安全性。
![img](https://img-
blog.csdnimg.cn/img_convert/31fb9f6a4225439a7d522fb432c78c1c.png)
![img](https://img-
blog.csdnimg.cn/img_convert/779f27eae6651d1c214a00ea2e82c632.png)
![img](https://img-
blog.csdnimg.cn/img_convert/0830e2f0289a990fb7e5572e99c67c25.png)
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。