CSRF(跨站请求伪造)详解

1.什么是CSRF

CSRF全称Cross-Site Request Forgery,也被称为 one-click attack 或者 session riding,即跨站请求伪造攻击。
在这里插入图片描述
当发现网站存在CSRF漏洞时,攻击者会利用网站源码,构建一个存有恶意请求的网站或者是链接,引诱受害者访问,那么当受害者在访问攻击者伪造的网站,同时,又在访问攻击者攻击的目标网站且没有关闭会话,那么攻击者就成功完成了CSRF攻击!

攻击者可以发送请求包,比如:修改邮箱的,上传文件的等等。与XSS不同的是,CSRF只是利用cookie,而不是窃取cookie。

CSRF的高危触发点
论坛交流,用户中心,反馈留言,交易管理,后台管理

2.原理

广义的理解
游览器在你不知道的情况下偷偷的发送了数据包。
核心在于游览器你的cookie得到了游览器的信任,然后通过Ajax异步传输获取信息(通过JS发送了带有恶意代码的请求包)!

狭义的理解
1、受害者打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2、在受害者信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时受害者登录网站A成功,可以正常发送请求到网站A;

3、受害者未退出网站A之前,在同一浏览器中请求了攻击者的B网站

4、网站B接收到受害者请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在受害者不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据受害者的Cookie信息以受害者的权限处理该请求,导致来自网站B的恶意代码被执行。

3.CSRF的分类

A.GET型
我们有的时候会遇到数据修改是通过GET请求来发送的,比如:
/news/index.php?id=1&&email=666@qq.com
此链接是用户id=1将邮箱修改666@qq.com,当我们知道CSRF之后,可以伪造邮箱修改为777@qq.com的链接发送给用户,当用户游览此网页时,点击了链接,邮箱就成功被修改了。这样我们就可以利用邮箱来修改用户的密码。
B.POST型
假如一个网站的用户密码修改功能存在CSRF,我们可以通过修改密码时抓包,伪造一个相同的数据包,发给正在访问密码修改功能的用户,当用户访问链接时,写入自动提交的JS代码,这样用户的密码将自动更改!
Burp可以帮助我们伪造数据包,例如:
在这里插入图片描述
在这里插入图片描述
JS自动提交的代码

<script>
    document.getElementByld('标签名').submit();
</script>

4.条件

a.用户已经登录了站点 A,并在本地记录了 cookie;

b.在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A);

c.站点 A 没有做任何 CSRF 防御;

5.CSRF检测方法

a.抓取一个正常请求的数据包,如果没有Referer字段和token,那么极有可能存在CSRF漏洞;

b.如果有Referer字段,但是去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞;

c.利用工具进行CSRF检测。如:CSRF TESTER,CSRF REQUEST BUILDER等;

6.防御方法

a.验证HTTP Referer字段

HTTP请求头中的referer字段记录了请求来源的地址,可以验证请求来源是用户自己,还是黑客!因为黑客构造的拦截或者是网站,用户访问后产生的数据包里的Referer肯定是指向黑客的!

b.在请求地址中添加 token 并验证(Anti-CSRF token)

CSRF攻击主要是黑客伪造了网站相似的链接或者是页面,只要在数据包中加入让黑客无法运算出的随机值,并且每次接收时都要验证该值,即可抵制黑客伪造的数据包!

该方法有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

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

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

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

7.CSRF的危害

  • 伪造HTTP请求进行未授权操作
  • 篡改、盗取目标网站上的重要用户数据
  • 未经允许执行对用户名誉或者资产有害的操作,比如:散播不良信息、进行消费等
  • 如果通过使用社工等方式攻击网站管理员,会危害网站本身的安全性
  • 作为其他攻击向量的辅助攻击手法,比如配合反射性XSS打一套组合拳拿到cookie
  • 传播CSRF蠕虫
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值