文章目錄
- 敏感信息探測腳本
- 源代碼
- 思路
- 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循環來達到當所有端口及任務完成之后再結束的效果