从APP小游戏到Web漏洞的发现
字数 1754 2025-08-22 12:22:30
Unity游戏渗透测试技术详解:从APP小游戏到Web漏洞发现
一、背景与发现过程
在对某麻将游戏APP进行渗透测试时,发现HTTP请求接口,但反编译APK后未找到任何接口或域名相关关键字。通过解压APK并使用Everything搜索,最终在global-metadata.dat文件中发现了域名关键词。
二、关键文件解析:global-metadata.dat
1. 文件定义
global-metadata.dat是Unity游戏开发引擎构建过程中生成的文件,包含:
- 类和方法的名称
- 类型信息
- 其他元数据信息
2. 技术背景
- 该文件是Il2cpp将代码翻译为C++后存放类型和符号信息的文件
libil2cpp.so文件包含应用业务逻辑- 需要结合
global-metadata.dat解析才能进行有效的逆向分析
3. 开发模式判断
Unity打包APK有两种方式:
- Mono方式:可直接获取
Assembly-CSharp.dll,未加密时可轻松反编译 - IL2CPP方式:无
Assembly-CSharp.dll,需使用工具逆向
三、逆向分析技术
1. 加密判断
检查global-metadata.dat头部信息:
- 正常头部:
AF 1B B1 FA 18 - 若匹配则未加密,可直接分析
2. 逆向工具
推荐工具:
使用命令:
Il2CppDumper.exe input\libil2cpp.so input\global-metadata.dat output
3. 输出文件解析
工具生成的关键文件:
- dump.cs:包含方法、类名和字段信息
- script.json:JSON格式显示方法、类名和路由信息
- stringliteral.json:包含所有字符串详情(关键信息)
- Assembly-CSharp.dll:反编译后可得到C#代码
4. 接口分析方法
示例流程:
- 在
stringliteral.json中找到web路由(如common-activity) - 在
dump.cs中搜索相关关键词(如GetCommonActivity) - 分析获取可能的参数(如
id)
四、常见漏洞类型
1. 历史接口未下线漏洞
- 特征:老活动已下架但接口仍保留
- 危害:可能通过并发请求获取大量游戏金币
- 示例:
xxx/share/share-fudai-award接口
2. 接口通用性问题
- 背景:同一公司多个马甲包(套壳APP)使用相同后端API
- 测试方法:用A APP接口碰撞B APP接口
- 危害:可能发现隐藏接口,实现无限金币获取等
五、Cocos2d-x相关漏洞
1. 文件结构特征
assets目录下存放大量.luac文件- 这些是编译后的lua文件,可能被加密
- 文件后缀可能自定义(如
.luax等)
2. XXTEA加密解密
Cocos2d-x对lua脚本的默认加密方案:
- 算法:XXTEA
- 解密参数:
- 文件路径
- 加密sign
- 加密key
解密工具:cocos_decrypt
获取sign方法:
hexdump -C xxxxxx.luac | head -n 5
获取key方法:
strings libcocos2dcpp.so | grep -i sign值xxxx -A 3 -B 3
3. 解密后的价值信息
- 硬编码密钥:如微信secret等敏感信息
- HTTP相关算法:通常在
httpxxx.lua文件中 - 签名算法:可能包含API密钥和签名逻辑
示例签名算法:
md5Encode("request_key=" .. funtable.apihubKey .. "&request_time=" .. time .. "&request_secret=" .. funtable.apihubSecret .. laterurl)
六、完整渗透测试流程
- APK解压分析:检查
global-metadata.dat和libil2cpp.so - 逆向工程:使用Il2CppDumper获取关键信息
- 接口枚举:从输出文件中提取所有web路由
- 参数分析:通过类和方法名推断接口参数
- 漏洞测试:
- 历史接口测试
- 跨APP接口测试
- 并发请求测试
- 加密分析(如适用):
- 识别XXTEA加密
- 提取sign和key
- 解密lua脚本
- 算法还原:从解密脚本中获取签名算法
- 正常请求构造:基于解密结果构造合法请求进行深入测试
七、防御建议
-
Unity开发:
- 对关键配置文件进行加密或混淆
- 及时下线不再使用的接口
- 不同APP使用不同的接口密钥
-
Cocos2d-x开发:
- 不使用默认XXTEA加密或进行二次加密
- 避免在客户端存储敏感密钥
- 使用动态密钥生成机制
-
通用建议:
- 实施严格的接口权限控制
- 服务端进行请求频率限制
- 定期进行安全审计和渗透测试