前端加密对抗常见场景突破之进阶
1398133550745333 WEB安全 139浏览 · 2025-03-01 08:39

前端加密对抗常见场景突破之进阶

前言



前面分析了几种最基础的,但是现在的前端加密往往都比较复杂,下面是几种更复杂的场景如何破局

AES+RSA 加密

这种加密方法说实话很难破局,所以我们的思路就得更换了

首先看前端的代码

PHP
复制代码
首先一大难点就是

PHP
复制代码
我们的 key 和 iv 是随机数了

而且更重量级的是

还会 RSA 去加密 AES 密钥和 IV

我们看看包

可以看见很复杂 这里有两个思路,直接改之后的逻辑,和修改加密的逻辑

修改加密逻辑

我们直接把 key 和 iv 固定,或者更容易的是直接把第一关的代码直接覆盖掉

把这串代码

直接覆盖
图片加载失败


然后我们再抓一个包

可以看到就和第一关一模一样了

图片加载失败
一样可以解码成功

但是后来发现不行

似乎后端会校验我们的参数,这里我再该了一下

尝试只修改 key 和 iv

图片加载失败


然后
图片加载失败
需要改一下正则

图片加载失败
任然可以解码成功

图片加载失败
成功

修改返回逻辑

经过前些管卡的尝试,我们自动了成功返回的是 {"success":true} 失败的并不重要

我们尝试直接修改前端的返回逻辑

拦截响应改为

发送就登录成功

图片加载失败


DES 规律 key

DES 加密,这个可以说是 AES 的前人吧 DES(Data Encryption Standard) 是一种对称加密算法,用于加密和解密数据。它被广泛用于商业和政府领域,但由于其密钥长度较短(56 位),如今已经被认为是不够安全的,并逐渐被更强大的加密算法(如 AES)所取代。

前端逻辑

这里的 key 和 iv 生成是有规律的

密钥(key)生成规律

从用户名中提取前 8 个字符(username.slice(0, 8))。 如果用户名长度不足 8 个字符,使用 '6' 填充直到达到 8 字节。

假设用户输入的用户名是 "admin123":

slice(0, 8) 提取的是 "admin123"(这个用户名恰好是 8 个字符,所以不需要填充)。 因此,key 就是 "admin123"。 如果用户名是 "alice"(只有 5 个字符),则:

slice(0, 8) 提取的是 "alice"。 使用 padEnd(8, '6') 填充,得到 "alice666",因此密钥是 "alice666"。

初始化向量(IV)生成规律

使用 "9999" 开头。 从用户名中提取前 4 个字符(username.slice(0, 4))。 如果用户名的长度不足 4 个字符,使用 '9' 填充。

首先 admin 是固定的

而且 admin 是明文传输的,我们只需要关注 password

而且 key 和 iv 都是根据 admin 来的

按照这个规律

key 就是 admin666

iv 是 9999admi

图片加载失败


图片加载失败
也是可以成功解码的

图片加载失败


成功

明文加签

首先需要了解 HMAC

HMAC(Hash-based Message Authentication Code)是一种基于哈希算法的消息认证码,用于验证数据的完整性和身份验证。它结合了一个密钥和消息的哈希值,使得即便消息被篡改,也无法计算出正确的签名。

原理

消息和密钥:HMAC 使用一个密钥(secret_key)和消息(data_to_sign)来生成签名。消息通常包含请求的参数或内容(如用户名、密码等),而密钥通常由服务器保管,不公开。

哈希算法:HMAC 使用一种哈希算法(通常是 SHA256)对消息和密钥进行加密运算。生成的签名确保了消息的完整性和不可篡改性。

签名校验:客户端将请求和生成的签名一起发送给服务器,服务器会根据相同的密钥和数据重新计算签名,如果计算出的签名与传递过来的签名一致,说明数据未被篡改。

抓一个包

这次的特点很明显,有签名,然后传输的是明文

我们看看 js 代码

首先生成了 nonce

nonce 是一个随机数,用于防止重放攻击。重放攻击是指攻击者截取有效的请求,并在之后重新发送该请求。使用 nonce 可以确保每次请求都有一个独一无二的标识,从而防止重放攻击。

然后生成时间戳

timestamp 是当前时间的秒级时间戳,它可以确保请求在一定的时间窗口内有效,防止因请求过期而被重放

然后就是签名的生成了

漏洞产生点

假设后台并没有对 timestamp 做有效的超时校验。这意味着服务器并不会检查 timestamp 是否过期。

我们就攻击思路如下

首先修改我们需要修改的数据,比如 password 字段等,然后保留原 nonce 和 timestamp:可以将原来的 nonce 和 timestamp 保持不变。这是关键,nonce 是唯一的标识,而 timestamp 如果没有有效的时间限制,就可以被一直使用

两个关键点

nonce 是唯一的,但没有时间限制:nonce 是为了防止重放攻击而设计的,理论上每个 nonce 都只能使用一次。如果服务器保存已经使用的 nonce 并拒绝重复的 nonce,攻击者就无法利用这个 nonce 再发送请求。

timestamp 没有超时限制:如果服务器没有对 timestamp 做超时校验(比如,时间戳与当前时间差超过了 30 秒就会被拒绝),那么攻击者就可以绕过这个机制。攻击者只需要在修改密码后,保持原始的 timestamp,并重新计算签名,就能伪造一个有效的请求。

参考https://mp.weixin.qq.com/s/ZgD7qAQAsNlZgLtdZVCoFw

由于插件没有对应的解密算法,我们可以使用本地的算法

参考https://github.com/SwagXz/encrypt-labs

0 条评论
某人
表情
可输入 255

没有评论