《2022App安全检测指南.docx》由会员分享,可在线阅读,更多相关《2022App安全检测指南.docx(61页珍藏版)》请在优知文库上搜索。
1、APP安全检测指南0x01前言前一段时间业务应求,需要测试一个APP,谷歌、百度、土司和九零搜索了一下,发现这方面的资料太少了,完整的测试流程、测试概要更是没有。所以有了这篇文章。文章通过业务中的测试要点(如下图)进行了实例测试或者说明,同时参考了公司的APP测试白皮书进行了补充说明,算是一个手册吧。APP渗透测试要点(安卓)客户端程序安全安装包签二进程保护内存访问和修.反编译保护动态注入应用完整性校检通信加密组件安全证书有效性敏感信息安全数据文件通信安全关键数据加密和校检1.ogcat日志访问控制密码安全键盘劫持客户端更新安全性随机布局软键盘短信重放攻击屏幕录像越权操作密码策略设置密码复杂度
2、检测交易篡改账号登陆限制业务安全重放攻击账户锁定策略用户枚举问题验证暴力破解会话安全注入ZXSS/CSRF界面切换保护Ul信息泄露验证码安全安全退出密码修改验证其他其他ACtiVity界面劫持声明:木文章仅作为业务中的APP渗透测试指南使用,请勿用于非法行为。本文首发于土司,禁止任何人转载!谢谢!0x02测试环境SDKJavaJDK,AndroidSDK工具7zip,dex2jar,jd-gui,apktool,activity劫持测试工具等(部分工具见附录下载)0x03客户端程序安全1.安装包签名描述在Android中,包名相同的两个APK会被认为是同一个应用。当新版本覆盖旧版本时,签名证书
3、必须一致,否则会被拒绝。(即使开启了“允许未知来源的应用).如果APK没有使用自己的证书进行签名,将会失去对版本管理的主动权。本项检测是检测客户端是否经过恰当签名(正常情况下应用都应该是签名的,否则无法安装),签名是否符合规范。测试步骤使用JDK中的jarsigner.ex。检查安装包的签名,命令如下:jarsigner.exe-VerifyAPK文件路径-verbose-certs以土司APP为例,测试结果如下:sm22994FriMar3115:30:58CST2017META-INF/1.ICENSEX.509,CN=t001s,OU=tOOis,0=t001s,1.=t001s,ST=
4、t001s,C=t001s证书的有效期九17-3-26下午11:02至42-3-20下午11:02CertPath未验证:Pathdoesnotchainwithanyofthetrustanchorss34604FriMar3115:30:58CST2017META-INF/MANIFEST.MFX.509,CN=t001s,OU=tOO!s,0=t001s,1.=t001s,ST=t001s.C=t001s证书曲有唬如为H-3-26下午11:02至42-3-20下午11:02CertPath未验证:Pathdoesnotchainwithanyofthetrustanchors34633F
5、riMar3115:30:58CST2017METATNF/CERT.SF1326FriMar3115:30:58CST2017META-INFCERT.RSAs=已验证签名m二在清单中列出条目Ii=在身份作用域内至少找到了一个证书jar己验证。蹩告:二:ar包含证书链未验证的条目。如上图,说明测试结果为安全。要说明的是,只有在使用直接客户的证书签名时,才认为安全。Debug证书、第三方(如开发方)证书等等均认为风险。如下图就是认为存在风险:APK包名:com.启动组件:com.activity.MainActivity签名信息:Sm6471440TueMay1010:11:48CST2016
6、classes.dexX.509,C=US,O=Android,CN=AndroidDebug证书的有效期为16-4-18下午9:32至46-4-11下午9:32CertPath未蛤证:Pathdoesnotchainwithanyofthetrustanchors威胁等级安装包签名的威胁等级判断一般如下:若客户端安装包签名有异常(例如签名证书为第三方开发商而不是客户端发布方),此时高风险;若无异常则无风险。安全建议将安装包进行签名并检测安装包签名的异常。2.反编译保护描述测试客户端安装程序,判断是否能反编译为源代码,java代码和so文件是否存在代码混淆等保护措施。未作保护的java代码,可
7、以轻易分析其运行逻辑,并针对代码中的缺陷对客户端或服务器端进行攻击。成功的反编译将使得攻击者能够完整地分析APP的运行逻辑,尤其是相关业务接口协议、和通信加密的实现。科普smali语言是一种Android系统特有的中间代码语言。Android翻的JVM与其它常见操作系统有所区别,使用DalVik指令(可执行文件为*.dex)代替了通常的JVM中间代码(可执行文件为*.class、*.jar)。对应Dalvik指令的“汇编语言”便是smali0因此,从*.dex中恢复SnIaIi代码比恢复JAvA代码要容易,成功率更高,但可读性差。尽管如此,如果APK经过花指令处理,也会导致无法恢复smali彳
8、弼(表现为apktool解包失败)。测试步骤把apk当成ZiP并解压,得到classes,dex文件(有时可能不止一个dex文件,但文件名大多类似),如下图:TOOIs名称修改日期逊大小assets2017/7/1715:52文件夹META-INF2017/7/1715:52文件夹org2017/7/1715:52文件夹res2017/7/1715:52文件夹*AndroidManifest-XmI2017/3/3115:30XM1.g3KBQclasses.dex2017/3/3115:30DEX2,200KB1resources.arsc2017/3/3115:18ARSC文件179KB使
9、用dex2jar执行如下命令:dex2jar.batclasses.de文件路径E:APPdex2jar)dexmar.ba:casse.d:xEyPTQO(sflasses,dexthiscmdisdeprecared,usemec?j-*classes_dex2jar.jar.whileprocessfile:classes,dex1.ROOTcause:java.io.FileNotFoundException:File,classes.dex,doesnotexistatorg.apache,commons,io.FileUtils.openInputStream(FileUtils.
10、java:56)atorg.apache,commons,io.FileUtils.readFHeToByteArray(FiIeUtiIs.java:40)atcom.googlecode.dex2jar.reader.DexFileReader.readDex(DexFiIeReader.java:143)atcom.googlecode.dex2jar.v3.Main.doFile(Main.java:63)atcom.googlecode.dex2ja午v1.McjmetWE:APPT001sclasses_dex2jar.jarDon.J得至Iclasses.dex.jarTOOIs
11、名称修改日期assets2017/7/1715:52META-INF2017/7/1715:52文件夹org2017/7/1715:52文件夹res2017/7/1715:52文件夹-AndroidManifestxmI2017/3/3115:30XM1.在3KB,classes.dex2017/3/3115:30DEX文件2f200KBclassesde2jar.jar2017/7/1716:04JAR文件1,998KBresources.arsc2017/3/3115:18ARSC文件179KB然后使用jd-gui打开jar文件,即可得到JAVA代码。【注:直接使用mali2java打开a
12、pk文件,也可反编译回JaVa代码。】【注:有时用apktool能够解包并查看smali,但dex2jar却不行。如果dex2jar反编译失败,可以试试看能不能恢复SmaIi代码。】如上图,逆向后发现是没混淆的情况,是不安全的。如果代码经过混淆,或者有加壳措施,不能完整恢复源代码的,都可以认为此项安全。下图为混淆后的代码样例,除了覆写和接口以外的字段都是无意义的名称:HeMSMaMeMepfoaAmx3d8af”Jaklamxo“MbCsjE)z)团团2lEIl2)jz)团曲)z)团E)团)tgz)tgz)l(z)(-囹S-ffiffi-卧-9-e-ffiS-囹-囹S-ffi8-ffi-即ab
13、.dassaa.cbssae.8ssaf.dassag.chss.dassa1.cbssac.dasspackagecon.hexview.android.senspector;publicfinalclassac(publiclonga;publicbyte)b:publicintc:publicfinalStringa(ntprntfStringparaaStrog)IInt10;thi.cpranlnc;Stringcr2;IfpraxString.legth)-0)(str2Valueexpected*;returntr2;)IC:Sule(true)(tryIntJ-Integer.4ecode.InrVaiueo:Iffswitch(parasdnc)(default:returneIavallddatatype;casO:case1:C*?威胁等级若客户端进行加壳保护,此时认为无风险。若大部分代码(包括核心代码)经过混淆,此时低风险。若部分代码混淆,关键代码(加密或通信等)可以获知其关键代码,此时中风险。安全建议建议客户端程序可以把关键代码以JNl方式放在so库里。so库中是经过编译的arm汇编代码,可以对其进行加壳保护,以防止逆向分析。3.应用完整性校检描述