JS逆向100题——第1题

天翼云登录

爱好学习及分享,若文章侵权,优先联系本人删帖处理。

目标与目的

目标网站:天翼云登录

目的:通过构建登录参数,完成天翼云的登录操作。

相关技术

本题涉及两个方面的参数构造:

  1. 密码构造:登录时将密码通过加密,生成密文传递给服务器
  2. 几个相关参数构造:未涉及加密算法,为时间戳与随机数通过一定的计算后生成的几个可变化的值。

本题涉及的js知识点:
(个人理解,或有误,后续认识加深再来调整)

  • webpack打包:js代码通过wwebpack打包后会生成固定模式,该模式有标准的三段式,1. 自执行的函数;2. 加载器;3. 具体的模块代码。
  • 代码在被调用时会将模块对应的id传给加载器,通过加载器去运行指定代码。

解题步骤

1. 登录

登录时用错误的密码:作用是查看本次请求的相关参数。通过参数名去控制台搜索,锁定参数生成位置。
参数如下:

![[Pasted image 20220614145418.png]]

参数说明

  • userName:用户名
  • password:密码
  • referrer:wep (固定,wep端)
  • mainVersion: 300021100 (固定)
  • comParam_curTime:时间戳
  • comParam_seqCode:计算所得
  • comParam_signature:计算所得
  • isCheck:true(固定值)
  • locale:zh-cn(固定值)
2. 查找密码生成逻辑
  • 在控制台搜索关键词"password",这里有一个小技巧:搜索时加上"=" 或者 ":"等赋值符号,可能更快的找到相应位置。(如果搜不到,或者因为粗心没找到,那就可以先搜别的参数,比如 username。或者通过xhr断点向上找堆栈)。可以找到密码的生成位置如下:

![[Pasted image 20220615105518.png]]

  • 此时打断点,重新登陆,可以看到a.value就是原始密码

![[Pasted image 20220615105804.png]]

  • 现在可以将生成密码的这段代码复制到控制台运行,确定该行代码即是密码生成逻辑

![[Pasted image 20220615105935.png]]

  • 把Object(l[“c”])、Object(l[“f”])、Object(l[“g”])拿到控制台运行,他们对应的是三个函数。

![[Pasted image 20220615110154.png]]

  • js构造如下,将Object(l[“c”])、Object(l[“f”])、Object(l[“g”])替换

在这里插入图片描述

  • 可以看出H函数中涉及到TripleDES加密。关键点就在p对象。

![[Pasted image 20220615111005.png]]

3. 简单还原密码加密

这里使用第一种方法简单还原密码加密,生成密文。

  • 通过使用crypto-js模块,构造p对象,具体代码如下:

![[Pasted image 20220615111704.png]]

  • 通过构造p对象,运行代码后,即可完成密码的加密。

![[Pasted image 20220615111920.png]]

  • 至此密码已经还原,但是出于学习的目的,应该尽量不用第三方插件来完成。而且若开发者将加密算法进行魔改,那这种引第三方包的方式肯定是不OK的。故继续向下。
4. 通过扣代码完成密文生成

上面已经找到关键点,对象p。此时若能够找到p对象的生成逻辑,将代码拿过来那就可以大功告成了。

  • 断点调试查找p的生成过程,可以看出刚进入H函数,p对象就已经生成了。

![[Pasted image 20220615112820.png]]

  • 向上找p的生成逻辑,4407行,p = t.n(s),s = t(“3452”)

![[Pasted image 20220615112954.png]]

  • 打断点重新运行,发现并不会断在p生成这里,往上看代码可以发现这代码被webpack打包后的样子。

    var func;  
    
    // 自执行函数  
    !function (a) {
     
    	// 加载器,运行模块  
    	function ccc(b) {  
    		a[b].call(xxx,xxx,xxx);  
    	}  
    	func = ccc;  
    
    } (  
    	{  
    		// 需要被运行的模块  
    		1: function(x1,x2,x3){},  
    		2: function(x1,x2,x3){}, 
    		3: function(x1,x2,x3){}, 
    	}  
    ) 
    func(1) // 调用函数1 
    func(2) // 调用函数2
    func(3) // 调用函数3
    
  • 接下来我们就要去找到对应的加载器和模块,然后构造一个自执行函数,最后通过调用对应的方法达到目的。可以直接往上找,加载器一般在代码的头部。

![[Pasted image 20220615121930.png]]

  • 在398行找到u方法,紧接着还有一些u的属性的赋值

![[Pasted image 20220615122033.png]]

  • 这是可以构造一个简易的webpack的代码逻辑。如下:

![[Pasted image 20220615122253.png]]

  • 然后去找对应的模块,上文中,对象p = t.n(s),而s=t(“3452”),所以需要去找3452模块,通过H函数的断点调试,可以知道,这些加载的模块并不在当前的js文件中,而在另一个js文件——chunk-vendors.f910be7c.js中

![[Pasted image 20220615122531.png]]

  • 模块添加完成之后如下:

![[Pasted image 20220615122659.png]]

  • 此时运行测试

在这里插入图片描述在这里插入图片描述
输出结果如下:
在这里插入图片描述

  • 至此密码加密逻辑已经解决
5. 其他参数构造

其他几个参数不涉及加密算法,还原也较为简单,基本步骤也是先找构造位置,然后把代码提取出来,运行,缺什么补什么。

  • 关键词搜索

在这里插入图片描述

  • 提取代码为:

![[Pasted image 20220615124129.png]]在这里插入图片描述

6. 登录测试(使用正确的密码)

在这里插入图片描述

js逆向100题——第1题完成

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意识存在感

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值