网络安全(Java语言)简单脚本汇总 (一)

发布于:2025-08-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

文章目录

  • 敏感信息探测脚本
    • 源代码
    • 思路
  • URL批量存活探测器
    • 源代码
    • 思路
  • 端口扫描器
    • 源代码
    • 思路

敏感信息探测脚本

源代码


/**
 * @description 该脚本通过分析HTTP响应头,来检测可能暴露服务器信息的安全隐患
 */

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class HeaderLeakScanner {

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要扫描的URL(例如:http://example.com):");
        String urlString = scanner.nextLine();

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);

        // 发起请求
        int responseCode = connection.getResponseCode();
        System.out.println("HTTP响应状态码: " + responseCode);

        // 获取响应头
        Map<String, List<String>> headers = connection.getHeaderFields();
        //就是标签和值的组合的集合 headers.entrySet()就是逐个查看每个标签和对应的筐子
        boolean found = false;

        System.out.println("\n响应头信息如下:");

        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
            String key = entry.getKey();
            List<String> values = entry.getValue();
            //Map.entry可以将键和值一起抓取,方便直接获取其相关信息,但是如果不是用就需要先找到key,再通过key找value
            if (key != null) {
                System.out.println(key + ": " + String.join(", ", values));

                // 检查是否包含敏感字段
                if (key.equalsIgnoreCase("Server") ||
                        key.equalsIgnoreCase("X-Powered-By") ||
                        key.equalsIgnoreCase("X-AspNet-Version")) {
                    found = true;
                }
            }
        }

        if (found) {
            System.out.println("\n⚠ 该站点存在潜在的HTTP头信息泄露!");
        } else {
            System.out.println("\n✅ 未发现明显的HTTP头信息泄露。");
        }

        connection.disconnect();
    }
}

思路

接收用户输入的字符串 ---- > 将字符串转换为URL类型 -----> 向此URL发起连接
----> 设置连接的请求头 ------> 发起请求并获取响应码和响应体 ------> 将属性及对应的值使用Map类型进行存储 -----> 对其中的属性进行敏感信息的匹配 ,如果匹配成功,则提示,如果未成功则提示匹配失败

URL批量存活探测器

源代码

/**
 *  脚本功能:URL批量存活探测器
 *  @function:1.输入一个包含一堆URL的txt文件
 *             2.脚本自动尝试连接这些URL
 *             3.输出响应码和是否存活
 *             4,将结果输出到文件result.txt
 */
//引入Java标准库中的类
import java.io.*;   //导入文件读写相关的类,比如BufferedReader,FileReader,BufferedWriter,FileWriter
import java.net.HttpURLConnection;  //用于发送HTTP请求
import java.net.URL;   //用来处理网址对象,比如创建URL,打开连接等

//主类和主方法
public class URLScanner {
    public static void main(String[] args) {
        String inputFile = "urls.txt";
        String outputFile = "result.txt";
        //定义两个字符串,分别表示要读取的网址列表文件(输入) 和 要保存结果的文件

        //打开文件,逐行读取
        try(BufferedReader reader = new BufferedReader(new FileReader(inputFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
            //从url.txt中一行行读取URL
            //BufferedWriter 将检测结果写入到result.txt
            String line;
            //定义好读取内容的字符串对象 在下方进行赋值
            while ((line = reader.readLine()) != null) {
                String url = line.trim();
                //去除首尾空格,跳过空行
                if (url.isEmpty()) continue;
                int status = getHttpStatus(url);
                String result = url + "=>" + status + "[" + (status == 200 ? "存活" : "异常") + "]";
                System.out.println(result);
                writer.write(result);
                writer.newLine();
                //同时打印结果到控制台和写入到结果文件中
            }
            System.out.println("\n扫描完成,结果已写入result.txt。");
        } catch (IOException e) {
            System.out.println("文件读取/写入出错:" + e.getMessage());
        }
    }

    public static int getHttpStatus(String urlStr) {
        try {
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(3000);
            //设置连接服务器的超时
            conn.setReadTimeout(3000);
            //设置读取数据的超时时间为3秒
            conn.setRequestMethod("GET");
            //指导HTTP请求方法为GET
            return conn.getResponseCode();
        } catch (IOException e) {
            return -1;
        }
    }
}

思路

  1. 首先分别定义好要存放扫描的URL和存放扫描结果的文件
  2. 创建文件读取和文件写入对象
  3. 对存放的URL进行读取进行首尾去空,非空等判断
  4. 对进行处理后的URL进行请求连接
  5. 连接思路和上方敏感信息泄露探测脚本思路一样
  6. 将由响应码组成的结果存入相对应的文件中

端口扫描器

源代码

/**
 * @description 端口扫描器
 * 在该程序中,for循环负责循环将任务提交给线程池进行
 */
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedPortScanner {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 获取用户输入
        System.out.print("请输入目标 IP 地址:");
        String targetIP = scanner.nextLine();

        System.out.print("请输入起始端口(如 1):");
        int startPort = scanner.nextInt();

        System.out.print("请输入结束端口(如 65535):");
        int endPort = scanner.nextInt();

        System.out.print("请输入线程数(建议 100~500):");
        int threadCount = scanner.nextInt();

        System.out.println("\n开始扫描主机 " + targetIP + " 的端口 " + startPort + " 到 " + endPort + "...\n");

        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
        // 创建一个线程池,最多同时执行threadCount个任务,这避免了手动管理线程,同时提高扫描效率
        for (int port = startPort; port <= endPort; port++) {
        //从起始端口(startPort) 循环到结束端口 (endPort) , 一个个端口地扫描
            int finalPort = port;
            executor.execute(() -> {
            // 提交一个任务给线程池
                try (Socket socket = new Socket()) {
                //使用Socket试图连接目标主机的finalPort
                    socket.connect(new InetSocketAddress(targetIP, finalPort), 100); // 100ms 超时
                    //
                    System.out.println("✅ 端口 " + finalPort + " 是开放的");
                } catch (IOException ignored) {
                    // 忽略关闭端口
                }
            });
        }

        executor.shutdown();
        // 告诉线程池: 不再接受新任务,但要把已提交的任务全部执行完
        while (!executor.isTerminated()) {
            // 等待所有任务完成
        }

        System.out.println("\n✅ 扫描完成。");
    }
}
/**

思路

  1. @mind
  2. 对用户要探测的IP地址以及端口范围进行接收
  3. 创建线程池,对应相当数字的线程数
  4. 从起始到结束端口,将每个端口的扫描任务分配到线程中
  5. 设置任务具体内容为向目标IP以及对应端口发起连接请求,并设置超时时间
  6. 设置如果连接失败,那么忽略
  7. .关闭线程池 executor.shutdown()
  8. 通过while循环来达到当所有端口及任务完成之后再结束的效果

网站公告

今日签到

点亮在社区的每一天
去签到