我们用burp抓包发现
饿了么每一个客户端的数据包都会附加一个签名sig
如果你篡改POST或者GET过去的任意一个参数
都会返回一个
猜测他的机制应该是数据本地加上签名校验
然后发送到server端用相同的算法进行签名验证 如果传过去的sig不等于数据在server端加密后的期望值,返回一个签名错误。
所以我们现在想破解用户数据( WooYun: 饿了么客户端设计缺陷可影响用户帐号安全 )
也不能狂打人家电话了( WooYun: 饿了么手机验证可做电话轰炸(呼死你) )
更不能免费吃喝( WooYun: 饿了么逻辑漏洞之免费吃喝不是梦 )
那么这个算法是否具有弱点呢?
我们打开jeb逆向看看
搜索sig" 很快定位到关键点
跟入
发现sig字段是由s.a处理的
继续跟过去
可以看到这里它load System.loadLibrary("signer");
也就是使用了.so文件报装他的算法
private static native String sign(s this, String arg1, Context arg2) {
}
然后传入签名
我们解包看看这个so库
apktool d -d eleme.apk
在/lib/armeabi下找到那个库
libsigner.so
IDA Pro分析下 发现是可以反汇编的
图中我们可以看到decode2String 跟踪过去
所以decode是主要流程 //其实这里挺奇怪的,按理说签名算法应该是encode,为何这里是decode
肯定有鬼,我们跟踪过去看看
首先可以看出的是作者煞费苦心地利用java反射机制 调用JNI使用了一系列java原有的方法进行混淆
然后问题在这
这段数据是硬编码到so文件里面的,然后它调用各种JNI方法的作用无非就是想混淆,增加破解难度
不过这个算法由于密码学误用,依然的是可以破解的
逆向之后我得到了一个key
其中key就是调用一大堆冗杂的jni生成的一段hash
有了key 我们就能用来加密,构造服务器所信任的恶意请求
那到底是怎样加密我们的请求的呢
我们先用某神器插桩监控下这个调用
可以看到其实就是
MD5(getUrl+key)
可以看到我们构造任意链接都不再抛出签名错误
看看发动电话攻击
可以看到在拨打电话之前是有验证注册与否的
但是我们现在可以伪造号码,加上后端没有拨打限制次数
所以我们可以直接伪造了
这时候我们终于可以撞库:
至于免费领取早餐午餐晚餐活动,
相信只要活动出现,自然可以篡改数据施展攻击
撞库脚本
可以看到我们构造任意链接都不再抛出签名错误
看看发动电话攻击
可以看到在拨打电话之前是有验证注册与否的
但是我们现在可以伪造号码,加上后端没有拨打限制次数
所以我们可以直接伪造了
这时候我们终于可以撞库:
至于免费领取早餐午餐晚餐活动,
相信只要活动一出现,自然是可以篡改数据完成