Web Fuzzer
是一种自动化安全测试技术,主要用于发现Web应用中的漏洞和安全问题。
自动化输入变异 : 通过生成大量变异输入数据(如HTTP请求参数、头部、路径等)
异常检测 : 监控系统对异常输入的响应,识别潜在漏洞
智能遍历 : 结合爬虫技术自动发现和测试所有可访问端点
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
简单来说,就是通过修改 javascript 代码,改变原有的代码执行流程,得到我们希望的结果javascript 代码是在我们本地浏览器执行的,因此从理论上来说,无论执行流程多么长,多么复杂,我们想让其在某个位置停下,代码就得停下,之后我们进行一顿操作:修改变量的值、修改函数执行逻辑、修改类的原型等,之后代码根据我们的修改继续执行下去这里引用K哥爬虫文章中的一个比喻,我觉得很恰当通俗来讲,Hook 其实就是拦路打劫,马邦德带着老婆,出了城,吃着火锅,还唱着歌,突然就被麻匪劫了,张麻子劫下县长马邦德的火车,摇身一变化身县长,带着手下赶赴鹅城上任。Hook 的过程,就是张麻子顶替马邦德的过程
安全测试 :
性能分析 :
调试开发 :
行为监控 :
Web Fuzzer是一种自动化安全测试工具,通过向Web应用发送大量变异输入来发现潜在漏洞。
目标识别
确定测试的URL和参数
测试用例生成
根据规则生成变异输入
请求发送
向目标发送测试请求
响应分析
检查响应中的异常
结果报告
标记潜在漏洞
目的 :增加代码阅读难度,防止逆向工程
常见技术 :
示例 :
// 混淆前
function login(username, password) {
// 登录逻辑
}
// 混淆后
function \_0x12ab(a,b){return a+b;}
常见方式 :
示例 :
// RSA加密示例
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
const encrypted = encrypt.encrypt('password');
运行时修改 : 在程序执行过程中动态修改代码行为
函数劫持 : 通过替换原始函数实现逻辑拦截
代码注入 : 向目标进程注入监控代码片段
// 函数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代码到本地进行分析
某服防火墙
代码分析
根据上图描述当用户点击登录框时会调用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 用户名密码
某应用交付系统
代码分析
通过按键事件分析每次按键会调用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 用户名密码