Web Fuzzer的基本概念
Web Fuzzer
是一种自动化安全测试技术,主要用于发现Web应用中的漏洞和安全问题。
核心原理
自动化输入变异 : 通过生成大量变异输入数据(如HTTP请求参数、头部、路径等)
异常检测 : 监控系统对异常输入的响应,识别潜在漏洞
智能遍历 : 结合爬虫技术自动发现和测试所有可访问端点
主要功能
-
• SQL注入检测 -
• XSS漏洞检测 -
• 路径遍历检测 -
• API参数模糊测试 -
• 认证绕过测试
前端加密的常见方式及其安全意义
常见前端加密方式
Base64编码
非真正加密,但常用于简单数据混淆
btoa('data') // 编码atob('ZGF0YQ==') // 解码
RSA非对称加密
常用于密码传输
// 使用jsencrypt等库const encrypt = new JSEncrypt();encrypt.setPublicKey(publicKey);encrypt.encrypt('password');
AES对称加密
适合大量数据加密
CryptoJS.AES.encrypt('data', 'secret').toString();
SHA/MD5哈希
不可逆的摘要算法
CryptoJS.SHA256('data').toString();
JWT Token
用于身份验证
// Header.Payload.Signature结构eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxx
安全意义
-
• 防止明文传输 -
• 避免敏感数据被直接窃取 -
• 抵御中间人攻击 -
• 加密后即使被拦截也难以解密 -
• 符合安全合规要求 -
• 满足GDPR等数据保护法规 -
• 保护用户隐私 -
• 防止用户敏感信息泄露 -
• 增强系统整体安全性 -
• 作为安全防御的第一道防线
动态插桩技术原理与应用场景
简单来说,就是通过修改 javascript 代码,改变原有的代码执行流程,得到我们希望的结果javascript 代码是在我们本地浏览器执行的,因此从理论上来说,无论执行流程多么长,多么复杂,我们想让其在某个位置停下,代码就得停下,之后我们进行一顿操作:修改变量的值、修改函数执行逻辑、修改类的原型等,之后代码根据我们的修改继续执行下去这里引用K哥爬虫文章中的一个比喻,我觉得很恰当通俗来讲,Hook 其实就是拦路打劫,马邦德带着老婆,出了城,吃着火锅,还唱着歌,突然就被麻匪劫了,张麻子劫下县长马邦德的火车,摇身一变化身县长,带着手下赶赴鹅城上任。Hook 的过程,就是张麻子顶替马邦德的过程
典型应用场景
安全测试 :
-
• 漏洞挖掘 -
• 输入验证测试 -
• 敏感数据追踪
性能分析 :
-
• 函数调用耗时统计 -
• 资源使用监控
调试开发 :
-
• 运行时行为分析 -
• 异常捕获
行为监控 :
-
• API调用追踪 -
• 用户行为分析
Web Fuzzer工作原理详解
基本概念
Web Fuzzer是一种自动化安全测试工具,通过向Web应用发送大量变异输入来发现潜在漏洞。
核心工作流程
目标识别
确定测试的URL和参数
测试用例生成
根据规则生成变异输入
请求发送
向目标发送测试请求
响应分析
检查响应中的异常
结果报告
标记潜在漏洞
前端加密技术分析
1. JS混淆
目的 :增加代码阅读难度,防止逆向工程
常见技术 :
-
• 变量名替换(a,b,c等无意义命名) -
• 字符串加密 -
• 控制流扁平化 -
• 死代码插入
示例 :
// 混淆前function login(username, password) {// 登录逻辑}// 混淆后function _0x12ab(a,b){return a+b;}
2. 参数加密
常见方式 :
-
• RSA非对称加密(用于敏感数据传输) -
• AES对称加密(用于大量数据加密) -
• Base64编码(简单混淆) -
• 自定义加密算法
示例 :
// RSA加密示例const encrypt = new JSEncrypt();encrypt.setPublicKey(publicKey);const encrypted = encrypt.encrypt('password');
3. 安全意义
-
• 防止明文传输泄露敏感信息 -
• 增加攻击者逆向分析难度 -
• 符合GDPR等数据保护法规要求 -
• 作为安全防御的第一道防线
4. 局限性
-
• 不能替代后端安全措施 -
• 加密算法可能被逆向 -
• 增加前端性能开销 -
• 需要与HTTPS配合使用
动态插桩技术原理及实现方式
基本原理
运行时修改 : 在程序执行过程中动态修改代码行为
函数劫持 : 通过替换原始函数实现逻辑拦截
代码注入 : 向目标进程注入监控代码片段
主要实现方式
// 函数Hook示例const original = targetFunction;targetFunction = function(...args) {console.log('参数:', args); // 插桩代码return original.apply(this, args);};// Proxy代理示例const handler = {get: function(target, prop) {console.log(`访问属性: ${prop}`);return target[prop];}};const proxy = new Proxy(targetObject, handler);
应用场景
-
• 调试复杂代码流程 -
• 修改第三方库行为 -
• 安全测试中的参数监控 -
• 性能分析工具开发
案例分析
JavaScript加密是在客户端本地执行的,这意味着可以下载JS代码到本地进行分析
案例分析1
某服防火墙
代码分析
根据上图描述当用户点击登录框时会调用onDo函数,从函数内容看用户名,密码,验证码 是直接从webUI中元素获取的
通过追踪参数pp 定位到加密位置
进一步追踪do_encrypt 看到用户输入密码后通过RSA加密
从上面代码段追踪加密后的密文由rsa和自定义参数构成,自己去构造密文太复杂,通过追踪代码执行流程分析用户输入参数-> 加密->服务器验证
我们只需要在加密之前修改用户参数后面步骤直接调用原有参数就行
用户登录一次需要点击登录按键触发事件调用函数onDo,要进行fuzzer 只需要修改用户传入参数然后调用onDo 就能绕过加密fuzzer
动态插桩实现过程
使用google 开发者工具 snipert
// 创建代码片段并执行(function() {//自定义代码})();(function() {//自定义用户名密码const map = new Map([['admin', 'admin'],['test', 'test'],['info', 'info'],['user','user'],['guest','guest'],['test123','test123'],]);//遍历用户名密码修改用户输入参数,调用原有onDo进行加密for (const [key, value] of map) {document.getElementById('user').value = key;document.getElementById("password").value =value;console.log(onDo())};})();
测试结果与分析
通过数据包分析成功绕过加密,实现fuzzer 用户名密码
案例分析2
某应用交付系统
代码分析
通过按键事件分析每次按键会调用submitcheck函数
追踪submitcheck可以看到用户名密码还是用户webUI中元素获取
进一步追踪do_encrypt看见通过RSA通过公匙加密
通过追踪发现密文是由RSA通过公匙加密其他数据没有经过加密
从上面代码段追踪当用户点击登录后触发按键事件调用submitcheck获取用户输入参数,密码RSA通过公匙加密其他数据未进行加密,要fuzzer用户名密码只需要,修改用户名密码,调用submitcheck,不断重复之前步骤就可以
动态插桩实现过程
使用google 开发者工具 snipert
(function() {//自定义用户名密码const map = new Map([['admin', 'admin'],['test', 'test'],['info', 'info'],['user','user'],['guest','guest'],['test123','test123'],]);//遍历用户名密码修改用户输入参数,调用原有submitcheck进行加密for (const [key, value] of map) {document.getElementById('user').value = key;document.getElementById("password").value =value;console.log(submitcheck())};})();
测试结果与分析
通过数据包分析成功绕过加密,实现fuzzer 用户名密码
原文始发于微信公众号(君立渗透测试研究中心):Web Fuzzer 前端加密与动态插桩
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论