第十三周前端加密绕过

前端加密概述

前端加密是指在客户端(通常是浏览器)对敏感数据进行加密处理,然后再传输到服务器的安全技术。这种加密方式主要用于保护用户隐私和数据传输安全。

主要用途

  • 保护敏感数据:如密码、支付信息、个人隐私等
  • 防止中间人攻击:即使数据被截获,也无法直接读取
  • 增强整体安全性:作为后端安全措施的补充
  • 防止参数篡改

对渗透测试人员来说,当数据包里都是密文,我们无从下手;就算是获得了加解密的一些关键信息,能解密出来,但是每个数据包我们都需要慢慢解密,请求包需要解密,响应包也需要解密,比较麻烦。现在日子越来越不好过了,无论攻防、企业 src 还是渗透项目,总能看到大量的存在加密的网站。

常见的加密

对称密码算法 :加密密钥和解密密钥实质上相同。优点:算法简单、计算量小、加密速度快,效率高,适合加密大量数据,明文长度和密文长度相等

特征:

  • 常见库:CryptoJS。
  • 固定长度输出
  • 需要密钥和IV

不足:安全信道难以实现,安全交换密钥问题及密钥管理复杂,无法解决对消息的篡改、否认等问题。(分组密码与流密码(序列密码)都为对称密码算法) 分组密码:固定分组长度单位且为对称加密。流密码:逐位加密,高效性

非对称密码算法:

是一种公钥密码体制,基于数学函数。

特点:密钥成对 (公钥, 私钥)出现,且不相同或实质上等同。公钥加密私钥解、私钥加密公钥解。优点:解决密钥传递问题、密钥管理简单、提供数字签名等其他服务,缺点就是计算复杂。

哈希算法:

  • 参数签名
  • 数据完整性校验

特征:只要有一点变化,整个数值都会大规模变化

可逆编码类:

  • base64
  • URL编码
  • Hex编码

开始实验:

靶场介绍:
encrypt-labs靶场列出了常见的8种方式,包含非对称加密、对称加密、加签以及禁止重放的测试场景,比如AES、DES、RSA,用于渗透测试加解密练习。js代码做了混淆,感觉较难分析的可以使用easy.php进行练习。
下载云盘中的encrypt-labs-main.zip,解压且利用phpstudy搭建再来访问
http://encrypt.com/easy.php即可。

解密插件安装

autoDecoder:GitHub - f0ng/autoDecoder: Burp插件,根据自定义来达到对数据包的处理(适用于加解密、爆破等),类似mitmproxy,不同点在于经过了burp中转,在自动加解密的基础上,不影响APP、网站加解密正常逻辑等。

Burp插件,根据自定义来达到对数据包的处理(适用于加解密、爆破等),类似mitmproxy,不同点在于经过了burp中转,在自动加解密的基础上,不影响APP、网站加解密正常逻辑等。

因为进行了加密所以会呈现

这时候就是使用插件了

流程图相当于小红和小明考试传答案,要经过小亮

而如果没有加密的话,小亮可以把纸条打开然后修改答案折叠会原样后传给小红。而为了不被修改答案,小明给纸条加了密,小亮看不懂,而小红可以根据密码本来解密。这就相当于战争期间电台传输密文,收到的人需要用密码本进行解密。

我来分析画框的各个意思

自带算法加密:意味小亮有能力可以自己来破解小明的加密内容,而后面的密文的解码和加密编码,是为了防止被小红看出内容被更改过。

接口加解密:小亮自己没有办法解开,小亮找外援帮忙,或者它从别的地方拿到密码本来解。

**加解密域名:**就是小亮只想看小明和小红之间的纸条,其他传纸条传到小亮这里的不管。

明文关键字:意味白名单,就是小明和小红之间传的纸条可能有其他内容,比如待会去哪里吃,而小亮只对考试答案感兴趣.

密文关键字:意味黑名单。

加密算法肯定是可以在浏览器的代码F12里面找到,只是分析难度不同,有可能藏得较深,且进行混淆。

【第一关】AES固定key(必会)

而如何去找明文关键字,我们可以重网址点击F12来查看源代码

XHR 文件包含了JavaScript代码,这些代码负责从服务器请求数据,然后将数据用于页面上的交互。 提取XHR文件中的数据对于分析网页行为。我们登录行文就可以利用这个来找到相关的代码。

这个意味已经写好了内容且加密了,现在就是在叠纸条的时候。

从这里我们可以看到一些内容,我们想要的白名单还有是AES算法,密钥是1234567890123456

记得点击保存。 而根据分析知道了代码使用base64来整,而密钥是什么都没有。

找到代理可以看到扩展的名字,这样就能看到加密的内容了。

而进行重放器功能时候,在autoDecoder时候,修改的东西是无用的,应该复制到美化界面在进行发送才能成功。

【第三关】RSA加密(非对称密码算法)

从F12找到代码找到publickey。
PublicKey 的具体作用

  1. 加密敏感登录数据 :在sendEncryptedDataRSAsendDataAesRsa等函数中,公钥用于加密用户名、密码组成的 JSON 数据。加密后的数据只有服务器端持有对应的私钥,才能解密还原出原始登录信息,防止数据被中间人窃取后直接破解。
  2. 保护对称加密密钥 :在sendDataAesRsa函数中,AES 加密的密钥和初始向量会先用公钥加密。服务器用私钥解密后,才能获取 AES 密钥,进而解密 AES 加密的登录数据,实现 "非对称加密保护对称密钥" 的混合加密方案。
  3. 确保加密唯一性 :代码中明确给出的公钥(-----BEGIN PUBLIC KEY-----开头的字符串)是固定的,仅对应唯一私钥。这种非对称特性确保只有持有私钥的服务器能解密,避免加密逻辑被绕过。(有时候会在一个函数里面)

分析js代码可知加密方式为 RSA 加密, RSA 加密需要 一个公钥,解密需要私钥,没有私钥,只能尝试加密。

复制代码
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----

由于没有私钥,无法解密,因此我们只能手动构造明文了。

【第五关】Des规律Key

从这里看出他给你username,而password是加密的。

复制代码
// 从用户名提取并处理DES的key(8字节)
const _0x28853a = CryptoJS[_0x927984(0x3b3, 0x3c6)]['Utf8']['parse'](
  _0x54dcc5['slice'](0x0, 0x8)['padEnd'](0x8, '6') // 取用户名前8位,不足用"6"补齐
); // DES key(8字节,符合DES要求)

// 从用户名提取并处理iv(8字节)
const _0x360c3f = CryptoJS['enc'][_0x927984(0x39d, 0x3ab)]['parse'](
  '9999' + _0x54dcc5['slice'](0x0, 0x4)['padEnd'](0x4, '9') // 固定前缀"9999"+用户名前4位,不足用"9"补齐
); // DES iv(8字节)

// DES加密配置,关联key和iv
const _0x48281f = CryptoJS['DES']['encrypt'](
  _0x4e8925, // 明文(密码)
  _0x28853a, // DES key
  {
    'iv': _0x360c3f, // iv与key关联使用
    'mode': CryptoJS[_0x927984(0x39f, 0x38a)]['CBC'], // CBC模式需iv
    'padding': CryptoJS['pad'][_0x927984(0x3a1, 0x3a0)]
  }
);

而从代码看出来
可以看到就是简单的 DES 加密, key 和 iv 都使用1了 username 的值。 key 是八位,如果 user
name 不满8位,则用6补满。 iv 是八位,9999+username的前四位。

【第六关】明文加签(python)(必会)

就是允许小亮你看,但是不能修改,一旦修改,另一端小红就会意识到内容有变动。就是哈希函数

nonce:由 0-9、a-z 生成的 10 位随机数dataToSign:username + password + nonce + timestampsignature:由 dataToSign 经 SHA256 加密生成,secretKey 为固定值 be56e057f20f883eSHA256 在 autoDecoder 中没有,

尝试自写发包器,其中 nonce 可以随机生成也可以固定。(当我们改变其中一个值得时候,另外的也必须改变从而不让服务器那边察觉内容被修改了)
安装框架

复制代码
pip3 install flask

然后创建py文件

复制代码
from flask import Flask, request
import re
import hashlib
import hmac

app = Flask(__name__)
secret_key = "be56e057f20f883e"

@app.route('/encode', methods=["POST"])  # base64加密
def encrypt():
    param = request.form.get('dataBody')
    
    re_name = r'"username":"(.*?)",'
    re_pass = r'"password":"(.*?)",'
    re_sign = r'"signature":"(.*?)"'
    re_nonce = r'"nonce":"(.*?)",'
    re_timestamp = r'"timestamp":(.*?),'
    
    # 提取参数(建议后续用json库解析,更稳定)
    username = re.search(re_name, param).group(1)
    password = re.search(re_pass, param).group(1)
    nonce = re.search(re_nonce, param).group(1)
    timestamp = re.search(re_timestamp, param).group(1)
    
    data_to_sign = f"{username}{password}{nonce}{timestamp}"
    print(data_to_sign)
    # 修正拼写错误:将enco改为encode('utf-8'),并补全括号
    new_signature = hmac.new(secret_key.encode('utf-8'), data_to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
    
    new_param = re.sub(re_sign, f'"signature":"{new_signature}"', param)
    return new_param

@app.route('/decode', methods=["POST"])
def decrypt():
    param = request.form.get('dataBody')
    return param

if __name__ == '__main__':
    app.run(host="0.0.0.0", port="5000")

出现这个就是好了。让后复制整个内容来进行加密和解密

然后发送到重放器那里就成功了.

相关推荐
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Cobyte9 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc