渗透测试高级技巧(二):对抗前端动态密钥与非对称加密防护

本文介绍复杂前端加密与解密场景,如动态密钥、非对称加密。以获取密钥和提交表单不在同一请求为例,阐述测试技术,包括用Web Fuzzer序列请求密钥、加密参数,解决HTTP响应加密问题,还提及优化流程,用Yaklang新hook函数处理响应加密数据。

在前文的技术分享中,我们描述了验签和静态对称加密(静态密钥 AES)的常见场景,大家我相信遇到类似的加解密清醒,基本都可以通过热加载的基本使用获得破解前端加密解密的方法,达到一个比较好的测试状态。

在本文中,我们在保持同样的通用适配度的同时,将会来接触更加复杂的前端加密与解密场景:

  1. 动态密钥:无法通过简单的阅读 JavaScript 直接获取加密密钥

  2. 非对称加密技术:使用 RSA / SM2 技术来加密通信数据以避免明文传输

案例:获取密钥和提交表单不在同一个请求中

这个场景可能初步听起来略微抽象,但是实际上却非常常见,我们使用基础的时序图将会很容易理解这个案例:我们首先请求 /get-key 接口获取一个密钥,然后开始用获取到的 KEY 加密表单,在 POST 中提交加密后的数据(可能并不携带密钥),服务器端可以通过服务器的密钥来解密数据

一般来说,这种加密方式并不是一个非常冷门的方式,反而很多网站会使用这种技术来防护自己的登录信息不会泄漏。为此,我们基于实际网站的前端加密混淆方式构建了一个非常经典的案例,来帮助大家掌握这些测试技术。我们在 Vulinbox 中可以获取到关于这个部分的靶场测试环境:

首先打开网站,抓包看一下通信流程发现网站请求完资源后会去加载一套证书:

因此我们需要去寻找 JavaScript 中的加密线索:

那么基于此,加密的基本脉络就很清楚了,我们需要先发一个请求去服务端获取私钥用来解密签名的数据(来自于服务器),获取公钥来签名需要发送到后端的数据。但是实际上这还不够,我们知道有一些基本资料:

RSA-OAEP的最大加密长度取决于RSA的密钥长度和OAEP填充的长度。OAEP填充需要额外的空间,通常是两倍的哈希长度加上2(对于SHA-1和SHA-256,这将分别是42和66字节)。因此,对于一个n位的RSA密钥,最大的明文长度将是n/8减去OAEP填充的长度。

我们并不能直接使用 OAEP 去加密大段的数据,那这种情况下,我们知道 AES KEY 一般来说并不会太大,所以使用“混合加密(RSA-OAEP + AES)” 实际上是比较好的解决方案,否则我们就需要把大量数据进行切片传输,这实际上非常不符合常理。

那么我们继续从 JavaScript 中寻找线索:

捋清思路,准备动手

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值