前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个简单的前端加密逆向

两个简单的前端加密逆向

作者头像
UzJu@菜菜狗
发布2022-09-09 15:16:35
7120
发布2022-09-09 15:16:35
举报
文章被收录于专栏:UzJu和菜菜狗

前言

两个站点都是比较简单的前端加密,也都是朋友喊来练练手的,不过Trace这款工具还是不错的吧

推荐一下六边形战士的Github工具:https://github.com/CC11001100/ast-hook-for-js-RE

Ps: 站点一比较敏感,码的比较厚,见谅

站点一-DES加密

点击登录后可以抓到请求包

代码语言:javascript
复制
POST /sso/login HTTP/1.1
Host: UzzJu.com
Cookie: JSESSIONID=25752E4A682189EC6DC0C4167CC5EC37; _dd_s=logs=1&id=04d084df-52b7-4f88-a61d-b24e3f310741&created=1655369736789&expire=1655371261240
Content-Length: 306
Cache-Control: max-age=0
Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.115 Safari/537.36
Origin: https://UzzJu.com
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://UzzJu.com
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close

username=123&password=yfLv9%2By4WIY%3D&tiketlogin=M9GU90LH

这里的password参数被加密了,看password后面的%3D,可能会是Base64

但是无法解密

Debug找加密算法的过程

最近在看雪论坛看到了一款Chrome插件,正好试试

后面会发现这款插件比较鸡肋,比如手动搜关键字,也可能是我不太会用

主要的功能如下

我们目前需要用到的只有变量追踪

在开启之后,console搜索t2SearchImprint("string")

定位关键函数的思路

1、使用TraceChrome插件

走一遍登录流程先触发一下加密函数

开启调试

登录之前这里的password还是没有值的,随便输入账号密码点击登录,再次获取

这里给出了一个JS,过去搜PASSWORD关键字

2、关键字搜索定位

来到这个JS搜索password关键字定位到了这一行,这里4四个关键字,为什么要定位到这一行,我们可以来看一下其他的关键字

光从定义上看就肯定比第四个password有价值,所以在这里打下断点

在这里下一个断点,然后输入账号密码点击登录

这里直接拦截了,但是还有个验证码环节所以把这里放通

输入验证码点击登录之后还是会拦在这里,单步往下跟

从上图中可以看到,在请求登录之前有一个/sso/image/loginCertTiket请求,这个请求是干什么用的,后面再说,继续跟

会发现这里对这个接口请求了,并且传入了一个uid的参数,在burp中可以看到

这里会返回一个ticket,然后再次单步会返回v

此时继续单步就会来到login的前端页面

然后继续单步调试,注意看一下这里的前端代码

首先就是可以看到调用了loginCertTiket();那肯定就是刚刚的请求的那个接口,返回的ticket,肯定在这里有一些用处,仔细一点可以看到,下面已经调用了加密密码的函数了,encryptByDES

注意这段代码,首先如果ticketlogin不等于Errororr,并且用.trim函数移除password里面的空白字符不等于空给的话 然后!=不等于 空 就会走下面的加密逻辑 继续单步调试

这个ticketlogin是不是很眼熟,这里就是之前请求/sso/image/loginCertTiket返回的值,接下来就会走encryptByDES函数,并且传入我们输入的明文密码,和ticketlogin,那么也就是key

鼠标放在这个函数上面可以跳转过去,接着看

跳到这个函数这里就已经很明显了,接收一个message,一个key,message就是我们的密码明文,key就是ticketlogin,可以看一下这里的加密模式,ECB,那么DES ECB模式是不需要我们输入vi偏移量解密的,那么这里就好办了,先继续单步往下调

走过这个函数之后,password的值就变成密文了,那么现在开始解密

代码语言:javascript
复制
if (tiketlogin != "errororr" && ($.trim(password_) != '' && $.trim(password_) != null)) {
  password_ = encryptByDES(password_, tiketlogin);
}
$("#password").val(password_);
代码语言:javascript
复制
function encryptByDES(message, key) {
  var keyHex = CryptoJS.enc.Utf8.parse(key);
  var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}

上面说到 DES加密算法的ECB模式,我们只需要有KEY和密文就可以解密了,不需要输入VI的,那么直接找个在线加密解密站点就行了 跳转中… 找了半天就这个好用一点

  1. password_: “h0COq4/nAp8=”
  2. tiketlogin: “DO147RAH”
  3. username_: “123”

这是密文,直接带进去解密

解密成功,记得填充选上pkcs7padding即可

站点二-AES加密

登录的时候post参加密,打断点,搜关键字的方式调

调试解密

我这里是搜关键字找到前端加密的JS

看一眼AES加密,打断点点击登录可以看到原始的JSON

其实到这里啥也不用看了,decrypt函数写在下面了

下面decrypt函数的参数e很明显就是明文

然后转hex赋值给a,然后转base64赋值给n,然后下面r调用o.a.AES.decrypt 这里需要3个参数,密文,密钥,AES加密的参数 可以看到这里传入的

n就是上面明文转完base64的密文,o.a.enc.Utf8.parse(i.a.myStar)就是密钥,然后就是CBC的偏移,然后就是CBC模式,最后就是pkcs7填充,那直接调这里的函数就可以解密了 最后的解密调用

代码语言:javascript
复制
JSON.parse(o.a.AES.decrypt(o.a.enc.Base64.stringify(o.a.enc.Hex.parse("fb2eb338b6f76478e21312cef6e289dd04febe5bc48bbf33f2893e3dbab754311acad9122113ff4f7ec3e4e006a8f5fd9f96427f68bbdb218c590cbdcffce4f35ed8eb0539a6d5351d284058dd13fd4d2a95a451b2c76edee682fa1b989bf1a58dd1cf18897e424b859b39ef22e8dc36b54368e4da104d0b20dbdda6dd74fb50394298535a6379138d21a54e78cc7cc1c1b8762d6a03534a917243955b9af76d")), o.a.enc.Utf8.parse(i.a.myStar), {iv: o.a.enc.Utf8.parse(i.a.youStar),mode: o.a.mode.CBC,padding: o.a.pad.Pkcs7}).toString(o.a.enc.Utf8))

{username: '123', passwd: '123', code: '', companyCode: 'testliu', stamp: 1657703988662, …}

因为这里的函数都是返回值,所以直接把函数当成参数传进去,调用的时候自动会有返回值,所以解密成功

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 站点一-DES加密
    • Debug找加密算法的过程
      • 定位关键函数的思路
        • 1、使用TraceChrome插件
        • 2、关键字搜索定位
    • 站点二-AES加密
      • 调试解密
      相关产品与服务
      验证码
      腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档