1. 项目概述:当渗透测试遇上前端加密
在Web应用安全测试,尤其是渗透测试的日常工作中,我们常常会遇到一个令人头疼的“拦路虎”:前端加密。你精心构造的SQL注入Payload,你反复测试的XSS向量,在提交到服务器之前,被页面里的一段JavaScript代码悄无声息地加密了。Burp Suite抓到的请求包,不再是明文的 username=admin&password=123456 ,而是一串毫无头绪的、长得像 a1b2c3d4e5... 这样的密文。服务器只认这串密文,你的攻击载荷如果不对其进行同样的加密处理,就会被直接丢弃,测试工作瞬间陷入僵局。这就是“前端加密防线”,它像一道无形的墙,将传统的基于明文请求的测试手法挡在了门外。
“突破前端加密防线”这个项目,核心就是解决上述困境。它不是一个单一的工具,而是一套结合了动态调试、代码模拟与流量重放的综合实战方法论。其目标用户非常明确:Web安全工程师、渗透测试人员、漏洞挖掘爱好者,以及任何需要与存在前端加密机制的Web应用“过招”的安全从业者。简单来说,如果你在测试中遇到了请求参数被加密的情况,感觉无从下手,那么这套指南就是为你准备的。
项目的核心围绕着两个关键工具展开: BurpCrypto 和 jsEncrypter 。它们并非相互替代,而是相辅相成,共同构成了破解前端加密的“组合拳”。BurpCrypto更像是一个“全能解码器”和“实时加密器”,它作为Burp Suite的一个插件,能够让你在Burp的各个模块(Proxy, Repeater, Intruder, Scanner)中,直接对经过加密的请求进行解密查看,也能将你修改后的明文Payload实时加密后再发送,极大提升了测试效率。而jsEncrypter则是一个“加密算法模拟器”,它的核心思想是“以彼之道,还施彼身”——通过分析前端JavaScript代码,提取出关键的加密函数,然后在Burp的扩展环境中用Python或JavaScript重新实现这个函数。这样,Burp Suite就能在后台自动调用这个函数,对你的测试载荷进行“原汁原味”的加密。
为什么这套方法如此重要?因为现代Web应用,特别是涉及登录、支付、敏感操作等环节,普遍采用了前端加密来提升安全性。常见的如对密码进行RSA非对称加密后再传输,或者使用AES对称加密整个请求体。这虽然不能替代HTTPS,但确实增加了攻击者直接嗅探或重放明文数据的难度。对于安全测试者而言,这不再是可选项,而是必须掌握的技能。本指南将带你从零开始,深入这两个工具的原理与实战,让你具备穿透这层加密防护的能力。
2. 核心工具解析与工作流设计
面对前端加密,一个系统性的工作流至关重要。盲目地开始抠代码或者配置插件,往往事倍功半。一个高效的流程应该是:识别 -> 分析 -> 模拟 -> 集成 -> 测试。下面我们来详细拆解BurpCrypto和jsEncrypter在这个工作流中扮演的角色,以及如何根据不同的场景进行选型。
2.1 BurpCrypto:实时加解密的瑞士军刀
BurpCrypto的设计理念是“无缝集成”和“实时处理”。它将自己深度嵌入到Burp Suite的工作流中,主要解决两个痛点: 看不清 和 改不动 。
- 看不清 :当你在Proxy history中看到一个请求的
data字段是一长串Base64或Hex编码的字符串时,你无法直观知道里面包含了哪些参数及其值。BurpCrypto可以配置解密规则,在Burp的界面中直接以明文形式展示解密后的内容,就像它原本就是明文请求一样。 - 改不动 :当你在Repeater中想要修改某个参数值时,你需要先整体解密,修改,再手动调用加密函数加密,最后替换原数据。这个过程繁琐且易错。BurpCrypto允许你直接修改解密后的明文,在你发送请求的瞬间,它会自动按照规则将整个请求体重新加密。
它的工作原理基于“配置化”的加解密算法。你需要在插件界面中,根据目标网站使用的加密算法(如AES-CBC、RSA-PKCS1_v1_5、SM4等),填写对应的密钥、IV(初始化向量)、填充模式等参数。一旦配置完成,BurpCrypto就会在后台自动应用这些规则。
适用场景 :
- 加密算法标准、已知 :目标网站使用了常见的、标准化的加密算法(如AES、RSA),并且你能通过静态分析或调试轻易地获取到密钥和IV。例如,很多应用会将密钥硬编码在JS文件中,或通过固定的方式生成。
- 快速验证与爆破 :当你已经分析出加密逻辑,需要进行快速的参数修改、重放攻击或使用Intruder进行爆破时,BurpCrypto的实时性优势巨大。
- 全链路加解密 :需要对整个测试过程中的所有相关请求(登录、查询、提交等)都进行加解密处理。
注意 :BurpCrypto的强大依赖于准确的配置。如果密钥是动态生成的(例如每次会话从服务器获取一个随机密钥),那么静态配置的BurpCrypto将失效。此时需要更动态的解决方案。
2.2 jsEncrypter:定制化加密算法的模拟工厂
如果BurpCrypto是“配置化”的解决方案,那么jsEncrypter就是“编程化”的。它的核心是一个Burp扩展,包含一个本地运行的Web服务器(通常基于Tornado)和一个浏览器环境(通过PhantomJS或Selenium驱动)。
它的工作流程更具技术深度:
- 分析提取 :你首先需要人工分析目标网站的JavaScript代码,找到执行加密的核心函数。例如,一个名为
encryptData(data)的函数。 - 代码模拟 :在jsEncrypter提供的模板文件(一个HTML文件)中,你需要将找到的加密函数及其所有依赖(相关的JS库、辅助函数等)整合进去。确保在这个独立的HTML环境中,调用
encryptData能产生和原网站一样的密文。 - 服务集成 :启动jsEncrypter插件,它会运行一个本地服务。Burp Suite会将需要加密的明文Payload发送到这个服务。
- 动态执行 :本地服务中的“浏览器”会加载你编写好的HTML模板,并在内存中执行JavaScript代码,调用你模拟的加密函数,对Payload进行加密。
- 结果返回 :加密后的密文被返回给Burp Suite,用于构造最终的HTTP请求。
适用场景 :
- 算法复杂、自定义 :目标网站的加密逻辑是自定义的,或者混淆得非常严重,无法用标准的加密库简单配置。例如,使用了多种算法嵌套、加入了时间戳或随机盐进行签名、或者有独特的编码变换。
- 密钥动态生成 :加密密钥并非固定,而是每次由服务器下发或根据某些客户端信息动态计算得出。jsEncrypter的浏览器环境可以完美复现这个动态过程。
- 需要完整执行环境 :加密过程严重依赖浏览器的特定对象(如
window、document)或Web API,这些在纯Python/Java环境中难以模拟。
工具选型决策流 : 面对一个加密的请求,我通常的决策路径是这样的:
- 第一步:快速侦察 。用浏览器开发者工具的“搜索”功能,全局搜索
encrypt、encode、CryptoJS、AES、RSA等关键词。如果能直接找到密钥(key、secret、iv)的明文或简单生成逻辑,优先尝试用BurpCrypto配置。 - 第二步:深度分析 。如果找不到密钥,或加密函数看起来是自定义的、混淆的。那就需要深入调试,找到加密的入口函数。如果能将这个函数及其依赖清晰地剥离出来,就使用jsEncrypter。
- 第三步:混合使用 。在复杂场景下,两者可以结合。例如,用jsEncrypter处理最核心的动态密钥生成或签名,而用BurpCrypto处理后续的标准算法加密,或者反过来。
2.3 实战工作流设计
一个完整的突破流程,可以概括为以下五个阶段,其中工具的选择与应用贯穿始终:
- 侦察与识别 :使用Burp Suite或浏览器抓包,确认哪些请求参数被加密。观察加密数据的特征(长度、编码格式如Base64/Hex)。在开发者工具的Sources或Network面板中搜索加密相关关键字。
- 静态分析与动态调试 :这是最关键的阶段。在Sources面板中查找、阅读并理解加密JS文件。在加密函数调用处设置断点,单步调试,观察输入(明文)如何一步步变成输出(密文)。记录下关键的算法名称、模式、填充方式、密钥、IV等。此时,你就在为使用BurpCrypto(收集参数)或编写jsEncrypter模板(理解函数逻辑)做准备。
- 工具配置与模拟 :
- 如果选择BurpCrypto:在插件界面新建规则,选择算法,填入调试阶段获取的密钥、IV等参数。配置作用域(URL范围)。
- 如果选择jsEncrypter:创建一个新的HTML文件,将调试确认的加密函数及其所有依赖代码复制进去。编写一个简单的调用接口,确保在浏览器中打开这个HTML文件,通过控制台测试加密结果与原网站一致。
- 集成与验证 :
- BurpCrypto:在Proxy或Repeater中查看,原本的密文是否已自动解密为明文。尝试修改一个明文参数,发送请求,查看服务器是否正常响应(这意味着自动加密成功)。
- jsEncrypter:启动插件服务,在Burp的
jsEncrypter选项卡中加载你的模板,测试加密功能。然后在Intruder等模块中配置Payload Processing,添加Invoke Burp extension处理器,选择jsEncrypter。
- 自动化测试 :工具集成成功后,你就可以像对待普通明文请求一样开展测试了。使用Repeater进行手动修改与重放,使用Intruder进行模糊测试和爆破,使用Scanner进行主动扫描。所有加密/解密过程都在后台自动完成。
3. 核心细节解析与实操要点
掌握了宏观工作流,我们深入到微观层面,看看在实际操作中,那些决定成败的细节和容易踩坑的地方。这部分内容往往是官方文档不会强调的,却是在实战中血与泪的教训。
3.1 加密算法的识别与密钥提取
前端加密并非无迹可寻,常见的库和模式有很强的指纹特征。
- CryptoJS :这是最流行的前端加密库之一。如果你在JS代码中看到
CryptoJS.AES.encrypt、CryptoJS.enc.Utf8.parse、CryptoJS.enc.Base64.stringify这样的调用,那几乎可以确定是它。密钥和IV通常以字符串或WordArray对象形式出现。你需要找到传给encrypt方法的key和iv参数。 关键点 :CryptoJS默认使用PKCS#7填充,且key和iv通常需要从字符串通过CryptoJS.enc.Utf8.parse转换而来。在BurpCrypto中配置时,密钥和IV要填写原始的字符串,而不是parse后的对象表示。 - RSA加密 :常用于加密密码等敏感短数据。特征包括使用
JSEncrypt库,或直接调用window.crypto.subtle.encrypt。你需要找到公钥(public key),通常是一个PEM格式的字符串,以-----BEGIN PUBLIC KEY-----开头。 难点 :RSA加密每次结果都可能不同(因为填充随机),但这不影响BurpCrypto或jsEncrypter的使用,只要公钥正确即可。 - 自定义加密/编码 :有时开发者会自己写一些简单的XOR、Base64变种、或字符串反转拼接等。这类加密强度不高,但识别起来需要耐心。在调试时,重点关注数据在传输前最后经过的那个函数。
密钥提取的实战技巧 :
- 全局搜索 :在开发者工具的Sources面板,按
Ctrl+Shift+F进行全局文件搜索。关键词包括:key,secret,iv,encrypt,password,cipher。 - XHR断点 :在Sources面板的
XHR/fetch Breakpoints中,添加包含加密参数(如data、encryptedData)的URL片段断点。当请求发出时,代码会暂停,调用栈能直接引导你到加密函数。 - Hook关键函数 :在Console中注入代码,Hook
JSON.stringify、btoa、或CryptoJS.AES.encrypt等方法,打印其参数和返回值。这是对付混淆代码的利器。// 示例:Hook CryptoJS.AES.encrypt var _encrypt = CryptoJS.AES.encrypt; CryptoJS.AES.encrypt = function(message, key, cfg){ console.log("[Hook] Encrypt called:"); console.log("Message:", message); console.log("Key:", key); console.log("Cfg:", cfg); var result = _encrypt(message, key, cfg); console.log("Result:", result.toString()); return result; } - 留意网络请求 :有时密钥或加密所需的盐(salt)会通过另一个单独的API请求从服务器获取。务必检查在登录请求之前发生的所有请求。
3.2 BurpCrypto的精准配置
配置BurpCrypto时,一个参数的错误就会导致整个加解密失败。以下是针对不同算法的核心配置项解析:
| 算法模式 | 关键配置项 | 常见陷阱与注意事项 |
|---|---|---|
| AES-CBC/PKCS5Padding | 密钥(Key), 初始化向量(IV), 数据格式(Input/Output) | 密钥/IV格式 :如果JS中是 CryptoJS.enc.Utf8.parse('1234567812345678') ,那么Key就是字符串 1234567812345678 。BurpCrypto的Key/IV字段应直接填这个字符串,并选择正确的编码(如UTF-8)。 数据格式 :如果JS加密后用了 .toString(CryptoJS.enc.Base64) ,那么Output应选Base64;如果用了 .toString() 或 .toString(CryptoJS.enc.Hex) ,则对应Hex。Input同理,看明文传入时的格式。 |
| RSA/ECB/PKCS1Padding | 公钥(Public Key) | 公钥格式 :确保粘贴完整的PEM格式公钥,包括 -----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 。如果网站用的是 JSEncrypt ,公钥可能在一行内,需要手动添加头尾标识符。 填充模式 :前端RSA最常见的是PKCS1_v1_5填充,在BurpCrypto中对应 PKCS1Padding 。 |
| 自定义算法/编码 | 需编写自定义脚本 | BurpCrypto支持 Jython 或 JavaScript 脚本。你需要编写 process 函数,接收明文/密文,返回加密/解密结果。这对于Base64换表、简单异或等非常有效。 |
一个关键的验证步骤 :在配置好BurpCrypto后,不要急于在Repeater中测试整个请求。先在插件界面提供的“测试”区域,输入一段已知的明文,点击加密,看生成的密文是否与浏览器发送的完全一致。这是隔离问题、确保配置正确的黄金法则。
3.3 jsEncrypter模板的编写与调试
编写一个能稳定工作的jsEncrypter模板,是这项技术中最需要耐心和技巧的环节。
模板的基本结构 :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsEncrypter Template</title>
<!-- 1. 引入依赖的JS库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<!-- 或者将本地保存的加密JS文件内容直接内联在这里 -->
<script>
// 2. 将目标网站的核心加密函数及相关代码复制到这里
// 注意:可能需要复制一整个IIFE(立即执行函数表达式)或一个对象
function targetEncrypt(data) {
// 这是从目标网站分析出来的加密函数
var key = CryptoJS.enc.Utf8.parse('固定的密钥');
var iv = CryptoJS.enc.Utf8.parse('固定的IV');
var encrypted = CryptoJS.AES.encrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
</script>
</head>
<body>
<!-- jsEncrypter会通过这个div获取结果 -->
<div id="result"></div>
<script>
// 3. 与jsEncrypter通信的接口函数
// 这个函数名(如`encrypt`)需要在Burp的jsEncrypter插件中指定
function encrypt(input) {
try {
// 调用我们复现的加密函数
var encryptedData = targetEncrypt(input);
// 将结果写入指定的div
document.getElementById("result").innerHTML = encryptedData;
} catch(e) {
document.getElementById("result").innerHTML = "ERROR: " + e.message;
}
}
</script>
</body>
</html>
编写与调试的避坑指南 :
- 环境隔离与依赖管理 :目标网站的加密代码可能依赖了多个JS文件,或者使用了
Webpack、RequireJS等模块化加载器。你无法简单复制一个函数。这时,需要将整个加密相关的代码块(通常是一个大的闭包或模块定义)复制出来,并手动创建它所需要的全局变量或模拟require环境。一个取巧的办法是:在浏览器控制台中,在加密函数执行后,直接输入函数名,如window.encryptData,将其toString()后的源码复制出来,这通常包含了函数定义及其闭包内的依赖。 - 处理动态参数 :如果密钥、IV或盐是动态获取的(例如来自上一个API响应),你的模板就不能写死。需要在模板中模拟这个获取过程。可以在
encrypt函数里先用XMLHttpRequest或fetch(注意同源策略,可能需要目标服务器支持CORS,通常不行)模拟请求,或者更常见的做法是: 将动态值作为加密函数的一部分输入 。例如,修改targetEncrypt函数,接受数据和动态密钥两个参数,然后在Burp的Payload Processing中,通过Invoke Burp extension处理器,自定义一个生成动态密钥的扩展,再将数据和密钥一起传给jsEncrypter。 - 编码与格式问题 :确保你的模板HTML文件保存为UTF-8编码,否则中文字符在加密时可能会出错。另外,jsEncrypter的通信默认期望
encrypt函数返回字符串,且结果会从id="result"的div中读取。不要更改这个通信协议。 - 本地测试 :在将模板加载到jsEncrypter之前,一定要在浏览器中直接打开这个HTML文件,按
F12打开控制台,手动调用encrypt('test'),查看输出是否正确,以及控制台是否有报错。这是调试模板最直接的方法。
4. 实操过程与核心环节实现
理论说再多,不如一次完整的实战。我们假设一个目标场景:某登录接口,其密码字段使用AES-CBC模式加密,密钥和IV硬编码在JS中。我们将使用BurpCrypto和jsEncrypter两种方式分别实现突破。
4.1 场景一:使用BurpCrypto破解固定AES加密
步骤1:侦察与抓包 使用浏览器访问登录页,输入用户名 test 和密码 123456 ,在Burp Suite中开启代理拦截,点击登录。在Proxy的HTTP history中,找到登录请求(如 POST /api/login )。查看请求体,发现类似:
username=test&password=U2FsdGVkX19KbWxQv2z3pQ6r7L1M5oYhHjNlKuI%2B%3D%3D
这里的 password 值明显是经过Base64编码的密文(注意URL编码后的 %2B 和 %3D 是 + 和 = )。
步骤2:静态分析与调试
- 在浏览器中打开开发者工具(F12),进入Sources面板,全局搜索(Ctrl+Shift+F)关键词
password、encrypt、AES。 - 很快,我们找到一个名为
login.js的文件,其中包含关键代码:function encryptPassword(pwd) { var key = CryptoJS.enc.Utf8.parse('0123456789abcdef'); // 16字节密钥 var iv = CryptoJS.enc.Utf8.parse('abcdef0123456789'); // 16字节IV var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(pwd), key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString(CryptoJS.enc.Base64); } // 调用 var pwdEnc = encryptPassword($('#password').val()); - 确认算法为
AES-CBC,填充为PKCS7(对应Java的PKCS5Padding),密钥key为字符串0123456789abcdef,IV为abcdef0123456789。输入是字符串,输出是Base64。
步骤3:配置BurpCrypto
- 在Burp Suite的Extender标签页中,确保已安装BurpCrypto插件。
- 进入
BurpCrypto标签页,点击Add新建一个处理器。 -
Processor Type选择Crypto。 -
Algorithm选择AES。 -
Mode选择CBC。 -
Padding选择PKCS5Padding。 -
Key填入0123456789abcdef,Encoding选择UTF-8。 -
IV填入abcdef0123456789,Encoding选择UTF-8。 -
Input encoding选择Raw(因为函数内部用CryptoJS.enc.Utf8.parse将字符串转成了WordArray,对于BurpCrypto,我们直接输入字符串即可,它会按UTF-8处理)。 -
Output encoding选择Base64。 - 在
Scope中配置作用域,例如http://target.com。 - 点击
Test,在Plain输入框输入123456,点击Encrypt。观察生成的密文是否与抓包中的password值(先URL Decode)一致。如果一致,说明配置成功。
步骤4:集成验证与测试
- 回到Proxy history,找到那个登录请求,右键发送到Repeater。
- 在Repeater中,你应该能看到
password参数已经被 自动解密 为明文123456。这是因为我们配置的解密规则生效了。 - 将明文密码修改为
admin123,直接点击Send。 - 查看发送出去的请求,你会发现
password参数的值已经变成了admin123加密后的新密文。BurpCrypto在你发送时自动完成了加密。 - 服务器返回了不同的响应(可能是密码错误或成功),这证明我们的加解密链路完全打通,可以开始进行暴力破解或模糊测试了。
4.2 场景二:使用jsEncrypter破解复杂混淆加密
现在假设一个更复杂的情况:加密函数被严重混淆,密钥虽然固定但隐藏在复杂的逻辑中,直接提取困难。我们决定使用jsEncrypter。
步骤1:分析并提取加密逻辑
- 同样通过断点或搜索,定位到加密函数入口。假设函数名被混淆为
_0x12ab3c。 - 在开发者工具的Console中,输入
_0x12ab3c.toString(),将其完整的函数定义复制出来。 - 分析发现,这个函数内部调用了其他几个被混淆的函数,并且依赖了一个外部变量
window.__SECRET_KEY(但该变量在另一个文件中定义)。 - 我们需要将
_0x12ab3c函数、它直接调用的所有函数、以及window.__SECRET_KEY的定义,全部复制出来。
步骤2:编写jsEncrypter模板
- 创建一个新的HTML文件,如
target_encrypt.html。 - 将复制出来的所有JS代码,按照它们原有的顺序和依赖关系,整合到
<script>标签中。确保window.__SECRET_KEY被正确赋值。 - 编写与jsEncrypter通信的接口函数。
<!DOCTYPE html> <html> <head><meta charset="UTF-8"></head> <body> <div id="result"></div> <script> // 粘贴所有从目标网站提取的、混淆过的加密相关代码 window.__SECRET_KEY = "aVeryComplicatedKey123!"; function _0x12ab3c(data) { /* ... 混淆的加密逻辑 ... */ return encryptedStr; } function _0xcd45ef(x) { /* ... 被调用的辅助函数 ... */ } // ... 其他依赖函数 // jsEncrypter接口函数 function encrypt(input) { try { // 调用混淆后的加密函数 var output = _0x12ab3c(input); document.getElementById("result").innerHTML = output; } catch(e) { document.getElementById("result").innerHTML = "ERROR: " + e.message; } } </script> </body> </html>
步骤3:本地测试模板
- 在浏览器中打开
target_encrypt.html。 - 按F12打开控制台,输入
encrypt('test')并回车。 - 观察
id="result"的div内容是否变化,以及控制台是否有错误。同时,可以手动计算一下_0x12ab3c('test')的结果,与从真实网站抓包得到的密文(用test作为密码)进行对比,确保一致。
步骤4:配置与集成jsEncrypter
- 在Burp的Extender标签页,确保jsEncrypter插件已加载。
- 切换到
jsEncrypter标签页,点击Start Server启动本地服务(默认端口1664)。 - 在
Script Path中,选择你编写好的target_encrypt.html文件。 - 在
Function Name中,填入接口函数名encrypt。 - 点击
Test,在下方输入框输入test,点击encrypt,查看返回结果是否与本地测试一致。如果一致,说明插件加载成功。 - 现在,你可以在Intruder中使用了。在Intruder的
Payloads标签页,配置好你的字典。然后切换到Payload Processing,点击Add,选择Invoke Burp extension,在扩展列表中选择jsEncrypter。这样,Intruder发出的每个Payload,都会先被这个扩展处理(即加密),然后再发送。
步骤5:进行自动化攻击 配置好jsEncrypter后,在Intruder中针对 password 参数进行暴力破解,其工作流程就变成了:明文字典 -> jsEncrypter加密 -> 发送加密后的请求 -> 接收响应。整个过程完全自动化,你无需关心加密细节。
5. 常见问题与排查技巧实录
即使按照步骤操作,在实际环境中你仍会遇到各种问题。下面是我在大量实战中总结的常见问题及其排查思路,希望能帮你快速定位问题。
5.1 通用问题排查表
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| BurpCrypto解密/加密后,服务器返回错误 | 1. 算法/模式/填充配置错误。 2. 密钥/IV格式或编码错误。 3. 输入/输出编码设置错误。 4. 作用域(Scope)未包含目标URL。 | 1. 使用测试功能 :在BurpCrypto配置界面,用已知明文和密文进行加密/解密测试,对比结果。 2. 核对原始JS :逐字核对JS中的算法名(如 mode: CBC )、密钥字符串、IV字符串、以及 toString 的编码( Base64 / Hex )。 3. 检查编码 :确保BurpCrypto中的Key/IV编码与JS中的 CryptoJS.enc.Utf8.parse 对应(选UTF-8)。 4. 检查请求 :确认加密后的请求体格式是否与原始一致(如是否有多余的引号或换行)。 |
| jsEncrypter测试返回ERROR或空白 | 1. 模板HTML存在JS语法错误。 2. 加密函数依赖了未定义的变量或浏览器API。 3. 接口函数名 encrypt 与模板中不一致。 4. 模板文件编码非UTF-8导致中文乱码。 | 1. 浏览器控制台调试 :直接在浏览器中打开模板HTML,看控制台是否有红色报错。这是最直接的排查方法。 2. 简化测试 :在模板的 encrypt 函数内,直接 return "fixed_string"; ,测试通信是否正常。如果正常,问题在加密逻辑本身。 3. 模拟环境 :检查加密函数是否使用了 document.cookie 、 window.location 等。在模板中可能需要模拟这些对象。 4. 查看插件日志 :Burp的Extender标签页,选中jsEncrypter,点击 Errors ,查看是否有运行时报错。 |
| 加密结果与网站不一致 | 1. 加密函数的输入预处理不一致。 2. 存在随机数或时间戳盐。 3. 密钥是动态的。 | 1. 对比输入 :在网站加密处和你的模板中,分别用 console.log 打印加密前的数据,确保完全一致(包括类型,是字符串还是对象)。 2. 查找盐值 :在加密函数中搜索 random 、 salt 、 nonce 、 Date.now() 等关键词。如果存在,需要在模板中复现相同的生成逻辑。 3. 追踪密钥来源 :在网站加密前设置断点,查看密钥变量的值是如何来的。可能是上一个请求的响应,也可能是本地计算。 |
| Intruder使用jsEncrypter后速度极慢 | jsEncrypter为每个Payload都启动/复用了一个浏览器环境执行JS,开销巨大。 | 1. 优化模板 :移除模板中不必要的HTML元素和JS库,只保留最核心的加密代码。 2. 减少依赖 :尽量避免在加密函数中执行网络请求或复杂计算。 3. 权衡使用 :对于超大字典的爆破,考虑先用脚本离线生成密文字典,再导入Intruder使用。或者,如果算法简单,尝试用BurpCrypto的Jython脚本实现。 |
遇到 Webpack 打包的模块化代码 | 加密函数被包裹在模块内,无法直接作为全局函数调用。 | 1. 提取模块加载器 :尝试找到并复制整个模块定义的代码块。 2. Hook导出函数 :在网站控制台,找到模块导出加密函数的对象,将其赋值给一个全局变量。例如,如果加密函数是 module.exports.encrypt ,可以在控制台执行 window.myEncrypt = module.exports.encrypt ,然后复制 window.myEncrypt 的函数体。 3. 使用 eval (谨慎):在模板中,将模块化的代码包裹在一个自执行函数中,并手动导出函数到全局。 |
5.2 进阶技巧与心得
- 对付反调试 :有些网站会检测开发者工具,在打开时跳入死循环或清空加密函数。可以尝试在无头模式下使用工具(如Selenium),或者使用
setTimeout延迟调试、使用debugger语句覆盖等方式绕过。对于简单的debugger语句,可以在开发者工具设置中禁用“断点”或使用条件断点跳过。 - 处理
WebSocket加密 :BurpCrypto和jsEncrypter主要处理HTTP/HTTPS流量。如果加密发生在WebSocket消息中,思路类似,但工具不同。你需要分析WebSocket建立后,消息的加密逻辑,并编写脚本在Burp的WebSocket标签页中手动加解密,或者使用Burp Suite的BApp Store中的WebSocket相关插件进行辅助。 - 保持模板的可持续性 :将成功的jsEncrypter模板妥善保存,并添加详细的注释,说明目标网站、加密算法、密钥来源、以及任何特殊的处理步骤。在未来的测试或网站更新时,这将是一笔宝贵的财富。
- 合法合规是底线 :所有技术都必须在获得明确授权的范围内对目标系统使用。未经授权的测试是违法行为。在内部测试或授权渗透测试中,也应注意测试数据的敏感性,避免使用真实用户数据或进行破坏性操作。
突破前端加密防线,本质上是一场与开发者之间的“信息战”和“模拟战”。你需要比开发者更了解他的代码逻辑,并能在自己的环境中完美复现它。这个过程充满挑战,但一旦成功,那种穿透防护、直抵核心的成就感,以及由此带来的安全价值的提升,无疑是巨大的。BurpCrypto和jsEncrypter就是这场战斗中最称手的两件兵器,熟练运用它们,你将能在Web安全测试的道路上走得更远、更稳。


2万+

被折叠的 条评论
为什么被折叠?



