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

文章目录

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

敏感信息探测脚本

源代码

java 复制代码
/**
 * @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批量存活探测器

源代码

java 复制代码
/**
 *  脚本功能: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. 将由响应码组成的结果存入相对应的文件中

端口扫描器

源代码

java 复制代码
/**
 * @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循环来达到当所有端口及任务完成之后再结束的效果
相关推荐
Pluchon7 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生8 小时前
java开发工具(学习第一天)
java·开发语言·学习
数据库小学妹8 小时前
数据库等保三级和四级有什么区别?从访问控制到备份恢复的完整对比
数据库·安全·数据库安全·三级等保·等保合规·四级等保
她说可以呀8 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
鹿鸣天涯9 小时前
CISP认证学习笔记
安全·cisp
Yan_chen66610 小时前
SQL-LABS_Less18-20实战攻略
数据库·sql·web安全·网络安全
松仔log10 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才10 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li10 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
sugar__salt11 小时前
Spring 三层架构与 IoC、依赖注入完全指南
java·spring boot·后端·spring·架构·maven·intellij-idea