zoukankan      html  css  js  c++  java
  • 渗透测试前端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["x64x65x63x6fx64x65"](scHZjLUh1);    key = 'x6ex79x6cx6fx6ex65x72';    len = key["x6cx65x6ex67x74x68"];    code = '';    for (i = 0; i < scHZjLUh1["x6cx65x6ex67x74x68"]; i++) {        var coeFYlqUm2 = i % len;        code += window["x53x74x72x69x6ex67"]["x66x72x6fx6dx43x68x61x72x43x6fx64x65"](scHZjLUh1["x63x68x61x72x43x6fx64x65x41x74"](i) ^ key["x63x68x61x72x43x6fx64x65x41x74"](coeFYlqUm2))    }    return Base64["x64x65x63x6fx64x65"](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/

  • 相关阅读:
    这是一篇通过open live writer发布的博文
    网卡重启失败
    2020年1月目标
    二、安装docker
    JS中的数据类型,包含ES6,set和map等等
    关于prototype和__proto__,最好的一些解释
    JS中call,apply和bind方法的区别和使用场景
    ThinkPHP5生成word文档代码库
    js/jquery操作iframe
    PHP技术--思维导图
  • 原文地址:https://www.cnblogs.com/Mr-l/p/11987517.html
Copyright © 2011-2022 走看看