js逆向系列07-人人网实战

admin 2024年2月26日21:40:13评论4 views字数 2009阅读6分41秒阅读模式

首先打开登陆页:

js逆向系列07-人人网实战

输入138888888888和123456之后,查看network,可以看到登录时的请求payload内容。

主要有appKey,callId,password,sessionKey,sig和user这几个参数,下面分别看看这些参数。

appKey

直接全局搜索:

js逆向系列07-人人网实战

可以看到appKey的值是写死的,跳过。

callId

这里的callId值为1708926871886,跟时间戳的格式很像,尝试用时间戳解析一下:

js逆向系列07-人人网实战

正确。

password

前面输入的密码为123456,而密文是e10adc3949ba59abbe56e057f20f883e,很明显是md5加密,搜索1732584193来验证一下:

js逆向系列07-人人网实战

猜想正确。

sessionKey

sessionKey参数值为空,同样跳过。

user

该值即为登录时输入的用户名信息,并且为明文。

sig

最后来看sig参数,当前登录中,sig的值为5c4eaf63da0a3de5f8d8c5df30e1b3af。尝试解密,解密失败,下面从js入手。

先下个XHR断点,看一下调用栈:

js逆向系列07-人人网实战

这里有一个loginByPass,从命名来看应该是通过password进行登录,跟进去:

js逆向系列07-人人网实战

先留意这个文件:new-renren......

全局搜索sig:

js逆向系列07-人人网实战

共有3个文件,重点来看new-renren这个js。一共有70处调用,搜索.sig:

js逆向系列07-人人网实战

还是有数十处,搜索sig=:

js逆向系列07-人人网实战

一共只有两处,依次查看一下:

js逆向系列07-人人网实战

很明显都是从 ze.getSign(a, r.secretKey)取的值。

搜索getSign方法:

js逆向系列07-人人网实战

函数如下:

getSign:function(t, e){var i ="c5957b350d87c02409766be680f76d5b";                e &&(i = e);var s =Le(t)+ i, n =Re()(s);return n}

打个断点看看:

js逆向系列07-人人网实战

t即为传入的参数,而e就是前面提到写死的appKey,与前面的a=s.params也能对应上。

先看Le(t),打断点进去看:

js逆向系列07-人人网实战

首先对参数的name进行了排序,排序之后键值对进行拼接。

结合上面的代码,此时s已经可以算出来,即为参数的key=value再拼接上appKey:"bcceb522717c2c49f895b561fa913d10"

最后一个问题就是n=Re()(s).

同样先打断点,步入:

js逆向系列07-人人网实战

跟到t:f(e,n),继续跟:

js逆向系列07-人人网实战

看到e.exports = function(e,n){},由于前面只给了一个参数(Re()(s)),因此n为undefined,如图所示,但是e有值,因此跳到var r=xxx,最后再通过一个三元运算,将结果return。

由于n为undefined,所以最终return的结果为t.bytesToHex(r),而r=t.wordsToBytes(a(e,n)),最终取值其实就是t.bytesToHex(t.wordsToBytes(a(e,n))).

写一段简单的js代码,如下:

let bbb =function(callId,password,user){var s ="appKey=bcceb522717c2c49f895b561fa913d10callId="+callId+"password="+password+"sessionKey=user="+user+"bcceb522717c2c49f895b561fa913d10";var sig = t.bytesToHex(t.wordsToBytes(a(s,n)));return sig}console.log(bbb("1708926871886","e10adc3949ba59abbe56e057f20f883e","13888888888"))

这里使用的时间戳和user,pass为文中第一次请求时的数据,运行结果为:

js逆向系列07-人人网实战

一致。

至此整个逻辑已经清楚了,后续要做的就是抠代码使其能够在本地运行。

js逆向系列07-人人网实战

注意到,在核心加密函数中,存在1732584193,即md5的默认的模值,将s整个进行md5加密,其实就能得到sig的值。

修改代码如下:

let bbb =function(callId,password,user){var s ="appKey=bcceb522717c2c49f895b561fa913d10callId="+callId+"password="+password+"sessionKey=user="+user+"bcceb522717c2c49f895b561fa913d10";var sig = md5(s);return sig}console.log(bbb("1708926871886","e10adc3949ba59abbe56e057f20f883e","13888888888"))

也可以通过抠代码的方式一步步进行,这里不再介绍。

原文始发于微信公众号(Crush Sec):js逆向系列07-人人网实战

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月26日21:40:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   js逆向系列07-人人网实战https://cn-sec.com/archives/2527361.html

发表评论

匿名网友 填写信息