先来看看今天的受害者:git
aHR0cDovL3d3dy5taWd1dmlkZW8uY29tL21ncy93ZWJzaXRlL3ByZC9pbmRleC5odG1s算法
此次分析的是他登录的三个参数,先分析登录逻辑,抓个包看看。json
能够看到这里用的是弹出的窗口登录【图1-1】,为了不主页其余元素的干扰抓包,咱们能够经过右键 查看框架源代码 的方式打开登录框分析抓包【图1-2】。浏览器
把打开的源代码页面地址栏中的 view-source:
删除便可打开如下页面【图1-3】:服务器
接下来用错误的帐号密码登录一波,能够看到以下的包【图1-4】,不过经过上面的 publickey 隐隐猜到这里的加密参数可能和 RSA 有关,先来找找密码加密的位置:框架
照常搜索一下 enpassword
,预料之中是没有搜索到有用的结果【图1-5】,不过定位元素能够经过 name 定位 也能够经过 class 定位,因此一样试试 J_RsaPsd
,果真找到像样的文件了【图1-6】。学习
在打开的文件里检索J_RsaPsd
,能够看到有3个相关的结果(熟悉加密的已经能够看出这里是 RSA 加密),咱们经过把全部相关的结果都打上断点【图1-6】,并经过从新发起一次登陆请求,来判断哪一个J_RsaPsd
是密码的加密逻辑。测试
经过从新发起请求,断点断在 333 行【图1-8】。网站
咱们先复制整段代码:ui
c.setPublic(a.result.modulus, a.result.publicExponent);
var d = c.encrypt(b.val());
b.siblings(".J_RsaPsd").val(d)
复制代码
咱们经过控制台看看这些参数分别是什么【图1-9】。
经过前文抓包和JS页面的代码,咱们判断密码的加密是RSA加密,因此咱们就须要找齐RSA加密的须要的几个要素,好比他的公钥 ,由于RSA是非对称加密本地使用公钥加密,服务器上使用私钥解密。再看看【图1-8】上的几个参数不知道大家有没想起开头【图1-4】我说起的那条抓包。咱们切换到 控制台-Network 看看【图1-10】。
{"status":2000,"message":"","header":{},"result":{"publicExponent":"010001","modulus":"00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817"}}
复制代码
是否是和咱们在【图1-9】中打印出来的数值彻底相同
tip : 这里的b.val()
是我输入的错误密码。
这里咱们找齐了加密须要的参数,其实我以为不必扣JS,可是我知道。。
不要我以为,你要你以为
因此偷懒用以前扣的代码测试一下:
-----------此处省略500行-----------
function bodyRSA() {
//setMaxDigits(130);
var key = RSAUtils.getKeyPair("010001","","00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817");
return key
}
function get_encrypt(password) {
key = bodyRSA();
var a = RSAUtils.encryptedString(key,password)
//var b = RSAUtils.encryptedString(key,username)
console.log(a)
console.log('----------------------------------')
//console.log(b)
return a
}
get_encrypt('11111111111')
复制代码
根据第一部分的【图1-5】和图【1-6】能够很快定位加密的位置,这里就不说了【图2-1】。
追进去分析一下rsaFingerprint
的逻辑,能够看到其实和密码加密用的是同样的RSA加密【图2-2】只是部分参数不一样。
这里比较疑惑的是$.fingerprint.result
和$.fingerprint.details
是怎么来的。
经过检索$.fingerprint
根据查找的结果找到他的位置【图2-3】
继续向上查找,最终找到这里,发现是根据浏览器的请求头等信息生成的一串哈希值【图2-4】。
这个值若是不修改请求头信息,那么这个值就是固定不变的,若是修改请求头信息,那么就须要从新生成这段hash,这就是这个的浏览器指纹信息。
由于咱们这里只是抱着学习的态度学习,因此就不瞎搞,不过这个整段的代码也比较简单没事能够扣一扣。
tip: 若是想要分析这个指纹的算法,记得要刷新一下页面才能够进入断点。
结合以前的建议,文章的配图都标注了序号,但愿可以起到必定梳理思路的做用。
这个网站的加密整体仍是只用RSA的加密算法就能够搞定了,总体加密算法比较简单有经验的老哥直接经过加密库就能够实现,若是想练练手的也能够抠出来试试,只要头发多,肝就完事了。