文章目录
- 敏感信息探测脚本
-
- 源代码
- 思路
- 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;
}
}
}
思路
- 首先分别定义好要存放扫描的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试图连接目标主机的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✅ 扫描完成。");
}
}
/**
思路
- @mind
- 对用户要探测的IP地址以及端口范围进行接收
- 创建线程池,对应相当数字的线程数
- 从起始到结束端口,将每个端口的扫描任务分配到线程中
- 设置任务具体内容为向目标IP以及对应端口发起连接请求,并设置超时时间
- 设置如果连接失败,那么忽略
- .关闭线程池 executor.shutdown()
- 通过while循环来达到当所有端口及任务完成之后再结束的效果