第十三周前端加密绕过

前端加密概述

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

主要用途

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

对渗透测试人员来说,当数据包里都是密文,我们无从下手;就算是获得了加解密的一些关键信息,能解密出来,但是每个数据包我们都需要慢慢解密,请求包需要解密,响应包也需要解密,比较麻烦。现在日子越来越不好过了,无论攻防、企业 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")

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

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

相关推荐
高德开放平台5 小时前
实战案例|借助高德开放平台实现智慧位置服务:路线导航的开发与实践
前端·后端
老前端的功夫5 小时前
# HTTP缓存:从懵懵懂懂到了如指掌
前端
安卓开发者5 小时前
Docker与Nginx:现代Web部署的完美二重奏
前端·nginx·docker
Dorian_Ov05 小时前
GeoPandas+DataFrame实现shapefile文件导入PostGIS数据库
前端·gis
哟哟耶耶5 小时前
Starting again company 03
前端·javascript·vue.js
葡萄城技术团队5 小时前
SpreadJS 赋能在线 Excel:协同编辑与精细化权限管控的技术实现
前端
转转技术团队6 小时前
转转商品中心微前端升级之路
前端
love530love6 小时前
【笔记】解决 ComfyUI 安装节点 ComfyUI-Addoor (葵花宝典)后启动报错:No module named ‘ComfyUI-Addoor’
linux·运维·前端·人工智能·windows·笔记·python
zzywxc7876 小时前
解锁 Rust 开发新可能:从系统内核到 Web 前端的全栈革命
开发语言·前端·python·单片机·嵌入式硬件·rust·scikit-learn