乐于分享
好东西不私藏

【APP实战】两个APP漏洞实战案例分享

【APP实战】两个APP漏洞实战案例分享

📝 编者语

很多漏洞并不来自“高深技术”,而是来自一次认真测试。本次分享的两个 APP 漏洞案例,均整理自学员实战过程,希望能给刚接触移动安全的同学一些启发。

1

案例一:一次“负分评价”导致的APP DOS漏洞

漏洞背景

某APP中存在用户评分功能,正常情况下,用户可以对目标对象进行打分评价。

学员在测试过程中发现:

客户端虽然限制了评分范围,但服务端似乎并没有进行严格校验。

于是,一个经典问题出现了:

“如果我传个负数会怎样?”

然后,事情开始变得有意思了。

测试环境

为了方便分析,建议搭建了如下抓包环境:

工具

用途

Postern

手机代理转发

Charles

HTTPS 抓包

BurpSuite

请求修改与重放

第一步:定位功能点

打开APP后,可以看到存在“用户评分”功能。

于是目标明确:

找到评分请求。

第二步:抓取数据包

在 BurpSuite 开启抓包后,点击“提交评分”,成功捕获到如下请求:

POST /xx/xxByApp?ve=1&source=&token=xx&client=2&clientVersion=627 HTTP/1.1

Host: xx.xx.com

Charset: UTF-8

Content-Type: application/json

User-Agent: okhttp/3.10.0

{

 "AccountID":"H547",

 "Score":5,

 "ScoreLabel":"8778|8779|8780|8781|8782|8783",

 "EvaluateContent":"",

 "IsAnonymity":1

}

【图片:BurpSuite 抓到评分请求的数据包截图】

到这里,一个经典测试点已经非常明显:

  • Score 是否只允许固定范围?

  • 服务端是否真正做了校验?

  • 客户端限制是否可以绕过?

进行了一个朴实无华的操作:

"Score": -10

没错。

直接改成负数。

漏洞触发结果

请求发送后,接口返回正常。

表面上看,好像什么都没发生。

但当再次进入对应用户评价页面时,异常出现了:

  • 用户评价无法正常显示

  • 页面出现异常

  • 功能访问异常

简单来说:

目标用户的评价模块被“打坏了”。

漏洞核心原因分析

这个问题的根源非常典型:

问题点

说明

仅客户端限制

前端限制评分范围

服务端缺少校验

未验证 Score 合法性

异常数据入库

负数成功进入业务逻辑

页面渲染异常

导致后续展示失败

很多 APP 在开发过程中,会默认:

“客户端不会传奇怪数据。”

但安全测试的核心思路恰恰是:

“我就想传点奇怪数据试试。”

于是漏洞就出现了。

2

案例二:APP 组件暴露导致的本地拒绝服务漏洞

漏洞背景

Android 四大组件暴露问题,一直都是移动安全里非常经典的一类问题。

很多开发同学在配置 AndroidManifest.xml 时:

  • export 默认开了

  • Activity 未做权限限制

  • 调试组件忘记关闭

  • 第三方 SDK 组件直接暴露

然后攻击面就悄悄出现了。

本次案例中,通过drozer对目标APP进行安全测试时,发现存在可被外部启动的Activity。

最终成功造成APP DOS。

测试工具

本次案例使用到的工具如下:

工具

用途

drozer

Android 安全测试框架

adb

调试与组件调用

Android 测试机

漏洞验证

第一步:获取 APP 基本信息

安装目标APP后,首先使用drozer获取应用信息:

run app.package.info -a cn.xx.android

随后继续分析攻击面:

run app.package.attacksurface cn.xx.android

第二步:分析组件暴露情况

接着,进一步查看 Activity 信息:

run app.activity.info -a cn.xx.android

这里发现存在可导出的 Activity:

cn.xx.android.wxapi.WXPayEntryActivity

看到这里,安全测试人员的DNA基本已经动了。

因为:

很多支付、登录、回调类组件,往往最容易因为配置问题出现风险。

第三步:尝试直接启动 Activity

直接使用 drozer 启动该组件:

run app.activity.start --component cn.xx.android cn.xx.android.wxapi.WXPayEntryActivity

结果:

APP 出现异常。

DOS 成功。

第四步:使用 adb 验证

为了进一步验证漏洞稳定性,继续通过 adb 执行组件调用:

adb shell am start -n cn.xx.android/cn.xx.android.wxapi.WXPayEntryActivity

再次触发异常。

漏洞验证完成。

漏洞成因分析

该问题本质上属于:

Activity 组件暴露 + 异常逻辑缺失

其核心问题通常包括:

风险点

说明

风险点

说明

Activity exported

外部应用可直接调用

未校验调用来源

任意 APP 可启动

参数状态异常

组件缺少上下文校验

异常处理不足

导致 APP 崩溃或异常

3

分析总结

两个案例的共同特点

虽然这两个案例类型不同:

  • 一个偏业务逻辑

  • 一个偏 Android 组件安全

但它们有一个非常明显的共同点:

都不复杂

没有高深逆向。

没有复杂加密。

没有 Native 层利用。

更多是:

  • 基础测试思维

  • 对异常场景的敏感度

  • 对攻击面的耐心排查

很多时候,APP 安全测试真正的门槛并不是“技术太难”。

而是:

大部分人没有真正系统地去练。

给刚开始学 APP 安全同学的一些建议

1、先把抓包练熟

很多漏洞的起点,其实就是:

“先看到请求。”

推荐优先熟悉:

  • BurpSuite

  • Charles

  • HttpCanary

  • Postern

2、重点练参数测试

尤其是:

测试类型

示例

边界值    -1 / 0 / 超长    

类型异常    null / 数组 / 对象    

权限测试    越权 ID    

状态异常    重放请求    

很多业务漏洞,都是这样挖出来的。

3、多关注 Android 组件安全

重点关注:

  • exported

  • intent

  • deeplink

  • WebView

  • ContentProvider

  • FileProvider

这些地方,经常能出现不错的问题。

4、别总想着“一步到位”

很多同学一开始就想:

  • Hook 全场

  • 秒杀加固

  • Native 层 RCE

结果最后连抓包都还没配通。

其实安全学习很像健身。

大部分时候:

基础动作重复练,反而提升最快。

结语

这次分享的两个案例,本质上都属于 APP 安全测试中的“经典基础问题”。

但也正因为经典,所以它们一直真实存在。

很多漏洞,并不是因为攻击者技术多么夸张。

而是因为:

有人认真测了。

而这,也是很多测试人员在真正进入实战学习后最大的变化:

开始学会:

  • 如何观察攻击面

  • 如何分析业务逻辑

  • 如何验证异常场景

  • 如何把“感觉不对劲”变成“漏洞成立”

这其实就是安全能力真正开始形成的过程。

🎁 文末福利

联系客服获取《常见低危漏洞汇总》

!

微信号丨Hiddenfog001