网络安全(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循环来达到当所有端口及任务完成之后再结束的效果
相关推荐
小薛博客1 天前
26、Jenkins流水线
java·servlet·jenkins
CHEN5_021 天前
【CouponHub项目开发】EasyExcel解析Excel并使用线程池异步执行和延时队列兜底
java·数据库·excel
Metaphor6921 天前
Java 如何在 Excel 中添加超链接?使用 Spire.XLS for Java 轻松实现
java·经验分享·excel
David爱编程1 天前
锁升级机制全解析:偏向锁、轻量级锁、重量级锁的秘密
java·后端
技术小泽1 天前
深度解析Netty架构工作原理
java·后端·性能优化·架构·系统架构
网硕互联的小客服1 天前
如何配置安全的 SFTP 服务器?
运维·服务器·安全
神云瑟瑟1 天前
Spring Boot大文件分块上传(代码篇)
java·spring boot·大文件上传·分块上传
sam.li1 天前
WebView安全实现(二)
安全
码农101号1 天前
Linux 网络安全运维与文件权限控制和日志操作
运维·web安全·云计算
努力也学不会java1 天前
【设计模式】代理模式
java·设计模式·代理模式