CSRF漏洞入门学习

CSRF漏洞入门学习

一.什么是CSRF?

CSRF(Cross-Site Request Forgery),也被称为 one-click attack 或者 session riding,即跨站请求伪造攻击。即强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作,浏览器的安全策略是允许当前页面发送到任何地址的请求,所以用户在浏览无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。

简单来说,就是攻击者可以盗用你的登录信息,以你的身份模拟发送各种请求对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。



二.CSRF攻击原理

1、用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

在这里插入图片描述

CSRF攻击的三个条件:

1.用户登陆了站点A,并在本地记录了cookie。2.在用户没有登出站点的情况(cookie生效的情况),访问了攻击者提供的恶意链接。3.站点A没有任何CSRF防御



三.CSRF分类及危害

CSRF分类:

CSRF攻击可以分为以下几种类型:

(1)GET型:这种类型的CSRF利用非常简单,只需要一个HTTP请求 ,这种类型的CSRF一般是由于程序员安全意识不强造成的。例:<img src=http://example.cn/csrf.php?x=1 /> 访问了img图片之后,浏览器就会向 http://example.cn/csrf.php?x=1 发出一次HTTP请求。所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了。

(2)POST型:这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单。例:在普通用户的眼中,点击网页->打开试看视频->购买视频是一个很正常的一个流程。可是在攻击者的眼中可以算正常,但又不正常的。攻击者在购买处抓到购买时候网站处理购买(扣除)用户余额的地址。比如:/coures/user/handler/25332/buy.php。通过提交表单,buy.php处理购买的信息,这里的25532为视频ID。那么攻击者现在构造一个链接,链接中包含以下内容:

<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script> document.forms[0].submit(); </script> 

当用户访问该页面之后,表单会自动提交,相当于完成了一次POST操作,自动购买了id=25332的视频,从而导致受害者扣除金额。

(3)点击劫持:点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的 iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的 iframe 页面。

想让iframe页面透明:可以尝试以下几种方法:1.通过使用allowtransparency和background-color来设置iframe框架的透明效果:<iframe src="" opacity="0" style="opacity:0"></iframe> 2.把iframe 设置成绝对定位,把 z-index 设置很多,让它处在最上层。

(4)CSRF - token leak:通过XSS攻击等手段获取提交时的token,重新生成PoC链进行攻击。


CSRF漏洞危害:

  • 1.修改账户信息。
  • 2.利用管理员账号,上传木马文件。
  • 3.传播蠕虫病毒。
  • 4.和其他攻击手段配合,实现攻击,比如XSS。


四.CSRF攻击,漏洞挖掘

了解完CSRF的一些概念之后我们来进行实战吧:

CSRF攻击:

1.pikachu靶场的get型CSRF : 我们用username=lili password=123456进行登录。登陆之后如下图:

在这里插入图片描述

我们点击修改个人信息:

在这里插入图片描述

这时候,用我们的抓包工具burpsuite,进行抓包。将手机号码修改成110然后提交,我们可以抓到一个数据包如下所示:

在这里插入图片描述

在这里插入图片描述

根据如图所示的url可以看到,用户在修改个人信息的时候,系统是没有给出任何的认证信息的,我们可以这个漏洞。于是我构建了这个链接,将性别,邮箱改为0。http://localhost/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=0&phonenum=110&add=usa&email=0&submit=submit

为了将链接变得隐蔽,我们可以使用短链接工具:(https://www.duanlianjie.net/),将URL进行缩短,让目标不方便发觉。综上所述,我们要设法让被攻击者点击了,这个链接,那么CSRF攻击就可以发生。


2.pikachu靶场的post型CSRF : 同样的我们用lili来登录。登录完之后->修改个人信息->submit

然后进行抓包,我们发现:

在这里插入图片描述

右键使用更多相关工具,然后选到 generate CSRF PoC:


在这里插入图片描述


我们点击options,勾选最后一个选项,自动提交脚本,就生成了一段HTML:

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://localhost/pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
      <input type="hidden" name="sex" value="1" />
      <input type="hidden" name="phonenum" value="18656565545" />
      <input type="hidden" name="add" value="usa" />
      <input type="hidden" name="email" value="lili&#64;pikachu&#46;com" />
      <input type="hidden" name="submit" value="submit" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body>
</html>


将代码用记事本编写成一个html文件,然后把文件放到pikachu文件中,在这里我命名为:111.html我的存放位置是:`pikachu-master\vul\csrf` 然后我们在访问网站:`http://localhost/pikachu-master/vul/csrf/111.html` 攻击完成。

在这里插入图片描述

在这里插入图片描述

3.pikachu靶场CSRF–token 同样的我们用bp抓包发现,报文中,增加了token值。为了解决这个token,我在BApp Stroe中,下载插件CSRF Token Tracker

在这里插入图片描述

下载插件之后我们打开插件CSRF token Tracker:将host name value 的值按照如下输入,然后勾选enable 和 sync requests based on the following rules (基于以下规则同步请求)。

在这里插入图片描述

配置完之后,将抓到的报表发送到repeater中,我将sex设置为2,来测试是否允许修改:

在这里插入图片描述

发现成功了:

在这里插入图片描述


4.DVWA - medium: 我们查看源码,可以看到有这么一段判断语句:eregi()函数在由模式指定的字符串中搜索指定的字符串,搜索不区分大小写。如果模式被验证,则返回true,否则返回false

if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ]; 

这段代码适用于判断’SERVER_NAME’ 是否等于 ‘HTTP_REFERER’ 的,我们用bp生成好的CSRF漏洞html代码时,只需将文件名改成127.0.0.1即可绕过这段判断语句。




CSRF漏洞挖掘:

  • 1.抓取请求数据包,查看是否有Refere和token。如果没有,择优CSRF漏洞。
  • 2.即使存在Refere字段,但是若是请求删去Refere仍能够提交成功,那么也存在CSRF漏洞。
  • 3.使用CSRFTester-1.0 漏洞测试工具。

知识补充:

  • 关于Refere:1.Referer是HTTP请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含Referer 。比如我在www.xxxx.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=https://www.xxxx.com信息。2.Referer的作用:防盗链,防止恶意请求。

  • 关于Token:所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。


五.CSRF的防御

(1) 验证header字段,常见的是Referer和Origin,Referer容易绕过,且会包含有一些敏感信息,可能会侵犯用户的隐私,而Origin字段代表最初请求,更建议使用。

(2) Token令牌机制

当前最成熟的防御机制,但若存在验证逻辑及配置问题则存在绕过风险。Token的生成机制通常和session标识符挂钩,将用户的token与session标识符在服务端进行匹配。当下已经有很多开源库和中间件都可以实现token生成。

(3) 验证自定义header,如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等。

(4)双重cookie验证,利用CSRF攻击不能获取到用户Cookie的特点,我们可以要求Ajax和表单请求携带一个Cookie中的值。
tencent.com/product/tdmq?from_column=20065&from=20065)都可以实现token生成。

(3) 验证自定义header,如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等。

(4)双重cookie验证,利用CSRF攻击不能获取到用户Cookie的特点,我们可以要求Ajax和表单请求携带一个Cookie中的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值