安全矩阵

 找回密码
 立即注册
搜索
查看: 4527|回复: 0

JS的秘密-登录验证中aes加密的破解方法

[复制链接]

98

主题

207

帖子

955

积分

高级会员

Rank: 4

积分
955
发表于 2020-9-1 08:48:13 | 显示全部楼层 |阅读模式

0x00 前言

最近在对某个客户系统进行测试时,偶然发现系统通过AES算法对用户名和密码进行了加密。

众所周知,前端是使用js对用户名和密码进行的加密然后后端再对其进行解密,js就是JavaScript语言,可以说是目前互联网上最流行的脚本语言。js的用途之广也会带了一些问题,js泄露敏感信息,例如后台路径、管理员信息、手机号、邮箱等等。相信很多人在测试过程中碰到登录界面第一反应是爆破,没有加密的还好,如果碰到了AES或者DES加密就很头疼。今天我们的主题就是通过js获取其中的加密算法并且逐渐实现自动化。

0x01 常见的加密方式

1、线性散列算法MD5 SHA1。
2、对称性加密算法 AES DES。
3、非对称性加密算法 RSA。

在加密方式上一般选择前两种的比较多,很少有使用非对称加密,所以我们一般遇到的加密方式为前两种。

0x02 寻找加密算法

在测试过程中,查看源码时其发现加密算法为AES,如下图:



不单单是知道了其加密算法为AES,还发现了加密用的密码和偏移量,这样我们就可以自己进行加密。

0x03 加密插件

到这里第一想法是用python写个脚本对字典进行加密然后使用burp suite进行爆破,但是就在这个时候我看到了 c0ny1 大佬的加密传输爆破插件jsEncrypter,链接在最下方。

这里小伙伴们可以自行下载编译,然后把插件加载到burp suite中,如下图:



0x04 增加AES

这里加载成功后,使用phantomjs.exe运行然后连接就可实现快速加密,但是美中不足的是c0ny1 大佬并没有写AES的加密算法所以这里需要自己动手进行操作,这里c0ny1 大佬给了我们一个固定的模板
  1. /**
  2. * author: c0ny1
  3. * date: 2017-12-16
  4. * last update: 2020-03-03
  5. */
  6. var fs = require('fs');
  7. var webserver = require('webserver');
  8. server = webserver.create();

  9. var logfile = 'jsEncrypter.log';
  10. var host = '127.0.0.1';
  11. var port = '1664';

  12. /* 1.在这引入实现加密所有js文件,注意引入顺序和网页一致 */
  13. //var wasSuccessful = phantom.injectJs('crypto-js.js');/* 引入实现加密的js文件*/

  14. // loadScript("script-2.js");
  15. // loadScript("script-n.js");
  16. /**********************************************/

  17. function loadScript(scriptName) {
  18.     var isSuccess = phantom.injectJs(scriptName);
  19.     if(isSuccess){
  20.         console.log("[*] load " + scriptName + " successful")
  21.     }else{
  22.         console.log("[!] load " + scriptName + " fail")
  23.         console.log("[*] phantomjs server exit");
  24.         phantom.exit();
  25.     }
  26. }

  27. // var key = CryptoJS.enc.Utf8.parse("PBLUREBUWNXCXHRQ"); //16位
  28. // var iv = CryptoJS.enc.Utf8.parse("1234567812345678");
  29. function jsEncrypt(burp_payload){
  30.   var new_payload;
  31.   /* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */
  32.     // 编辑 加密函数的位置
  33.   /*********************************************************/
  34.   return new_payload;
  35. }
复制代码
这里展示一小部分
其中主要的内容在于加密函数的代码,和引入加密的js文件。而且我们上面在js文件中找到了AES的密码和偏移量所以我们可以直接进行修改
  1. var wasSuccessful = phantom.injectJs('crypto-js.js');
复制代码
引用的加密文件这里是通用的(从sha512加密的文件中借用一下"crypto-js.js")。
  1. function jsEncrypt(burp_payload){`
  2.   `var new_payload;`
  3.   `/* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */`
  4.     `// 编辑 加密函数的位置`
  5.     `const key = CryptoJS.enc.Utf8.parse("ihaierForTodoKey"); //16位`
  6.     `const iv = CryptoJS.enc.Utf8.parse("ihaierForTodo_Iv");`
  7.     `const srcs = CryptoJS.enc.Utf8.parse(burp_payload);`
  8.       `encrypted = CryptoJS.AES.encrypt(srcs, key, {`
  9.         `iv: iv,`
  10.         `mode: CryptoJS.mode.CBC,`
  11.         `padding: CryptoJS.pad.Pkcs7`
  12.       `});`

  13.     new_payload =decodeURIComponent(CryptoJS.enc.Base64.stringify(encrypted.ciphertext));
  14.     /*********************************************************/
  15.     return new_payload;

  16. `}`
复制代码
这里多加了base64加密,需要hex的话可以去掉base64。
当然其他的加密算法通用,如下:
base 64:
  1. var wasSuccessful = phantom.injectJs('base64.js');/*引入实现加密的js文件*/

  2. // 处理函数
  3. function js_encrypt(payload){
  4.   var newpayload;
  5.   /**********在这里编写调用加密函数进行加密的代码************/
  6.   var b = new Base64();
  7.   newpayload = b.encode(payload);
  8.   /**********************************************************/
  9.   return newpayload;
  10. }
复制代码
DES:
  1. var wasSuccessful = phantom.injectJs('des.js');/*引入实现加密的js文件*/

  2. // 处理函数
  3. function js_encrypt(payload){
  4.   var newpayload;
  5.   /**********在这里编写调用加密函数进行加密的代码************/
  6.   //var b = new Base64();
  7.   newpayload = strEnc(payload,"key","para0","para1");
  8.   /**********************************************************/
  9.   return newpayload;
  10. }
复制代码
sha512:
  1. var wasSuccessful = phantom.injectJs('crypto-js.js');/*引入实现加密的js文件*/

  2. // 处理函数
  3. function js_encrypt(payload){
  4.   var newpayload;
  5.   /**********在这里编写调用加密函数进行加密的代码************/
  6.   newpayload =  CryptoJS.SHA512(payload);
  7.   /**********************************************************/
  8.   return newpayload;
  9. }
复制代码
0x05 加密测试

然后进行测试,效果如下:


成功进行加密。

当然在爆破的过程中我们还可以采用更有效率方法,在使用phantomjs.exe运行js且确保burp suite和它连接上时,我们可以选择intruder模块中的加密方式为Invoke Burp extension(插件外援),如下图:


0x06 自动化加密

然后进行爆破。如下图:



最终实现全自动化。

0x07 结语

AES的加密一共有五种模式分别为CBC、ECB、CFB、OFB、CTR,本次js中AES的加密的工作模式为CBC,其他的工作模式也可用相同方式进行解密。如果有小伙伴们遇到类似情况可以去翻一翻JS说不定有意想不到的惊喜,细心点总会有收获。最后文中所有工具和插件都已打包,关注公众号回复“AES”获取下载地址。

0x08 参考链接

https://github.com/c0ny1/jsEncrypter


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 08:00 , Processed in 0.014600 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表