当前位置:首页 > Web安全 > 正文内容

两个简单的前端加密逆向

UzJu2年前 (2022-07-19)Web安全2107

前言

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

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

image-20220719143710909

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

站点一-DES加密

image-20220719135404844
点击登录后可以抓到请求包
image-20220719135558840

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插件,正好试试

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

定位关键函数的思路

1、使用TraceChrome插件

走一遍登录流程先触发一下加密函数
image-20220719135818064
开启调试

登录之前这里的password还是没有值的,随便输入账号密码点击登录,再次获取
image-20220719135916096
这里给出了一个JS,过去搜PASSWORD关键字

2、关键字搜索定位

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



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

image-20220719140256772
在这里下一个断点,然后输入账号密码点击登录
image-20220719140400727
这里直接拦截了,但是还有个验证码环节所以把这里放通
image-20220719140451379
输入验证码点击登录之后还是会拦在这里,单步往下跟
image-20220719140523737
从上图中可以看到,在请求登录之前有一个/sso/image/loginCertTiket请求,这个请求是干什么用的,后面再说,继续跟
image-20220719140553900
会发现这里对这个接口请求了,并且传入了一个uid的参数,在burp中可以看到
image-20220719140648447
这里会返回一个ticket,然后再次单步会返回v
image-20220719140750553
此时继续单步就会来到login的前端页面
image-20220719140826995
然后继续单步调试,注意看一下这里的前端代码
image-20220719140907143
首先就是可以看到调用了loginCertTiket();那肯定就是刚刚的请求的那个接口,返回的ticket,肯定在这里有一些用处,仔细一点可以看到,下面已经调用了加密密码的函数了,encryptByDES
image-20220719140929391
注意这段代码,首先如果ticketlogin不等于Errororr,并且用.trim函数移除password里面的空白字符不等于空给的话 然后!=不等于 空 就会走下面的加密逻辑
继续单步调试
image-20220719141000599
这个ticketlogin是不是很眼熟,这里就是之前请求/sso/image/loginCertTiket返回的值,接下来就会走encryptByDES函数,并且传入我们输入的明文密码,和ticketlogin,那么也就是key
image-20220719141028871
鼠标放在这个函数上面可以跳转过去,接着看

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

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

if (tiketlogin != "errororr" && ($.trim(password_) != '' && $.trim(password_) != null)) {
  password_ = encryptByDES(password_, tiketlogin);
}
$("#password").val(password_);
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填充,那直接调这里的函数就可以解密了
最后的解密调用

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, …}

image-20220719141416527

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

扫描二维码推送至手机访问。

版权声明:本文由UzJu的安全屋发布,如需转载请注明出处。

SQL ERROR: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

本文链接:https://uzzju.com/post/67.java

标签: js前端加密
分享给朋友:

相关文章

【渗透测试】记一次智慧校园系统一轮游

【渗透测试】记一次智慧校园系统一轮游

记一次智慧校园系统一轮游记一次智慧校园系统一轮游一、前言如发现存在问题发送邮件到:UzJuer@163.com删除文章 关于如何挖逻辑漏洞的思维图 二、智慧校园系统1、www.xxx-xxxx.com svn泄露Ps:后...

浅析:TomCat Getshell拿服务器权限实战

浅析:TomCat Getshell拿服务器权限实战˂a name="0xOO前言" class="reference-link" href="#"˃0xOO前言无意中接触到一个网站 所以索性尝试一下 没什么技术性 都是一些基本操作 大...

Redis常见利用方法

Redis常见利用方法

Redis常见利用方法 Redis简介与学习Redis常见端口 6379 Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据...

Java-SQL注入

Java-SQL注入

1、JDBC1.1、Statement创建连接对象使用CreateStatement() Statement stmt = null; try { stmt = conn.createStatement( ); . ....

未授权与垂直/水平越权(IDOR)检测实现方案

未授权与垂直/水平越权(IDOR)检测实现方案

未授权与垂直/水平越权(IDOR)检测实现方案TODO1、去重通过接口进行去重 防止水平越权时参数不一致导致的同一个URL重复问题 2、黑名单配置 让用户选择可以配置黑名单来禁止检测指定URL 3、白名单配置 让用户选...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。