API成批分配漏洞介绍与解决方案
一、API成批分配漏洞介绍
批量分配:在API的业务对象或数据结构中,通常存在多个属性,攻击者通过篡改属性值的方式,达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级;假设某API的默认接口调用参数为{"user_name":"user","is_admin":0},而恶意攻击者修改请求参数,提交值为{"user_name":"attacker","is_admin":1},通过修改参数is_admin的值来提升为管理员权限。
应用程序中潜藏的安全漏洞是一种非常大的隐患,攻击者会通过某一个安全漏洞窃取站点内的用户隐私等重要信息。在扫描应用程序时,我们需要对多项内容进行配置。那么,AppScan扫描应用程序需要URL吗?是需要的。在新版的AppScan还可以扫除API成批分配的问题,我们需要AppScan扫出API成批分配问题解决方案来解决。
APPScan 10.0.7新增的扫描功能 HCL AppScan® Enterprise 中的新增功能 (hcltechsw.com),增加了批量分配API的规则。
AppScan扫描应用程序需要URL吗
AppScan扫描应用程序是否需要URL,那么我们就要看AppScan是如何扫描应用程序的。
1.启动扫描位置
图1:主界面
这里我们使用的是AppScan 10.0.8版本,启动软件后,单击主界面中【web应用程序】便可启动扫描进程。
2.配置扫描
图2:配置界面
在配置界面中第一项便是要求填写【URL和服务器】,在图2中【从该URL开始扫描】位置输入目标URL即可。
3.完全扫描模式下输入URL
图3:完全扫描
当我们启动【完全扫描】模式时,在【探索】位置我们可以对【URL和服务器】进行配置,配置方式和【扫描web应用程序】的配置方式一致。
4.web API
AppScan主界面中除了【web应用程序】和【完全配置】外,还有【web API】,web API的配置是不需要的填写URL的。
图4:扫描web API
web API虽然无需填写URL,但需要填写客户机和描述文件。
漏洞条件:
1、接口类型为application/json ,参数传值、form表单等类型暂未受影响。
2、请求json参数不是接收参数的javabean及其父类中的任意属性。
3、接口HTTP状态码为200
请求json参数不是接收参数的javabean及其父类中的任意属性。
意思就是:我javaben里面没有这个参数,你却传递过来了,例如我只需要pageNum和pageSize 你还传了role:admin 那么这样就有可能导致致特权升级、数据篡改、绕过安全机制。
二、AppScan扫出API成批分配问题
可利用性
利用通常需要了解业务逻辑、对象关系和 API 结构。 在 API 中利用批量分配更容易,因为按照设计,它们公开了应用程序的底层实现以及属性名称。
安全弱点
现代框架鼓励开发人员使用自动将客户端输入绑定到代码变量和内部对象的函数。 攻击者可以使用这种方法来更新或覆盖开发人员从未打算公开的敏感对象的属性。
影响
利用该漏洞可能会导致权限升级、数据篡改、绕过安全机制等。
API 是否容易受到攻击
现代应用程序中的对象可能包含许多属性。 其中一些属性应由客户端直接更新(例如,user.first_name 或 user.address),而另一些则不应该(例如,user.is_vip 标志)。
如果 API 端点自动将客户端参数转换为内部对象属性,而不考虑这些属性的敏感性和暴露级别,则该端点容易受到攻击。 这可能允许攻击者更新他们不应访问的对象属性。
敏感属性的示例
权限相关属性:user.is_admin、user.is_vip 只能由管理员设置。
与流程相关的属性:user.cash 只能在付款验证后在内部设置。
内部属性:article.created_time 只能由应用程序内部设置。
攻击场景示例
场景#1
乘车共享应用程序为用户提供了编辑其个人资料的基本信息的选项。 在此过程中,API 调用将使用以下合法 JSON 对象发送到 PUT /api/v1/users/me:
{“user_name” : “inons”,“age” : 24}
请求 GET /api/v1/users/me 包含一个额外的credit_balance 属性:
{"user_name" : "inons", "age":24, "credit_balance" : 10}
攻击者使用以下有效负载重放第一个请求:
{“user_name” : “攻击者”,“age” : 60,“credit_balance” : 99999}
由于端点容易受到大规模分配的影响,攻击者无需付费即可获得积分。
场景#2
视频共享门户允许用户上传和下载不同格式的内容。 探索 API 的攻击者发现端点 GET /api/v1/videos/{video_id}/meta_data 返回带有视频属性的 JSON 对象。 其中一个属性是“mp4_conversion_params”:“-v codec h264”,这表示应用程序使用 shell 命令来转换视频。
攻击者还发现端点 POST /api/v1/videos/new 容易受到批量分配的影响,并允许客户端设置视频对象的任何属性。 攻击者设置恶意值如下:“mp4_conversion_params”:“-v codec h264 && format C:/”。 一旦攻击者将视频下载为 MP4,该值将导致 shell 命令注入。
攻击者利用批量分配漏洞
当来自客户端的手动修改不可变内部对象属性的请求不受 API 端点限制时,就会出现 API 批量分配漏洞。
攻击者可以利用此漏洞,通过构建 HTTP 请求来升级用户权限、绕过安全机制或使用任何其他方法使 API 端点以非设计的方式工作。
注意:批量分配和过多数据暴露在 OWASP API Sec 2019 中是一个单独的风险类别,现在已合并到名为“损坏对象属性级别授权”的新风险类别中。
如何预防
如果可能,请避免使用自动将客户端输入绑定到代码变量或内部对象的函数。
仅将应由客户端更新的属性列入白名单。
使用内置功能将客户端不应访问的属性列入黑名单。
如果适用,请显式定义并强制执行输入数据有效负载的架构。
增加反序列化配置。
三、成批分配漏洞解决方案
方案1:增加反序列化配置方案
1、反序列化所使用的框架的配置
jackson
如果SpringBoot使用的默认jackson做的序列化,可以考虑对jackson配置来解决传冗余参的问题。
可以直接在配置文件中增加配置
spring:jackson:serialization:# 某些类对象无法序列化的时候,是否报错fail_on_empty_beans: truedeserialization:# json对象中有不存在的属性时候,是否报错fail_on_unknown_properties: true
或自建配置类
@Configuration
public class JacksonConverters {@Beanpublic HttpMessageConverters JacksonHttpMessageConverters() {MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();//省略其他配置开始//反序列化的时候如果多了其他属性,抛出异常objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);//省略其他配置结束}}
fastjson
如果SpringBoot使用的是fastjson做的序列化,在2.0.42版本中增加了解决方案,可以考虑对fastjson配置来解决传冗余参的问题。
/*** @author admin*/
@Configuration
public class Fastjson2Config {/*** 使用fastJson解析*/@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();/** API成批分配利用问题(反序列化的时候如果多了其他属性)修复方法:* 第一:json反序列化组件设置,如:fastjson与jackson* 第二:签名验证** fastjson 2.0.42增加了ErrorOnUnknownProperties修复API成批分配利用问题,反序列化的时候如果多了其他属性,抛出异常* https://github.com/alibaba/fastjson2/issues/1944** JSONObject jsonObject = JSONObject.of("id", 123, "name", "xxx");* String str = jsonObject.toJSONString();* assertEquals(jsonObject.getIntValue("id"), JSON.parseObject(str, Bean.class).id);* assertThrows(JSONException.class, () -> JSON.parseObject(str, Bean.class, JSONReader.Feature.ErrorOnUnknownProperties));* assertEquals(jsonObject.getIntValue("id"), jsonObject.toJavaObject(Bean.class).id);* assertThrows(JSONException.class, () -> jsonObject.toJavaObject(Bean.class, JSONReader.Feature.ErrorOnUnknownProperties));** jackson中可以加入* spring:* jackson:* deserialization:* fail-on-unknown-properties: true* 或* //反序列化的时候如果多了其他属性,抛出异常* objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);** 统一异常捕获或者返回处增加非200状态码**/config.setDateFormat("yyyy-MM-dd HH:mm:ss");config.setReaderFeatures(JSONReader.Feature.ErrorOnUnknownProperties);config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat);converter.setDefaultCharset(StandardCharsets.UTF_8);List<MediaType> supportedMediaTypes = new ArrayList<>();supportedMediaTypes.add(MediaType.APPLICATION_JSON);converter.setFastJsonConfig(config);converter.setSupportedMediaTypes(supportedMediaTypes);return new HttpMessageConverters(converter);}}
2、统一异常捕获或者返回处增加非200状态码
/*** 捕获反序列化异常HttpMessageNotReadableException,增加500状态码返回* @param request 请求* @param exception 异常对象* @return 响应*/
@ExceptionHandler(value = HttpMessageNotReadableException.class)
public ResponseEntity<Map<String, Object>> methodHttpMessageNotReadableExceptionHandler(HttpServletRequest request, HttpMessageNotReadableException exception) {//按需重新封装需要返回的错误信息WebRequest webRequest = new ServletWebRequest(request);Map<String, Object> body = errorAttributes.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults());body.put(DATA, "convert exception message to JSON");body.put(STATUS, HttpStatus.INTERNAL_SERVER_ERROR.value());body.put(MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());body.put(SUCCESS,false);return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
}
或者在其他异常拦截方法上增加状态码注解
@ResponseStatus()
方案二:接口使用参数签名机制
如HMac, HMac Springboot, 微信支付参数签名
#前端请求
请求 URL: http://localhost/cars/query
请求方法: POST
HTTP状态码:200
playload:{"color":"red","company":"ltl","seats":"2-2"} #正常请求
Header:sign:ErOVBda4VMFdX9aixigRslAjY0rhT7lLxy
#后端controller
@PostMapping(value = "/query")
public BaseResponse query(@RequestBody Car car) {String signFront = request.header("sign");String signBackend = SignUtils.handler(car);if(!signBackend.equals(signFront)) {throws new ServiceErrorException("签名异常"); }}
Jackson类库解决方案
Solution - Jackson @JsonView
We can create JSON view like below:
public class View {public static class Editable {}public static class Viewable extends Editable {}public static class Internal extends Viewable {}}
Then annotate our mode class:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Model implements Serializable {@JsonView(View.Editable.class)protected String editableField;@JsonView(View.Viewable.class)protected String viewableField; @JsonView(View.Internal.class)protected String internalField;}
At last, we annotate out jax-rs resource with @JsonView annotation.
@GET
@Produces(MediaType.APPLICATION_JSON )
@JsonView(View.Viewable.class)
public Iterable<Model> search() {}
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON )
@JsonView(View.Viewable.class)
public Model getModel(@PathParam("id") final String id) {}
@POST
@Consumes({MediaType.APPLICATION_JSON})
public Response add(@JsonView(View.Editable.class) final Model model) {}
Spring MVC provides data binder that we can specify what fields are not allowed.
禁用字段:
@InitBinder
public void initBinder(WebDataBinder binder) {binder.setDisallowedFields(DISALLOWED_FIELDS);
}
允许字段:
@Controller
public class UserController {@InitBinderpublic void initBinder(WebDataBinder binder, WebRequest request) {binder.setAllowedFields(["userid", "password", "email"]);}...}
四、总结
以上便是,AppScan扫描应用程序需要URL吗,AppScan扫出API成批分配问题解决方案的内容。AppScan扫描应用程序是需要URL的,同时AppScan完全扫描也是需要URL的,在新版的软件中,只有web API模式是无需URL的。新版的AppScan可以扫出API成批分配的问题,对于此类问题,我们只需要执行反序列化配置方案便可拦截API成批分配的问题。更多有关AppScan使用技巧,尽在AppScan中文网站!
相关文章:

API成批分配漏洞介绍与解决方案
一、API成批分配漏洞介绍 批量分配:在API的业务对象或数据结构中,通常存在多个属性,攻击者通过篡改属性值的方式,达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级;假设某API的默认接口…...

跨网文件摆渡系统:安全、可控的数字传输桥梁
在企业高度信息化的时代,数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而,在数据流通的过程中,我们经常会遇到各种难题和挑战,尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…...
线程池的原理和基本使用~
线程池的基本原理: 无论是之前在JavaSE基础中,我们学习过的常量池,还是在操作数据库时,我们学习过数据库连接池,以及接下来要学习的线程池,均是一种池化思想,其目的就是为了提高资源的利用率&a…...

PyTorch2.0环境搭建
一、安装python并配置环境变量 1、打开python官网,下载并安装 Welcome to Python.org 下载 寻找版本:推荐使用3.9版本,或其他表中显示为安全(security)的版本 安装:(略) 2、配置环…...

figma 基础使用 —— 常用方法
一、 导入组件 分成两种方式 (1)离线的包导入(iOS 常用组件.fig 直接拖拽到figma最近网页) (2)在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键:shift R 三、插件…...
linux rsync 和scp区别
rsync 和 scp 都是 Linux 中用于文件复制的命令,但它们之间存在一些关键差异: 效率:rsync 在复制文件时,只会复制文件中改变的部分,而 scp 则会复制整个文件,即使文件只有一小部分发生了变化。因此…...
mac如何永久设置环境变量
1. 先将默认shell修改为bash mac修改默认shell为bash-CSDN博客 2. 修改环境变量 Mac中的环境变量介绍 Mac系统的环境变量,加载顺序为: /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 当然/etc/profile和/etc/paths…...

小程序一键生成工具哪个好?
在这个数字化时代,小程序已经成为商家吸引客户、提升业务的重要工具。但是,传统的小程序开发方式既费时又费力,让许多商家望而却步。 现在,有了乔拓云小程序模板开发平台,一切都变了。 乔拓云提供了大量精心设计的模板…...
Ubuntu环境下使用nginx实现强制下载静态资源
安装Nginx sudo apt update sudo apt install nginx关闭防火墙 sudo ufw allow Nginx HTTP修改nginx配置 cd /etc/nginx/conf.d vi nginx.conf在http配置中添加(/your path/为需要下载的文件路径) server {listen 80;server_name localhost;location / {root /your path/…...

苹果 macOS 14.1.2 正式发布 更新了哪些内容?
苹果今日向 Mac 电脑用户推送了 macOS 14.1.2 更新(内部版本号:23B92 | 23B2091),本次更新距离上次发布隔了 28 天。 需要注意的是,因苹果各区域节点服务器配置缓存问题,可能有些地方探测到升级更新的时间略…...

【网络编程】-- 02 端口、通信协议
网络编程 3 端口 端口表示计算机上的一个程序的进程 不同的进程有不同的端口号!用来区分不同的软件进程 被规定总共0~65535 TCP,UDP:65535 * 2 在同一协议下,端口号不可以冲突占用 端口分类: 公有端口:0~1023 HT…...
数字发射链路噪声系数核算方法、实例与matlab程序
前言 发射链路各器件噪声性能较差会影响发射信号信噪比,从而导致较高的误码率,通过定量的分析发射链路噪声系数与信噪比恶化的关系,能够在设计过程中进行合理的评估和处理。 一、发射链路噪声 发射链路的噪声从特性上可以大致分为࿱…...

SQL数据库知识点总结归纳
前后顺序可以任意颠倒,不影响库中的数据关系 关系数据库的逻辑性强而物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的数据关系 一名员工可以使用多台计算机(1:m),而一台计算机只能被一名员工使用(1:1),所以员工和计算机两个实体之间是一对多…...

Linux C语言 39-进程间通信IPC之管道
Linux C语言 39-进程间通信IPC之管道 本节关键字:C语言 进程间通信 管道 FIFO 相关库函数:pipe、mkfifo、mknod、write、read 什么是管道? 管道通常指“无名管道”,是Unix系统中最古老的IPC通信方式。 管道的分类 管道&#…...
python pandas dataframe常用数据处理总结
最近一直在做数据处理相关的工作,有几点经常遇到的情况总结如下: 数据中存在为空数据如何处理 处理方式1:丢弃数据行 # 实现方式1 data data.dropna(subset[id]) # 若id列中某行数值为空,丢弃整行数据 # 实现方式2 data df[df…...

excel做预测的方法集合
一. LINEST函数 首先,一元线性回归的方程: y a bx 相应的,多元线性回归方程式: y a b1x1 b2x2 … bnxn 这里: y - 因变量即预测值x - 自变量a - 截距b - 斜率 LINEST的可以返回回归方程的 截距(a) 和 斜…...

12月8日作业
使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数;将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断u界面上输入的账号是否为"admin",…...
RefCell 数据类型
内部可变性(interior mutability)是RUST的设计模式之一,它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据,内部可变性模式在它的数据结构中使用了unsafe(不安全)代码来绕过RUST正常的可变…...

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙
回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢?🤔 GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…...

微服务1 springcloud学习笔记P1-P40
b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接:https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码:d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...