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配置管理…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
