美文网首页iOS逆向开发IOS程序员
iOS自己动手篡改APP网络请求及简单防护

iOS自己动手篡改APP网络请求及简单防护

作者: ericze | 来源:发表于2016-11-11 17:54 被阅读2594次

前言

在开始谈技术干货之前,先大概说一下这次公司APP安全风波的始末,甩锅的理由有三,其一:创业公司凡事讲究敏捷开发,快速迭代上线,因此在完成功能需求之余无暇他顾;其二:安全问题应该为技术总监着重考虑的一点,但是(按照惯例,这里省略N字,不可描述);其三:后台接口定义也没有考虑到这一点,然而,从不要随便甩锅的好习惯来说,我还是要负起责任的,毕竟自己是iOS负责人,要对APP有个全面的把握.

简单的讲下事情经过,就是突然有一天下午,一个用户打电话给客服说自己买了一张998元的机票买错了,想退票,要求公司给他取消订单退钱,然后还把支付宝的网页支付记录发了过来(后来证实是PS过的).然后财务部那边查账之后发现这个用户的支付宝账号确实付款了,但实际付款的只有1元,然后公司财务就把事情反馈给了副总,然后整个技术部就炸锅了,都在各抒己见分析这个1元钱是怎么通过APP付款到公司账户的,因为机票订单是没有1元的.而且APP和支付宝给后台的回调都是支付成功的.根据唯物主义思想来推断,支付宝出错的概率远小于我们APP出错的概率,而且后台也没有被攻入的迹象,因此就把问题锁定在APP上了,然后我们用的POST请求(一些人说比较安全,其实不加密的话,安全性和GET请求比起来相差无几),我们部门的首席科学家直接说APP肯定是被反编译了,原话是"我找我阿里的朋友帮忙,分分钟就把APP反编译了,然后随便下单."当时听了这话我是懵逼的,虽然从技术可操作性来说,存在反编译的可能,但是分分钟不费吹灰之力就反编译这种说法我是不太能接受的,然后就有了后边我自己攻击自己APP的举动.

正题

我的分析就是反编译太麻烦,不容易实施,而且即使反编译出来了,一个类名一个方法名的去解析APP也很累,所以就从相对好实施的篡改网络请求及返回数据下手!之前看过唐巧大神的一篇关于Charles的使用讲解,不过当时是用来简单的抓别人的包,用点数据就放下了,现在就拿来实践一下篡改数据这个功能,首先安装好Charles,然后按部就班的把Charles设置为自己mac电脑的代理,

img
然后手机连自己电脑wifi,或者跟电脑连接同一个wifi都可以,然后设置手机的代理,让你手机的网络请求都经过Charles,服务器里填写的是电脑的IP地址, img 端口默认的就是8888: img
这样就可以抓到APP跟服务器之间的网络请求了.然后在查看请求之后去使用篡改功能,这里就演示一下篡改一个页面的数据 img 这里的第一个票价是12500,下边是拦截到的请求 img 给这个IP地址对应的8080端口的请求都加上断点,点击那个Breakpoints,然后当下一次请求进来的时候,就可以直接篡改数据 img 篡改数据的步骤可以看下方的gif图:
img 之后点击"Execute",返回给APP数据,这样APP展示的页面就变成了: img 到这里用户的骗术就被还原了,当然后边还需要篡改一些数据才能成功去下单支付这个1元订单,细节就不在赘述了 img 那个支付宝支付显示不全是因为iOS10字变宽了,当然支付成功之后的心情是很复杂的,毕竟自己的APP被这么轻易搞出问题了,大家可以设身处地想一下哈,后边重点来了,讲解一下小公司的解决方案.
因为开发压力比较大,所以要考虑性价比比较高的方案,这里就暂时舍弃了HTTPS,运用了实施起来相对简单的MD5加密,这里有两种情况,下载加密和上传加密,比如说刚才看到的订单列表就属于下载加密,要确保订单列表数据一旦被篡改就不去使用,而点击立即支付的下单动作就是上传加密,要确保传给服务器的下单参数一旦被篡改就不去使用,MD5加密的原理就不在这里讲了,因为我之前的文章JSPatch里已经讲过了,主要说一下具体的实施细节以及过程中遇到的小坑,首先是下载加密: img
我用的网络请求是自己封装的AFN,然后这里设置一下直接字符串取值,不要转成JSON:manager.responseSerializer = [AFHTTPResponseSerializer serializer];
取出HTTP Header里的验证字串:
NSDictionary *headerDic = [operation.response allHeaderFields];
NSString *rsaValue = headerDic[@"rsaValue"];
然后取值:NSString *responseObjectStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
加密:NSString *md5Str = [NSString stringWithFormat:@"%@%@", responseObjectStr, md5SaltValue];
然后进行比对校验[[md5Str getMd5_32Bit] isEqualToString:headerDic[@"rsaValue"]]
然后是上传加密: img
把所有参数转换为String:String *jsonString = [self.orderModel yy_modelToJSONString];
加密:NSString *md5Value = [[NSString stringWithFormat:@"%@%@",jsonString,md5SaltValue] getMd5_32Bit];
设置请求头:[manager.requestSerializer setValue:md5Value forHTTPHeaderField:@"rsaValue"];
到这里,这篇文章算是告一段落,后边应该会更新一系列安全相关的文章,不过需要一个我去学习然后理解然后实践的过程~下一篇是动手去反编译自己APP开始踩坑之旅.当然都是我自己的浅显青铜操作,欢迎同学们指点及大神们一笑而过.

相关文章

  • iOS自己动手篡改APP网络请求及简单防护

    前言 在开始谈技术干货之前,先大概说一下这次公司APP安全风波的始末,甩锅的理由有三,其一:创业公司凡事讲究敏捷开...

  • 2018-05-17

    ios网络请求,之前从来没有接触过iOS,最近要做一个app,做到网络请求这(就是通过URL来请求数据),自己总结...

  • APP网络请求分析(react native角度)

    概要 本章记录APP网络请求参数作用 一、APP网络请求。 简单来讲(常用的口头区分),APP网络请求分为get ...

  • Android 快速实现网络监听

    okhttp抓包实现网络监听 抓取自身APP的网络请求,方便测试、后端、及自己调试查看APP的网络请求情况 git...

  • iOS编程由于系统升级导致奔溃

    iOS9起,新特性要求App访问网络请求,要采用 HTTPS 协议。 解决办法(允许app采用http): iOS...

  • iOS 清除cookie

    ios app 在进行网络请求,接口中请求头中需要Authorization 参数,并且还有过期时间,测试Aut...

  • ios开发的一些建议

    第一、一定要自己去设计一个项目框架,通过ios原生,自己动手,了解:网络请求这一块的内容,对于NSURLSessi...

  • Android 网络安全:URL签名验证的实现API防篡改

    我们在做APP开发的时候,APP的网络安全是极其重要,我们有必要对请求的API进行加密和防篡改。HTTPS是一个很...

  • IOS 网络请求 - 1

    简单的网络请求 IOS 9 开始不支持 http, http请求需要改动 Info.lsitimage.png

  • iOS网络框架简单封装

    AFN 简单封装--iOS重构-轻量级的网络请求封装实践 YTKNetworking 网络框架封装源码解析:网络层...

网友评论

  • 午马丶:你好,上传加密用md5后台如何获取里面的信息啊:joy:
    ericze:@A丶 通过约定好的盐值进行解密:smiley:
  • c5812a5bad7e:问一下 ,如文章所说的情况,如何保证服务端和客户端MD5加密时的盐值是相同的?,如果传递盐值的话 那会不会同样拦截掉,然后修改数据+修改后的MD5盐值加密值
    ericze:@编号26258 盐值是在项目里存储的,后台也是在他的项目里放的,不能把盐值传递出去的,我们之前是这个方案,当然肯定还有更安全的做法
  • as_kj:这个只能防止修改网路数据的情况,对于修改app的情况,可能效果就不大了
  • 91d311374b79:对于这个数据安全传输 我们项目用的是rsa双向加密 没用https 手机端对加密数据 解密 调接口在加密发送出去 其中一些重要接口还有一些完整性效验 但是各种加密传输造成app明显卡顿 很无奈 另外我们支付全是后台处理 支付的时候调用 后台写接口
  • derekibw:我们支付这一块都是用了RSA二次加密,没有加密机制的支付无异于裸奔呀!
  • dongwenbo:刚好要做支付,前端做的校验,后端必须全部再进行校验,特别是涉及到钱的,如果没有https,又不加密数据,后端不校验数据,肯定是极不安全的。
    dongwenbo:@ericze 嗯嗯,一起研究!
    ericze:@dongwenbo 有什么细节问题欢迎一起讨论:smile:
    ericze:@dongwenbo 嗯,安全方面要前后端统筹兼顾
  • ericze:统一回复大家一下,之前的环节是有个竞拍过程的,然后生成订单前是没有航班id或者订单id的,所以这个金额之前是要传递的,然后现在业务有变动实现方法当然也随之变动。然后文章标题就是写这篇文章的意义……
  • 大灰灰iOS::joy:HTTPS的话啥事都没有。。成本应该没那么大
    ericze:嗯啊,以后会越来越好:smile:
    大灰灰iOS:@ericze 上面都回复过了。。不过还是得跟你说,这种事要据理力争,校验之类的要保证安全性必须在服务器做啊。。。
    ericze:@大灰灰iOS 然而老大没发话:persevere:
  • 9808f2c53707:只能说这app支付做的太儿戏了吧,后台也不管 :joy:
    ericze:@万里皓月25 :persevere:
  • ericze:@戴仓薯 主要是切仓跟个人购买不太一样,一种类似携程上边那种不经常变动,另外一种可能半个小时价格就过期了
  • 戴仓薯:感谢分享,不过还是有点疑惑~ 我上份工作在某家 OTA ,虽然不在卖机票的部门,但也是买某种票。我理解的是,app 端只能告诉后台要买哪张票,具体的价格应该是后台查数据库等查出来,而不是 app 端传多少就该付多少钱;这样 app 端把接口数据篡改了,只能更改 app 里的显示,不应该影响直接付的金额呀。整个流程大概是:

    app 告诉后台产品、票种和数量 -> 后台去计算付款金额,生成一个付款 token -> app 拿到 token 去支付。整个过程 app 都是不上传金额的,只管显示。

    其实我我觉得最关键的还不是黑客,毕竟校验可以解决黑客问题。主要是像机票这种东西是会频繁变价的;如果我在 app 下单页面停留了很久,再支付的时候实际价格已变,如果是根据 app 传给后台的金额来支付,那我支付的价格就是过期的,对吧~
    路过河边:@戴仓薯 同意
    ericze:@戴仓薯 对对对,我们现在机票是分两种的,一种是订好的,一种需要临时出价,然后下单支付分别都有超时时间控制
  • MFL:其实问题有两点,一.服务器和客户端都没有对数据进行校验签名。 二.第三方支付的签名流程应该交由服务器完成。
    ericze:@MFL 对的,如果都加上校验就不会出现这个问题,然后那个支付的签名流程为什么放到客户端做,是上一年的历史遗留问题,因为当时的后台决定的要放在客户端做:pensive:
  • 佛克斯:我觉得写的不错,支持写更多这方面的文章
    ericze:@佛克斯 谢谢支持,我会继续努力的,我的理念就是自己先做好了,发现有可分享交流的细节,然后再去分享:grin:
  • a9a148e00a8d:有点水文章,难道你们后台对于应用提交的订单数据不进行校验?
    ericze:@隔壁老王jp 不过还是谢谢评论:smile:
    ericze:@隔壁老王jp 我理解的水文章是复制粘贴,或者讲点那种讲的很空没有实质帮助的东西,我这个图文并茂讲一下自己遇到的坑也算水文章啊,至少我百度一下也没有几篇讲的很细致的解决方案:sweat:
    ericze:@隔壁老王jp 你说的检验是指什么检验,具体细节能否讲一下,检验说的有点有点虚了

本文标题:iOS自己动手篡改APP网络请求及简单防护

本文链接:https://www.haomeiwen.com/subject/ywxxpttx.html