前言:前些阵子因为疫情蔓延的关系,大家基本都在家自我隔离&远程办公。微信好友张三让我帮忙测试他们公司开发的房地产工程建设相关的APP客户端等相关测试项目。看看客户端的安全性可以过关不。顺便也写出自己之前渗透测试一些其他厂商的APP客户端的过程,双倍稿费不多,所以一定要趁早。本文测试流程仅为个人的思路想法。本文会以这个APP为出发点、也会拓扑出一些其他的移动客户端测试小技巧分支出来。希望各位大佬喜欢!
准备工具:
Android Studio、MT管理器、
抓包工具:Burp Suite or Fiddler
环境:逍遥模拟器(Andorid 7)
Xposed框架、JustTrustMe(关闭SSL证书验证)
一、设置网络代理&安装好CA证书
1.逍遥模拟器=>设置=>WLAN=>长按热点名称=>修改网络 配置如下图所示。
2.设置代理监听端口
3.访问http://burp 下载CA证书安装,安装证书需要设置模拟器PIN码锁。安装证书之后访问baidu.com 。在Burp Suite就可以看到已经可以成功抓到了https的数据包。
二、模拟器安装Xposed 框架 和JustTrustMe模块重启手机
Android 7.1 64位不能正常安装Xposed,请选择Android 7.1(预览版)
重启安卓模拟器设备设备
框架安装完成之后,安装JustTrustMe模块(禁止SSL验证)打勾模块然后重启模拟器
三、开始渗透测试
模拟器安装apk之后打开apk,打开app可以正常抓到数据包,因为这个app有SSL验证所以不安装JustTrustMe模块禁用SSL 可能会抓不到数据包。
1.短信验证码安全性测试
(1)漏洞1-短信验证码轰炸漏洞
没有设置图形验证码/滑动验证码等 ,只在后端进行了限制发送次数,可以通过手机尾号+”/n”,修改cookie来实现绕过。
(2)漏洞1-任意用户注册
可以清楚看到返回数据包中的字典”num” 就是验证码信息。
危害:可以导致批量注册任意用户(一堆僵尸账号)
(3)漏洞2-任意用户密码重置
重置密码验证码直接回显在返回的数据包中,导致任意用户密码可以被重置。
2.任意文件上传测试
(1)曲折的用户头像任意文件上传
(正常头像上传)
上传文件没有地址路径回显很尴尬
(phpinfo文件成功上传 后端没有对上传文件后缀名黑名单验证???喵喵喵)
修改上传文件名和文件内容 重新上传成功,但是不知道路径有点尴尬。
后来发现天无绝人之路,可以明显看到用户上传的头像会被重命名,20200306235208248.png这个名字一看,用脚趾头想都知道是按照时间戳来重命名了用户上传的文件。为了方便快捷验证文件上传漏洞,这里用python写了一个工具来跑这个phpinfo();地址,代码也非常简单:
import requests
id = 20200306235208248while True:
url = "http://www.**************.com/*******/upload/userInfoCover/{}.php".format(id)
id += 1r=requests.get(url=url,headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"})
if int(r.status_code)== int(200):
print(url)
break else:
pass
跑了大概30分钟找到了phpinfo地址:http://************.com/****/upload/**************/20200306235314618.php
项目测试时候尽量别上传一句话/webshell免到时候你洗不干净
3.订单支付绕过漏洞
(1)APP订单支付绕过
这个漏洞位置主要发生在: 新用户完成初始化注册的时候、完善个人资料,完善个人资料可以获得积200的积分,只要不断完善个人资料就能源源不断获取积分。然后积分可以代替法币来开通会员。
17296月 / 24月 = 720年
2022+720=2742年(可以送走好几代人)
(2)H5商城订单支付绕过(H5商城未必真的安全)
这里需要使用另外一个抓包工具(Fiddler https://www.telerik.com/fiddler 可以抓比较完整的信息流)。这种的订单支付漏洞比较特殊,他漏洞不存在于你部署的支付接口的SDK接口中,你修改什么参数都不会绕过去,什么数量\价格为负数,等等都不会绕过。但是这还是存在着漏洞,但是这种漏洞一般作用于虚拟商品,比如PornHub的收费影片、喜马拉雅的收费音频、知乎的Live、Freebuf的精品公开课、某出版社的电子书等等。对实体商品影响不大。
事情是因为疫情期间在家学习,发现有个出版社可以领取优惠卷免费购买电子书
一个账号只能购买5本电子书。且不能再电脑端阅读,影响阅读体验。为此就出此下策。
打开Fiddler进行相关设置 :
Tools ==>Capture Https CONNECTs(✔)/Decrypt HTTPS traffic(✔)
PC端登录微信;点击商城链接;
打开后是这样子的:
我们随便打开一本电子书,点击购买
(你尝试修改啥都没用,你想到的别人都替你想到了)
这个请求会返回包含表单内所有书单书名的JSON数据包;
发现这个请求是读取电子书的目录
每一本书都有一个指定的book_id
bizData[ebook_id]=e_5dfc36588ff4a_K4N5RBZ6
当测试人员点击”立即阅读”的时候,会向xxxxxx.com//get_ebook_content POST 当前这本书的book_id。来获取这本书的目录。以及资源文件。
book_id 拼接后 的下载链接如下:
http://**************.com/******************/ebook/[book_id]/1576810082/OPS/copyright.xhtml
漏洞验证:
这样子就可以愉快在电脑上面阅读了我购买的五本的电子书了。同时也发现只要有付费书籍的book_id也可以进行爬取,这就导致了测试者在测试商城的时候可以不用购买书籍也可以阅读书籍。导致另类的订单支付接口漏洞。
漏洞分析:
这个漏洞主要发生在厂商的微信公众号上的H5平台上和支付接口SDK没有任何关系,只是对资源文件的保护没有做好,而且商城H5书单没有对敏感目录设置token 口令访问验证 ,导致可以任意爬取商城内的所有书籍。相同的这个类型的漏洞也发生在一些知名的互联网厂商企业身上,当然名字不能说,虾仁猪心。
4.代码安全-APP客户端root 检测绕过(以中国建设银行客户端为例)
部分APP 不能在root设备上面运行,比如中国建设银行客户端就不能在root设备上运行,为此来以此“中国建设银行客户端”为案例进行剖析,
(加固信息/疑似伪加固)
点击查看=>Dex编辑器++++=>检索关键词“root”
留意到最后一个
package com.secneo.apkwrapper;
public final class a { public static final String[] a = {"com.noshufou.android.su", "com.noshufou.android.su.elite", "eu.chainfire.supersu", "com.koushikdutta.superuser", "com.thirdparty.superuser", "com.yellowes.su"}; public static final String[] b = {"com.koushikdutta.rommanager", "com.koushikdutta.rommanager.license", "com.dimonvideo.luckypatcher", "com.chelpus.lackypatch", "com.ramdroid.appquarantine", "com.ramdroid.appquarantinepro"}; public static final String[] c = {"com.devadvance.rootcloak", "com.devadvance.rootcloakplus", "de.robv.android.xposed.installer", "com.saurik.substrate", "com.zachspong.temprootremovejb", "com.amphoras.hidemyroot", "com.amphoras.hidemyrootadfree", "com.formyhm.hiderootPremium", "com.formyhm.hideroot"}; public static final String[] d = {"/data/local/", "/data/local/bin/", "/data/local/xbin/", "/sbin/", "/su/bin/", "/system/bin/", "/system/bin/.ext/", "/system/bin/failsafe/", "/system/sd/xbin/", "/system/usr/we-need-root/"
第一行是知名root管理的软件包名,第二行是root获取的软件包名。第三行第四行均是相关只有root权限才能访问的目录。
那么如何绕过中国建设银行客户端的root检测,让中国建设银行客户端也可以在已root设备上面正常运行呢???
第一种方法,MT管理器 访问手机目录”/system/xbin/”。
删除su 文件,然后重启手机再重新打开即可绕过中国建设银行的root检测,因为su文件不存在,但是也会导致你无法重新访问手机根目录(慎用)。
第二种方法、Hook 方式绕过中国建设银行root检测
HookMain2的方法代码:
public class HookMain2 implements IXposedHookLoadPackage {
private static String TAG = HookMain2.class.getSimpleName();@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpParam) throws Throwable {
if (!XPrefUtils.ignoreCBCWarnEnable()) {
return;}
if ("com.chinamworld.main".equals(lpParam.packageName)) {
/*过滤中国建设银行客户端客户端 APP 包名*/getClassLoader(lpParam);/*调用getClassLoader "获取类加载"的方法*/}
}
这个是在进程中捕获中国建设银行客户端的包名(com.chinamworld.main)、如果捕获到相关包名进程则 调用getClassLoader的方法代码:
private void getClassLoader(final XC_LoadPackage.LoadPackageParam lpParam) {
try {
XposedBridge.log("==========================================\n成功获取到相关加载类名!!!");String className = "com.secneo.apkwrapper.ApplicationWrapper";/*加载类名*/Class clazz = lpParam.classLoader.loadClass(className); if (clazz != null) {
XposedHelpers.findAndHookMethod(clazz,"attachBaseContext", Context.class, new XC_MethodHook() {
@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);Context context = (Context) param.args[0];ClassLoader classLoader = context.getClassLoader(); if ("com.chinamworld.main".equals(lpParam.packageName)) {
XposedBridge.log("成功在到此设备检测到中国建设银行客户端运行");hookMainActivity(classLoader);XposedBridge.log("中国建设银行 绕过成功");}
}
});}
} catch (Exception e) {
LogUtil.e(TAG, "getClassLoader error: " + e.getLocalizedMessage());}
}
hookMainActivity核心代码
private void hookMainActivity(ClassLoader classLoader) throws ClassNotFoundException {
XposedBridge.log("尝试Hook绕过!!!");/*中国建设银行-Hook劫持绕过Root检测*/String className = "com.ccb.start.MainActivity";Class loadClass = classLoader.loadClass(className);XposedHelpers.findAndHookMethod(loadClass, "checkRoot", Context.class, new XC_MethodReplacement() {
@Overrideprotected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
return null;}
});XposedBridge.log("Hook 绕过成功!!!");}
}
replaceHookedMethod 会完全替换返回checkRoot 原方法的值为null,则root状态为false ,否则为ture,弹出设备已root警告=>强制退出客户端
Xposed 日志:
可以看到已经成功绕过中国建设银行root检测,至于危害性有多大需要根据攻击者的自身的实力来断定;攻击者可以利用绕过中国建设银行的噱头来骗取小白安装,然后在模块中嵌入一个后门(https://blog.csdn.net/ALDYS4/article/details/102878693),实现反弹shell ,Metasplot 植入Xposed 模块反弹shell
(物理机真机测试)
视频效果:传送门
危害有多大取决于那个人的知识面有多广,如果他愿意他甚至可以Hook你的键盘读取的密码,让你蒙受经济损失 。
总结:
我个人觉得APP 测试在一定程度上和Web测试差不多,毕竟很多都是H5写的。其次就是思维挺重要,虽然一些支付接口SDK坚不可摧,但是可以换一种姿势来挖掘、前后端校验都需要检查仔细、其次是Token口令的生存日期以前访问权限要控制好,最后是代码安全,虽然不知道有时候你root检测反而会给不发分子打开一个大门。移动端还有很多地方可以测试,比如小程序、微信公众号、老版本客户端等等。
参考链接:
https://www.freebuf.com/articles/terminal/114910.html
https://www.freebuf.com/sectool/167274.html
*本文原创作者:艾登——皮尔斯,本文属于FreeBuf原创奖励计划,未经许可禁止转载
来源:freebuf.com 2020-03-23 09:30:11 by: 艾登——皮尔斯
请登录后发表评论
注册