目录
今天分享两个前端js逆向思路+yakit热加载登录爆破的小技巧。
纯js代码逆向
目标:js逆向破解sign签名的签名算法,并使用yakit爆破。
通过抓包分析发现,用户名未加密,而密码使用了 MD5 加密
使用密码字典进行 MD5 加密尝试爆破,但所有响应均显示‘验签失败’,表明网站采用了签名验证机制
我们可以分析JavaScript代码来破解sign字段的生成逻辑,然后自行生成有效的sign值进行爆破。
入口定位
这里可以直接搜索:password、username、sign等关键字来发现的相关js代码
发现生成sign字段的位置
逆向
在 a.sign 方法处设置断点,输入任意账号、密码和验证码,点击登录进行调试。
此时sign值还是空的
逐步执行代码,观察到执行该函数后生成了 sign 值,确认这个函数就是用来生成签名的函数
然后查看这个函数做了什么操作
函数中有t、b等参数,还返回了一个p()(e),在控制台打印一下,看看它们具体是什么
观察发现:b是定值,而t包含了一个时间戳还有我们输入的验证码、账号密码
最后返回了一个p函数,目的是将传入的值进行md5加密
可以知道sign的加密方式就是对时间戳、验证码、账号和md5后的密码组成的字符串进行md5加密
知道了加密方式,我们可以使用它自动生成签名来爆破账号密码了
yakit热加载爆破
通过热加载动态生成 sign 值并发送请求
encode=func(password){
key="20241215185232"
code="kzcs"
username="admin"
password=codec.Md5(password)
b="6D5A582B437371376E586F5773785730647461476B386342664A3049484F5656346F3278546E46735A5531453669514C5843415572415A6965585457334D542F"
data="key=" + key + "&code=" + code + "&username=" + username + "&password=" + password+"&"+b+"&"
sign=codec.Md5(data)
return {"username":username,"password":password,"rememberMe":false,"code":code,"key":key,"sign":sign}
}
使用时直接调用该函数即可
这次返回的结果是“用户密码有误”而不是“验签失败”,说明我们已经成功逆向了,可以直接进行爆破。
webpack逆向
目标:js逆向破解密码的加密方式,并使用yakit爆破
找到相关请求,发现密码进行了加密
逆向值定位,直接全局搜索,发现了一个encrypt函数,打个断点调试一下看看
在控制台打印输出,判断l.encrypt(t, o, n)就是加密密码的函数
既然是l.encrypt,那我们只需要找到l是什么就行
往上翻代码,发现:
典型的使用了webpack加载器,加载器函数为_()
跟踪函数发现了加载器代码
全部复制到loader.js文件中
第一次运行报错
这里的self.__webpack_public_path__等同于window.__webpack_public_path__
我们这里将self改为window(因为代码的其它地方使用的window),并将其赋值为全局变量:window = global;
定位437函数
复制整个代码至mod1.js
解决报错+补环境
然后在loader.js中添加如下代码打印输出:
正常打印
现在既然我们已经得到了l,直接调用它的encrypt函数即可
copy上面参数的值(t即为我们输入的密码)
成功打印加密后的密码
那像这种,使用webpack加载器逆向的代码 怎么使用yakit热加载批量爆破登录密码呢?
删除多余的代码并将所有代码整合到了一个文件,通过yak语法合成了一下
可以在这里调试运行一下
调试好后,使用热加载,发现可以正常生成加密后的密码
然后爆破即可