第十三周前端加密绕过
前端加密概述
前端加密是指在客户端(通常是浏览器)对敏感数据进行加密处理,然后再传输到服务器的安全技术。这种加密方式主要用于保护用户隐私和数据传输安全。
主要用途
- 保护敏感数据:如密码、支付信息、个人隐私等
- 防止中间人攻击:即使数据被截获,也无法直接读取
- 增强整体安全性:作为后端安全措施的补充
- 防止参数篡改
对渗透测试人员来说,当数据包里都是密文,我们无从下手;就算是获得了加解密的一些关键信息,能解密出来,但是每个数据包我们都需要慢慢解密,请求包需要解密,响应包也需要解密,比较麻烦。现在日子越来越不好过了,无论攻防、企业 src 还是渗透项目,总能看到大量的存在加密的网站。
常见的加密

对称密码算法:加密密钥和解密密钥实质上相同。优点:算法简单、计算量小、加密速度快,效率高,适合加密大量数据,明文长度和密文长度相等
特征:
- 常见库:CryptoJS。
- 固定长度输出
- 需要密钥和IV
不足:安全信道难以实现,安全交换密钥问题及密钥管理复杂,无法解决对消息的篡改、否认等问题。(分组密码与流密码(序列密码)都为对称密码算法) 分组密码:固定分组长度单位且为对称加密。流密码:逐位加密,高效性

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

哈希算法:
- 参数签名
- 数据完整性校验
特征:只要有一点变化,整个数值都会大规模变化

可逆编码类:
- base64
- URL编码
- Hex编码

开始实验:
解密插件安装
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 的具体作用
- 加密敏感登录数据:在
sendEncryptedDataRSA和sendDataAesRsa等函数中,公钥用于加密用户名、密码组成的 JSON 数据。加密后的数据只有服务器端持有对应的私钥,才能解密还原出原始登录信息,防止数据被中间人窃取后直接破解。 - 保护对称加密密钥:在
sendDataAesRsa函数中,AES 加密的密钥和初始向量会先用公钥加密。服务器用私钥解密后,才能获取 AES 密钥,进而解密 AES 加密的登录数据,实现 “非对称加密保护对称密钥” 的混合加密方案。 - 确保加密唯一性:代码中明确给出的公钥(
-----BEGIN PUBLIC KEY-----开头的字符串)是固定的,仅对应唯一私钥。这种非对称特性确保只有持有私钥的服务器能解密,避免加密逻辑被绕过。(有时候会在一个函数里面)
-----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)]}
); 而从代码看出来
【第六关】明文加签(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 hmacapp = 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 paramif __name__ == '__main__':app.run(host="0.0.0.0", port="5000") 
出现这个就是好了。让后复制整个内容来进行加密和解密

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