pluto-sqlmap-mcp
Version:
基于 MCP 协议封装的 sqlmap SQL 注入检测工具
87 lines (86 loc) • 3.23 kB
JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { spawn, execSync } from "child_process";
import fs from "fs";
import os from "os";
import dotenv from "dotenv";
dotenv.config();
function resolveSqlmapPath(cliPath) {
if (cliPath && fs.existsSync(cliPath)) {
console.error(`使用命令行传入的 sqlmap 路径: ${cliPath}`);
return cliPath;
}
const envPath = process.env.SQLMAP_PATH;
if (envPath && fs.existsSync(envPath)) {
console.error(`使用环境变量 SQLMAP_PATH: ${envPath}`);
return envPath;
}
try {
const cmd = os.platform() === "win32" ? "where sqlmap" : "which sqlmap";
const output = execSync(cmd).toString().split(/\r?\n/)[0].trim();
if (fs.existsSync(output)) {
console.error(`已在 PATH 中找到 sqlmap: ${output}`);
return output;
}
}
catch {
console.error("未在 PATH 中找到 sqlmap");
}
return null;
}
const args = process.argv.slice(2);
const sqlmapPath = resolveSqlmapPath(args[0]);
if (!sqlmapPath) {
console.error("无法定位 sqlmap。请传入路径,或设置 SQLMAP_PATH,或确保 sqlmap 在系统 PATH 中。");
process.exit(1);
}
console.error(`最终使用 sqlmap 路径: ${sqlmapPath}`);
const server = new McpServer({
name: "sqlmap",
version: "1.0.5"
});
server.tool("do-sqlmap", "使用 sqlmap 执行 SQL 注入检测", {
url: z.string().url().describe("目标 URL"),
sqlmap_args: z.array(z.string()).optional().describe("附加 sqlmap 参数(如 --batch、--cookie)")
}, async ({ url, sqlmap_args = [] }) => {
const finalArgs = ["-u", url, ...(sqlmap_args.length ? sqlmap_args : ["--batch"])];
console.error(`执行命令: ${sqlmapPath} ${finalArgs.join(" ")}`);
const sqlmap = spawn(sqlmapPath, finalArgs, { windowsHide: true });
let stdout = "";
let stderr = "";
sqlmap.stdout.on("data", (data) => {
const text = data.toString();
stdout += text;
console.error("[stdout]", text.trim());
});
sqlmap.stderr.on("data", (data) => {
const text = data.toString();
stderr += text;
console.error("[stderr]", text.trim());
});
return new Promise((resolve, reject) => {
sqlmap.on("close", (code) => {
resolve({
content: [
{ type: "text", text: `sqlmap 执行结束,退出码 ${code}` },
{ type: "text", text: stdout || "(无标准输出)" },
...(stderr ? [{ type: "text", text: "错误输出:\n" + stderr }] : [])
]
});
});
sqlmap.on("error", (error) => {
reject(new Error(`无法启动 sqlmap:${error.message}`));
});
});
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("sqlmap MCP Server 已启动(stdio 模式)");
}
main().catch((error) => {
console.error("MCP Server 启动失败:", error);
process.exit(1);
});