概述
CSRF(跨站请求伪造)概述
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。
这里列举一个场景解释一下,希望能够帮助你理解。
场景需求:
小黑想要修改大白在购物网站tianxiewww.xx.com上填写的会员地址。
先看下大白是如何修改自己的密码的:
登录---修改会员信息,提交请求---修改成功。
所以小黑想要修改大白的信息,他需要拥有:1,登录权限 2,修改个人信息的请求。
但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办?
于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
【http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change】
于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。
为啥小黑的操作能够实现呢。有如下几个关键点:
1.www.xxx.com这个网站在用户修改个人的信息时没有过多的校验,导致这个请求容易被伪造;
---因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
2.小白点击了小黑发给的链接,并且这个时候小白刚好登录在购物网上;
---如果小白安全意识高,不点击不明链接,则攻击不会成功,又或者即使小白点击了链接,但小白此时并没有登录购物网站,也不会成功。
---因此,要成功实施一次CSRF攻击,需要“天时,地利,人和”的条件。
当然,如果小黑事先在xxx网的首页如果发现了一个XSS漏洞,则小黑可能会这样做: 欺骗小白访问埋伏了XSS脚本(盗取cookie的脚本)的页面,小白中招,小黑拿到小白的cookie,然后小黑顺利登录到小白的后台,小黑自己修改小白的相关信息。
---所以跟上面比一下,就可以看出CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。
因此,网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如:
--对敏感信息的操作增加安全的token;
--对敏感信息的操作增加安全的验证码;
--对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。
如果你没有读太明白,不要犹豫,请再读一遍啦
你可以通过“Cross-site request forgery”对应的测试栏目,来进一步的了解该漏洞。
CSRF(get) login
①注意提示,此处的用户名密码已经更改了。
②我们随机登录一个,修改个人信息,点击提交,并通过burpsuite抓包。
③从数据包请求来看,并没有token限制,我们修改url即可。
将其原有地址更改为beijing
点击修改个人信息抓包
将其原有地址更改为beijing
访问url
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=45634&phonenum=123&add=china&email=999.com&submit=submit
修改成功
CSRF(POST)
- 先将任一用户的信息进行修改,通过控制台查看数据包。这里将
vince
用户的住址修改成Beijing
- 可以看到,请求通过POST方式提交,从而无法像前面一样通过伪造URL来进行攻击,那么这个漏洞应该怎么利用呢?
- 此时,黑客可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。
- 这里需要借助
CSRFTester
软件进行抓包。先打开CSRFTester
,用法和Brup差不多,不过这里需要配置的监听端口为8008
。点击Start Recording
开启监听后修改用户信息。提交表单后,可以看到已经抓到这个POST请求
- 将其它多余的请求删除,然后点击
Generate HTML
生成恶意网页index.html
,使用编辑器将其打开。这里可以直接修改其中的数据,依然将邮箱修改为黑客邮箱Hacker@pikachu.com
,另外还需要添加一个提交按钮。修改完成后,部署到黑客站点,这里我放到Pikachu/vul/csrf/
目录下
- 最后,当用户在登录状态下,访问黑客站点
http://127.0.0.1/pikachu/vul/csrf/index.html
并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求
Token验证
原理:CSRF的主要问题是敏感操作的链接容易被伪造。而只要在每次请求时都增加一个随机码Token
,后台每次都对这个随机码进行验证,则可以有效地防止CSRF
- 在源码
token_get_edit.php
中看到,每次刷新页面,都会调用set_token()
函数,该函数会把SESSION
中Token
销毁,然后生成一个新的Token
,并将这个Token
传到前端表单中
<div id="per_info"> <form method="get"> <h1 class="per_title">hello,{$name},欢迎来到个人会员中心 | <a style="color:bule;" href="token_get.php?logout=1">退出登录</a></h1> <p class="per_name">姓名:{$name}</p> <p class="per_sex">性别:<input type="text" name="sex" value="{$sex}"/></p> <p class="per_phone">手机:<input class="phonenum" type="text" name="phonenum" value="{$phonenum}"/></p> <p class="per_add">住址:<input class="add" type="text" name="add" value="{$add}"/></p> <p class="per_email">邮箱:<input class="email" type="text" name="email" value="{$email}"/></p> <input type="hidden" name="token" value="{$_SESSION['token']}" /> <input class="sub" type="submit" name="submit" value="submit"/> </form> </div>
- 而当每次提交表单时,这个
Token
值就会传到后台与SESSION
中的Token
进行比较,若不相等,此次表单则提交失败。所以黑客由于不能得知用户当前的Token
值,从而无法进行CSRF攻击。
其它防范措施
- 增加验证码:一般用于防止暴力破解,也可以用在其它重要信息操作的表单中
- 安全的会话管理:
-
- 不要在客户端保存敏感信息,如身份认证信息
- 设置会话过期机制,如15分钟内无操作则自动登录超时
- 访问控制安全管理:
-
- 敏感信息修改时需要对身份进行二次认证,如修改密码时,需要校验旧密码
- 敏感信息的修改使用POST,而不是GET
- 通过HTTP头部中的
Referer
来限制原页面
本文版权归作者和CSDN平台共有,重在学习交流,欢迎转载。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!
敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。