兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解

  • A+
所属分类:安全博客
摘要

好久没有写爬虫文章了,今晚上得空看了一下陆金所登录密码加密,这个网站js加密代码不难,适合练手,篇幅有限,完整js代码我放在了这里从今天开始种树,不废话,直接开整。


好久没有写爬虫文章了,今晚上得空看了一下陆金所登录密码加密,这个网站js加密代码不难,适合练手,篇幅有限,完整js代码我放在了这里从今天开始种树,不废话,直接开整。

前戏热身

打开陆金所网站,点击到登陆界面,长这样:
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
按F12打开工具,再登录随便输入一个号码和密码,点击登录按钮,查看发送的请求:
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
一共有3个,从请求名称上也看的出来哪个是登录请求(看不出来的话一个一个点击),拉下来,看看提交的FormData:
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
我输的密码是123,可以看出来这里把password加密了,既然加密了那我们就去js文件里找找加密方法呗。

激战开始

切换到Sources,按下图点击search
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
出现搜索框:
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
都知道要搜哪个关键字吧,搜索关键词无非就是FormData里有的或者encrypt之类的,当我们搜索password就出现了诸多js文件,仔细筛选,基本能通过js文件名进行猜测了,比如下图中的这个文件已经指明了login,点击红框中这个js文件。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
打开了上图中的js文件,如下图继续搜索password
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
如上图,这个文件一共有6处password,只有上图红框中的最像加密代码,这里把搜索到的js代码摘出来,大家可以仔细查看一下:

 rsaChg: function() {         if ($("#pwd").val()) {             var e = new RSAKey;             e.setPublic($("#publicKey").val(), $("#rsaExponent").val());             var a = e.encrypt($("#pwd").val());             $("#password").val(a),             $("#pwd").val("************")         }     },

到这里基本就确定加密方法就是encrypt,那就开始调试了,在91行这里打个断点。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
老办法,在登录界面输入手机号和错误的密码,点击登录后就会跳转到91行这里,如下图。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
点击下图中按钮跳到下一步,应该会跳转到setPublic函数中:
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解

setPublic进行了一番设置,这里的。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
这里的这两个值是固定的,后面扣js代码的时候直接写死即可。

 var t = "BE24E372DC1B329633A6A014A7C02797915E3C363DD6EE119377BD645329B7E6446B4A71AC5F878EBC870C6D8BFD3C06B92E6C6E93390B34192A7A9E430800091761473FAC2CC0A68A828B2589A8CB729C19161E8E27F4C0F3CDE9701FAFE48D2B65947799072AFA6A3F2D7BDBEF8B6D7429C2D115A3E5F723467D57B3AC6967" var i = "10001"

一路狂点下一步,直到进入encrypt中,其实是进入了RSAEncrypt,不过这两个函数是等价的,
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
上图中我一共标了3个数字代表RSAEncrypt需要调用的三个函数,用函数名在这个js文件里搜索一下,只要将这三个函数里涉及的小函数都扣出来就可以组成一个js文件了:
函数一:pkcs1pad2是关于密码处理的。

function pkcs1pad2(t, e) {     if (e < t.length + 2)         return alert("密码太长!"),         null;     var r = new Array       , n = t.length - 1       , i = t.length;     if (!(i < 100))         return alert("密码太长!"),         null;     r[0] = 48 + i / 10,     r[1] = 48 + i % 10;     var o = 2;     for (n = 0; n < i && e > 0; )         r[o++] = t.charCodeAt(n++);     for (var a = new SecureRandom, s = new Array; o < e; ) {         for (s[0] = 0; 0 == s[0]; )             a.nextBytes(s);         r[o++] = s[0]     }     return new BigInteger(r) }

函数2:bnBitLength

function bnBitLength() {     return this.t <= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM) }

函数3:doPublic等于RSADoPublic,所以找到RSADoPublic,可以看出encrypt也是等于RSAEncrypt的,所以刚才我才说这两个是等价的。

RSAKey.prototype.doPublic = RSADoPublic, RSAKey.prototype.setPublic = RSASetPublic, RSAKey.prototype.encrypt = RSAEncrypt;

这是RSADoPublic

function RSADoPublic(t) {     return t.modPowInt(this.e, this.n) }

继续调试encrypt,返回的n其实就是加密结果。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
得到了一串加密数据。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
Network里看看:

兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
如果你是一步一步调试的到这里,其实已经可以把涉及到的代码摘出来放一个js文件里了,需要注意的是代码中难免出现windownavigator,有一个取巧的办法就是将其设置为如下方式:

 window = this; navigator={} .... //篇幅有限,省略了 .... //自写的加密函数 function pwd(password) {     var e = new RSAKey;     var t = "BE24E372DC1B329633A6A014A7C02797915E3C363DD6EE119377BD645329B7E6446B4A71AC5F878EBC870C6D8BFD3C06B92E6C6E93390B34192A7A9E430800091761473FAC2CC0A68A828B2589A8CB729C19161E8E27F4C0F3CDE9701FAFE48D2B65947799072AFA6A3F2D7BDBEF8B6D7429C2D115A3E5F723467D57B3AC6967"     var i = "10001"     e.setPublic(t,i)     var a = e.encrypt(password);     return a  }

python调用

这里需要引入execjs,安装方法上一篇爬虫文章里提过了。

import execjs  with open('..//js//lujinsuo.js', encoding='utf-8') as f:     lujinsuo= f.read() js = execjs.compile(lujinsuo) logid = js.call('pwd', "123456") print(logid)

运行如下,
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解

结束

本文只是介绍了其中password加密的方式,此网站比较简单,适合初学js逆向入手,更多内容请访问从今天开始种树,关注下面的公众号,当然不关注也无所谓。
兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: