渗透测试前端JavaScript加密的分析利用

前端JavaScript加密绕过

1/1常见加密算法

比较简单的base64、hex等这些编码就不再说了。

0x01 对称加密(加解密的密钥相同)

  • 常用算法:DES、DES3、AES
  • 根据密钥长度不同又分为:AES-128、AES-192、AES-256
  • 其中AES-192和AES-256在Java中使用需获取无政策限制权限文件
  • 加密/解密使用相同的密钥
  • 加密和解密的过程是可逆的

0x02非对称加密(加解密密钥为公钥和私钥)

  • 常用算法:RSA
  • 使用公钥加密,使用私钥解密
  • 公钥是公开的,私钥保密
  • 加密处理安全,但是性能极差,单次加密长度有限制
  • RSA既可用于数据交换,也可用于数据校验
  • 数据校验通常结合消息摘要算法 MD5withRSA 等
两种加密算法常见结合套路:1、随机生成密钥2、密钥用于AES/DES/3DES加密数据3、RSA对密钥加密4、提交加密后的密钥和加密后的数据给服务器

0x03信息摘要算法/签名算法

  • 常用算法:MD5、HMAC(HmacMD5、HmacSHA1、HmacSHA256)、SHA(SHA1、SHA256、SHA512)
  • 不管明文多长,散列后的密文定长
  • 明文不一样,散列后结果一定不一样
  • 散列后的密文不可逆
  • 一般用于校验数据完整性、签名 sign
  • 由于密文不可逆,所以后台无法还原,也就是说他要验证,会在后台以跟前台一样的方式去重新签名一遍。也就是说他会把源数据和签名后的值一起提交到后台。所以我们要保证在签名时候的数据和提交上去的源数据一致,这种算法特喜欢在内部加入时间戳

1/2实例操作

打开网站,抓包

image.png

修改个数据,比如修改num为1000

image.png

可以看到,修改过参数数据后,后端数据校验之后不合法,所以没有返回数据。

打开测试网站 -> F12控制台 -> 切换至 XHR

img

这里我们看下需要做的有什么?

  1. 请求中有token(t明显是时间戳),token和数据不匹配后端不返回数据
  2. 返回的数据是加密的,需要解密

接下来我们就定位具体的加密函数和解密函数。

​ 按照上面提到的流程步骤

打开控制台 -> source ->搜索

搜索加密参数名 token

img

根据搜索结果的文件名判断,基本上就是第二个文件,点击打开

token的生成代码

var token = md5(String(page) + String(num) + String(timestamp));

设置断点,刷新

img

成功进入断点,没毛病了

根据加密函数,编写脚本

img

可以看到,生成的token和URL中的一致,至此,加密部分完成。

解密部分同样的道理,搜索返回包中的参数,直接搜索list发现有点多,不太好观察,还有一种方法

img

可以看到数据部分html的id为ip-list,再次搜索

img

成功找到解密数据包的代码

设置断点,进一步确认

img

没毛病,可以看到decode_str后就开始出现我们需要的明文数据了,所以这里的 decode_str 就是我们要的解密方法。剩下就是分析代码,编写解密脚本了。

function decode_str(scHZjLUh1) {    scHZjLUh1 = Base64["\x64\x65\x63\x6f\x64\x65"](scHZjLUh1);    key = '\x6e\x79\x6c\x6f\x6e\x65\x72';    len = key["\x6c\x65\x6e\x67\x74\x68"];    code = '';    for (i = 0; i < scHZjLUh1["\x6c\x65\x6e\x67\x74\x68"]; i++) {        var coeFYlqUm2 = i % len;        code += window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](scHZjLUh1["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](i) ^ key["\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74"](coeFYlqUm2))    }    return Base64["\x64\x65\x63\x6f\x64\x65"](code)}

先运行下看看

img

报错,提示Base64未定义,设置断点,找到Base64的具体代码

img

复制粘贴进代码,再次运行

img

艹,提示Windows未定义,根据流程,缺啥补啥,debug,找对应的值

img

可以看到分别对应的是StringfromCharCode

那就是调用了String.fromCharCode方法了,替换掉,再次运行

img

bingo~

成功解密获取到明文数据。

1/3 Python实现加密方法合集**

关于上述第一部分的常见加密算法,GitHub有对应的仓库,直接可以用的

GitHub:https://github.com/dhfjcuff/R-A-M-D-D3-S-M-H/

本文来源于:http://byd.dropsec.xyz/2019/09/08/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B9%8BJS%E9%80%86%E5%90%91/

posted @ 2019-12-05 10:20  JuiceWoo  阅读(1556)  评论(0编辑  收藏  举报