一、CSRF介绍

  CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,也被称为 one-click attack 或者 session riding。通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像xss漏洞,但是它与xss漏洞非常不同。xss利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。与xss攻击相比,csrf攻击往往不大流行,也难以防范,所以认为比xss漏洞更具危险性

img

二、CSRF漏洞原理

  CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。CSRF漏洞能够做的事情包括:以目标用户的名义发送邮件、发消息、盗取目标用户的账号,甚至购买商品、虚拟货币转账,这会泄露个人隐私并威胁到了目标用户的财产安全

Csrf漏洞的攻击过程有两个重点:

  1. 目标用户已经登录了网站,能够执行网站的功能
  2. 目标用户访问了攻击者构造的URL

三、CSRF攻击实例

1、角色

  • 正常浏览网页的用户:User

  • 正规的但是具有漏洞的网站:WebA

  • 利用CSRF进行攻击的网站:WebB

2、流程

(1)步骤一

  用户登录、浏览并信任正规网站WebA,同时,WebA通过用户的验证并在用户的浏览器中产生Cookie。

img

(2)步骤二

  攻击者WebB通过在WebA中添加图片链接等方式诱导用户User访问网站WebB。

img

(3)步骤三

  在用户User被诱导访问WebB后,WebB会利用用户User的浏览器访问第三方网站WebA,并发出操作请求。

img

(4)步骤四

  用户User的浏览器根据WebB的要求,带着步骤一中产生的Cookie访问WebA。

img

(5)步骤五

  网站WebA接收到用户浏览器的请求,WebA无法分辨请求由何处发出,由于浏览器访问时带上用户的Cookie,因此WebA会响应浏览器的请求,如此一来,攻击网站WebB就达到了模拟用户操作的目的。

img

四、CSRF攻击防护

  上文简单的叙述了CSRF攻击的原理,接下来将要介绍几种CSRF攻击的防护方法。

(1)验证用户

  当用户发送重要的请求时需要输入原始密码或验证码

(2)限制请求方式

  限制请求方式只能为POST

(3)只使用JSON API

  使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。

(4)验证HTTP Referer字段(同源策略)

  根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如上文中用户User想要在网站WebA中进行转账操作,那么用户User必须先登录WebA,然后再通过点击页面上的按钮出发转账事件,这时该转帐请求的 Referer值就会是转账按钮所在的页面的URL,而如果黑客要对银行网站实施 CSRF攻击,他只能在他自己的网站构造请求,当用户User通过黑客的网站发送请求到WebA时,该请求的 Referer是指向黑客自己的网站。

  因此,要防御 CSRF 攻击,网站WebA只需要对于每一个转账请求验证其 Referer值,如果是以网站WebA的网址开头的域名,则说明该请求是来自WebA自己的请求,是合法的。如果 Referer是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

(5)在请求地址中添加token验证

  CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有 token或者 token内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

  这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于session之中,然后在每次请求时把token从session中拿出,与请求中的token进行比对。

  token可看作是数据包的编号,每次产生一个新的请求数据包时,就会有一个新的token,与session中的token比对不成功,即抵御了CSRF攻击

五、Pikachu靶场CSRF练习

1、CSRF(GET)

  首先从提示可以使用用户名和密码登录,然后在用户修改个人信息的时候,坏人通过一些方式(ARP欺骗劫持、中间人监听、流量嗅探)抓取到了包

img

  得到一个修改电话号码URL:127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=&phonenum=123456789&add=&email=&submit=submit,复制好保留,把包放掉,现在手机号是123456789

  假如想让手机号改为666666,做一个html,其中一条关键语句<a href="http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=&phonenum=666666&add=&email=&submit=submit">点我抽奖!</a>,将做好的html发给当事人,当事人点击了链接,即可成功修改电话号码(如果是正经的话得把html放到公网上)

2、CSRF(POST)

  小白修改信息,点击提交,被黑客抓到了包,记录好

img

  此时写一个POST传参的html页面,发送给小白,小白点击一闪而过就会被修改信息了(或者用BurpSuite也可以一键生成“engagement tools”->“generate CSRF poc”)

<html>
<head>
<script>
window.onload = function(){
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_p ost_edit.php">
<input id="sex" type="text" name="sex" value="girl" />
<input id="phonenum" type="text" name="phonenum" value="666666" />
<input id="add" type="text" name="add" value="china" />
<input id="email" type="text" name="email" value="vince@pikachu.com" />
<input id="sex" type="text" name="sex" value="girl" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

3、CSRF Token

  由于token值每次提交后都会失效,恶意攻击者抓到小白的GET请求时里面的token已经失效了,所以网站也就没有执行GET请求的操作,CSRF也就防御成功

六、CSRF自动化测试—CSRFTester

1、CSRFTester简介

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

2、CSRFTester环境准备

  • Windows系统

  • Java环境配置

  • CSRFTester 点击下载 提取码:kytb

  • espcms:一个存在CSRF的CMS 点击下载 提取码:upg1

3、CSRFTester使用

  安装espcms

img

  设置浏览器代理:127.0.0.1:8008

img

  提交表单前,先开启CSRFTester监听

img

  登录espcms后台,添加一个名为w01ke的会员,提交表单

img

  在CSRFTester里找到提交的表单数据包,将其原来数据修改为admin2数据,然后点击右下角Generate HTML保存到指定目录,会生成一个index.html文件

img

  打开index.html将末尾form里面的代码全删除掉

img

  修改完后,使用同个浏览器打开index.html,页面返回true

img

  再返回查看会员列表页面,可以发现已经成功添加了admin2用户

img

【小贴士】使用CSRFTester工具做测试时,为提供效率,最好只打开要测试的网站页面,也就是在工具中截获的页面尽可能少,否则可能测试结果不准确。

七、参考链接