iOS内购欺诈漏洞
iOS内购欺诈漏洞
- 1.iOS内购欺诈漏洞概述
- 2.伪造的凭证
- 3.漏洞修复方案
1.iOS内购欺诈漏洞概述
黑产别的App上低价充值(比如1元)换取苹果真实凭证,再在目标App上下单高价(648元)商品,传入该凭证,如果目标App服务端苹果凭证校验接口存在漏洞,只校验了凭证中商品和订单信息,未校验凭证中App来源(bundleID),则会验证通过,进而发货
对黑产来说,黑产实际只支付了1元,就能买到目标App的648元商品;对于目标App来说,他连这1元都没得到(因为是在别的App上充的),完全被白嫖648元商品。可谓伤害极大
还原盗刷步骤:
- 黑产通过破解(比如抓网络请求)目标App客户端,获得648元商品的苹果商品id(product_id)值。
- 黑产自己上架一款App,在苹果后台添加一款1元的内购商品,设置苹果商品id(product_id)值和目标App一致。
- 黑产在自己的App里真实付款1元商品,拿到苹果返回的真实凭据(receipt)和苹果交易id(transaction_id)。
- 黑产破解目标App客户端后,直接调目标App的苹果凭证校验接口,把上面获得的凭据(receipt)和苹果交易id(transaction_id)作为参数传进去。
- 目标App服务端拿着凭据去苹果后台校验,由于凭据是真实的,苹果验证通过。目标App服务端解析凭证,校验凭证内参数,核对product_id正确、核对transaction_id唯一性通过,全部校验通过,发货。
漏洞的主要原因:
- 苹果后台,苹果商品id(不同开发者账号下)可以重复;
- 目标App服务端凭证校验接口,未校验凭证中App来源(bundleID)。
2.伪造的凭证
下面是被攻击App服务端提供的一段日志,记录了“伪造的”凭证样式
- 最外层的bundle_id,并不是目标App的包名,而是一个不认识的App包名。这个就是黑产真实充值的App。
- in_app数组里面product_id,却是目标App里有效的苹果商品id,正是648元商品的product_id。
- 再看transaction_id。这里的transaction_id实际上是黑产App内充值产生的,并不是目标App内产生的。因为transaction_id只有在苹果内购付款成功后才会生成,且只能由客户端传给服务端,所以服务端是没法校验transaction_id是否来源于自己的App。服务端能做的就是判断transaction_id是否重复,防止重放攻击。因为黑产每次充值都会真实的充一笔,所以transaction_id并不会重复,这也是目标App服务器验证transaction_id通过的原因。
{"receipt_type": "Production","adam_id": 6441231333,"app_item_id": 6441231333,"bundle_id": "com.apps.slanCaizhuang", //这并不是目标App的bundleID,而是黑产自己的的App"application_version": "3","download_id": 502222222222222222,"version_external_identifier": 855304439,"receipt_creation_date": "2023-04-12 16:59:25 Etc/GMT","receipt_creation_date_ms": "1681318765000","receipt_creation_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","request_date": "2023-04-12 17:16:54 Etc/GMT","request_date_ms": "1681319814498","request_date_pst": "2023-04-12 10:16:54 America/Los_Angeles","original_purchase_date": "2023-03-11 05:00:05 Etc/GMT","original_purchase_date_ms": "1678510805000","original_purchase_date_pst": "2023-03-10 21:00:05 America/Los_Angeles","original_application_version": "3","in_app": [{"quantity": "1","product_id": "com.xiaomi.haha123", //这里却是目标App的product_id"transaction_id": "210000000000000",//黑产自己App上支付产生的transaction_id"original_transaction_id": "210000000000000","purchase_date": "2023-04-12 16:59:25 Etc/GMT","purchase_date_ms": "1681318765000","purchase_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","original_purchase_date": "2023-04-12 16:59:25 Etc/GMT","original_purchase_date_ms": "1681318765000","original_purchase_date_pst": "2023-04-12 09:59:25 America/Los_Angeles","is_trial_period": "false","in_app_ownership_type": "PURCHASED"}],"environment": "Production","status": 0
}
3.漏洞修复方案
1、服务端凭证校验时,加上bundleID的校验即可
即服务端去苹果那边校验通过后,还需核对凭证内以下参数:
- bundle_id,是否为你们自己的App(防止跨App充值);
- product_id,是否为下单时对应的商品id(防止App内部以小博大);
- transaction_id,是否已经发过货(防止重放攻击)
2、共享密钥(推荐)
服务端请求苹果凭证校验接口时,除了传receipt-data字段,再额外传一个password参数(苹果后台生成的共享密钥)。这样苹果那边核对凭证时,除了验证凭证是否有效,还会核对凭证和密钥是否匹配。如果不匹配苹果会返回错误信息
官方文档地址:https://developer.apple.com/documentation/appstorereceipts/requestbody?language=objc
相关文章:
iOS内购欺诈漏洞
iOS内购欺诈漏洞 1.iOS内购欺诈漏洞概述2.伪造的凭证3.漏洞修复方案 1.iOS内购欺诈漏洞概述 黑产别的App上低价充值(比如1元)换取苹果真实凭证,再在目标App上下单高价(648元)商品,传入该凭证,如…...
【网络服务】正向代理和反向代理到底是什么意思
🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 前言 在学习和…...
【算法】记忆化搜索
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、不同路径二、最长递增子序列三、猜数字大小 ||四、矩阵中的最长递增路径总结 引言 记忆化搜索&…...
博客系统多模块开发
创建工程 创建父工程 删除src目录,在pom.xml添加依赖: <!--统一版本 字符编码--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.b…...
pdf阅读器哪个好用?五款PDF阅读器大比拼
pdf阅读器哪个好用?在数字化时代,PDF文档因其跨平台、跨设备的便捷性,已成为工作、学习和生活中不可或缺的一部分。而一款优秀的PDF阅读器,则能极大地提升我们处理PDF文档的效率与体验。今天,就让我们一起探索五款备受…...
C#实现Queue的加锁和解锁
在C#中,可以使用lock语句来对队列进行加锁和解锁,以确保在多线程环境下的线程安全。以下是一个简单的示例: using System; using System.Collections.Generic; using System.Threading;public class ThreadSafeQueue<T> {private read…...
北京邮电大学人工智能考数据结构,均分370!北京邮电大学计算机考研考情分析!
北京邮电大学(Beijing University of Posts and Telecommunications),简称北邮,是中华人民共和国教育部直属、工业和信息化部共建的全国重点大学,位列国家“211工程”、“985工程优势学科创新平台”、“世界一流学科建…...
1. lambda初体验
首先声明一个函数式接口,就只接口内只有一个抽象方法 //函数式接口 public interface Factory {Object getObject();}接口实现类 public class SubClass implements Factory {Overridepublic Object getObject() {return new User();}}User类 public class User …...
C#之显示转换
在C#中显示转换分为三种本别是: 括号强转,parse法,convert法。下面就为大家介绍一下吧!!! 括号强转 作用: 一般情况下 将高精度的类型转换为低精度 语法: 变量类型 变量名 (转换的变量类型名称) 变量; …...
汇编原理(三)编程
源程序: 汇编指令:有对应的机器码与其对应 伪指令:无对应的机器码,是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。 ex1:XXX segment、XXX ends这两个是一对成对使用的伪指令,且必须会被用…...
[MySQL数据库] Java的JDBC编程(MySQL数据库基础操作完结)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …...
绿色瓶装水“暗战”竞争越发激烈,华润饮料谋上市同时多地扩产能
《港湾商业观察》黄懿 4月23日,纯净水牌“怡宝”母公司华润饮料(控股)有限公司(下称“华润饮料”)向港交所主板提交上市申请,联席保荐人为中银国际、中信证券、美银美林、瑞银集团。 在华润饮料递表不久之…...
C语言之指针详解(4)
文章目录 一、回调函数二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort函数排序结构体数据 三、qsort函数的模拟实现 一、回调函数 首先我们先来了解一下什么是回调函数 回调函数通俗来讲就是一个通过函数指针调用的函数。 如果你把函数的指针(地址&am…...
0基础学习小红书博主IP特训营,37天 教你从小白到KOL(13节)
课程内容: 1 第一课:如何做好博主账号定位 .mp4 2 第一课作业,html 3 第二课:如何打造小红书爆款笔记(一)_.mp4 4 第二课:如何打造小红书爆款笔记(二).mp4 5 第二课作业,html 6 第三课:如何高效搭建选题库 .mp4 7 第三课作业,html 8 第四课:破解流量玄学&am…...
【openlayers系统学习】3.1-3.2彩色GeoTIFF图像渲染
一、彩色GeoTIFF图像渲染 Sentinel-2 卫星任务收集并传播覆盖地球陆地表面的图像,重访频率为 2 至 5 天。传感器收集多波段图像,其中每个波段都是电磁频谱的一部分。 2A 级 (L2A) 产品提供以下频段的表面反射率测量: BandDescriptionCentra…...
前端自动将 HTTP 请求升级为 HTTPS 请求
前端将HTTP请求升级为HTTPS请求有两种方式: 一、index.html 中插入meta 直接在首页 index.html 的 head 中加入一条 meta 即可,如下所示: <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests&…...
辅助驾驶ADAS功能算法介绍
一、ADAS功能分类 按照行驶域划分,将ADAS功能分为行车功能、泊车功能和主动安全功能。 行车功能 ACC(Adaptive Cruise Control)自适应巡航控制TJA(Traffic Jam Assist)交通拥堵辅助LCC(Lane Centering Control)车道居中控制ICC(Integration Cruise Control)智能巡航系…...
Docker 安装kingbase V8r6
下载 官网下载,注意:这里下载 Docker 版本v8r6 安装 # 导入镜像 docker load -i kingbase.tar# 重命名 docker tag [image-name]:[tag] [new-image-name]:[new-tag]# 删除 docker rmi [image-name]:[tag]# 创建容器 docker run -tid \ --privileged \…...
Python 应用打包成 APK【全流程】
将 Python 应用打包成 APK。 文章目录 步骤 1: 安装 Buildozer 和其依赖Linux (Ubuntu) 环境下安装: 步骤 2: 创建你的 Python 应用步骤 3: 配置 Buildozer步骤 4: 打包成 APK总结 步骤 1: 安装 Buildozer 和其依赖 首先确保你的系统中已安装 Python 和 pip。接下来ÿ…...
jmeter之MD5加密接口请求教程
前言: 有时候在项目中,需要使用MD5加密的方法才可以登录,或者在某一个接口中遇到 登录获取token后才可以进行关联,下面介绍下遇到的常见使用 一、第一种方法:使用jmeter自带的函数助手digest 选择工具,选…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
