文章目录
- 敏感信息探测脚本
- 源代码
- 思路
- 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找valueif (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.txtString 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请求方法为GETreturn conn.getResponseCode();} catch (IOException e) {return -1;}}
}
思路
- 首先分别定义好要存放扫描的URL和存放扫描结果的文件
- 创建文件读取和文件写入对象
- 对存放的URL进行读取进行首尾去空,非空等判断
- 对进行处理后的URL进行请求连接
- 连接思路和上方敏感信息泄露探测脚本思路一样
- 将由响应码组成的结果存入相对应的文件中
端口扫描器
源代码
/*** @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试图连接目标主机的finalPortsocket.connect(new InetSocketAddress(targetIP, finalPort), 100); // 100ms 超时//System.out.println("✅ 端口 " + finalPort + " 是开放的");} catch (IOException ignored) {// 忽略关闭端口}});}executor.shutdown();// 告诉线程池: 不再接受新任务,但要把已提交的任务全部执行完while (!executor.isTerminated()) {// 等待所有任务完成}System.out.println("\n✅ 扫描完成。");}
}
/**
思路
- @mind
- 对用户要探测的IP地址以及端口范围进行接收
- 创建线程池,对应相当数字的线程数
- 从起始到结束端口,将每个端口的扫描任务分配到线程中
- 设置任务具体内容为向目标IP以及对应端口发起连接请求,并设置超时时间
- 设置如果连接失败,那么忽略
- .关闭线程池 executor.shutdown()
- 通过while循环来达到当所有端口及任务完成之后再结束的效果