文章目錄
- 目錄遍歷漏洞掃描器
- 源代碼
- 思路
- 一、核心功能
- 二、依賴庫
- 三、核心流程
- 四、關鍵方法
- 五、數據結構
- 六、輸出信息
目錄遍歷漏洞掃描器
源代碼
/*** @description : 目錄遍歷漏洞掃描器* 注意; 在輸入URL時 要求必須保存 ?page= 的末尾 才能保證路徑合成的有效性*//*** @description : 目錄遍歷漏洞掃描器* 注意; 在輸入URL時 要求必須保存 ?page= 的末尾 才能保證路徑合成的有效性*/import java.io.*;
import java.net.*;
import java.util.*;
//導入IO,網絡,集合相關的標準庫
public class DirectoryTraversalScanner {public static void main(String[] args) throws Exception {List<String> targets = new ArrayList<>();//存放要掃描的目標基礎URL 創建了一個名為targets的空列表,用于存儲字符串類型的數據//使用ArrayList可以根據實際輸入的URL數量動態增長,允許用戶連續輸入多個URL地址,直到輸入空行結束BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//System.in 鍵盤輸入 InputStreamReader : 把鍵盤的輸入轉換為字符 BufferedReader 給這些字符加一個緩沖區,可以一行一行的讀取System.out.println("請輸入要掃描的URL(輸入空行結束):");while (true) {String line = reader.readLine();if (line == null || line.trim().isEmpty()) {break; // 輸入空行則結束輸入}targets.add(line.trim());}//通過while(true)創建一個循環,每次讀取一行,如果讀到null,或者空行則跳出循環,否則將首尾去空的添加到targets集合中if (targets.isEmpty()) {System.out.println("沒有輸入任何URL,程序退出。");return;}List<String> payloads = readLinesFromFile("payloads.txt");//readLinesFromFile()方法功能是從指定文件中讀取所有行內容并返回一個字符串列表Map<String, List<String>> signatures = loadSignatures("signatures.txt");//從該文件中加載漏洞特征簽名,該方法返回一個Map結構,其中鍵是簽名類型,值是該類型下包含的特征字符串列表,這些簽名用于后續檢測HTTP響應中是否包含特定的漏洞特征for (String base : targets) {System.out.println("🔍 掃描目標: " + base);for (String payload : payloads) {String fullUrl = base + URLEncoder.encode(payload, "UTF-8");// 將目標URL與payload進行拼接,并且將payload進行編碼try {String response = sendRequest(fullUrl);boolean found = false;for (Map.Entry<String, List<String>> entry : signatures.entrySet()) {for (String keyword : entry.getValue()) {if (response.contains(keyword)) {System.out.println("🚨 漏洞發現!URL: " + fullUrl);System.out.println("👉 關鍵字: " + keyword);found = true;break;//這個break語句跳出的是內層循環,當找到一個匹配的關鍵字時,就不再檢查當前簽名類型下的其他關鍵字了}}if (found) break;//這個break跳出的是外層循環,當找到匹配結果時,就不再匹配新的簽名類型了}if (!found) {System.out.println("? 安全: " + fullUrl);}} catch (Exception e) {System.out.println("? 請求失敗: " + fullUrl + " → " + e.getMessage());}System.out.println("-----------------------------");}}System.out.println("? 掃描完成。");}public static List<String> readLinesFromFile(String filename) throws IOException {List<String> lines = new ArrayList<>();BufferedReader br = new BufferedReader(new FileReader(filename));String line;while ((line = br.readLine()) != null) {if (!line.trim().isEmpty()) {lines.add(line.trim());}}br.close();return lines;}/*** 從指定文件加載簽名信息到Map中* @param filename 包含簽名信息的文件名* @return 包含簽名信息的Map,鍵為簽名類型,值為該類型下的特征字符串列表* @throws IOException 當文件讀取出現問題時拋出*/public static Map<String, List<String>> loadSignatures(String filename) throws IOException {// 創建一個空的HashMap用于存儲簽名信息,鍵為字符串,值為字符串列表Map<String, List<String>> sigMap = new HashMap<>();// 創建文件讀取器和緩沖讀取器,用于逐行讀取文件內容BufferedReader br = new BufferedReader(new FileReader(filename));String line;// 逐行讀取文件內容,直到文件末尾while ((line = br.readLine()) != null) {// 如果當前行包含冒號,則認為是有效的簽名行if (line.contains(":")) {// 按冒號分割行內容為兩部分:冒號前為鍵,冒號后為值String[] parts = line.split(":");// 冒號前的部分作為Map的鍵String key = parts[0];// 冒號后的內容再按逗號分割成多個值,形成字符串列表List<String> values = Arrays.asList(parts[1].split(","));// 將鍵值對存入Map中sigMap.put(key, values);}}// 關閉文件讀取器,釋放資源br.close();// 返回包含所有簽名信息的Mapreturn sigMap;}public static String sendRequest(String targetUrl) throws Exception {URL url = new URL(targetUrl);// 創建URL類型的對象HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 向URL建立連接conn.setConnectTimeout(3000);conn.setReadTimeout(3000);conn.setRequestMethod("GET");// 設置請求頭int status = conn.getResponseCode();if (status != 200) throw new IOException("狀態碼: " + status);BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));// 獲取響應體,通過InputStreamReader以字符形式讀取,然后通過BufferedReader來提供高效的讀取方式StringBuilder response = new StringBuilder();// StringBuilder是一個可變的字符序列,允許高效地拼接和修改字符串內容String inputLine;while ((inputLine = in.readLine()) != null)response.append(inputLine).append("\n");in.close();return response.toString();}
}
思路
一、核心功能
- 實現目錄遍歷漏洞掃描
- 支持多URL目標輸入
- 基于payload和特征簽名檢測漏洞
二、依賴庫
- java.io.*:文件IO操作
- java.net.*:網絡請求處理
- java.util.*:集合框架(列表、映射等)
三、核心流程
-
目標輸入
- 通過BufferedReader讀取鍵盤輸入
- 存儲URL到targets列表(空行結束輸入)
- 輸入為空時程序退出
-
資源加載
- 從payloads.txt讀取攻擊載荷(readLinesFromFile方法)
- 從signatures.txt加載漏洞特征(loadSignatures方法)
-
掃描邏輯
- 遍歷所有目標URL
- 拼接URL與編碼后的payload
- 發送HTTP請求(sendRequest方法)
- 檢測響應中是否包含漏洞特征
- 輸出掃描結果(漏洞/安全/請求失敗)
四、關鍵方法
-
readLinesFromFile(String filename)
- 功能:讀取文件內容到字符串列表
- 邏輯:按行讀取,過濾空行,返回非空行列表
-
loadSignatures(String filename)
- 功能:加載漏洞特征到Map
- 格式:文件行需包含冒號(鍵:值1,值2…)
- 結構:Map<簽名類型, 特征字符串列表>
-
sendRequest(String targetUrl)
- 功能:發送HTTP GET請求并返回響應內容
- 設置:3秒連接超時+3秒讀取超時
- 處理:僅接收200狀態碼的響應,拼接響應內容為字符串
五、數據結構
- List targets:存儲目標URL
- List payloads:存儲攻擊載荷
- Map<String, List> signatures:存儲漏洞特征(鍵-特征類型,值-關鍵詞列表)
六、輸出信息
- 掃描目標提示(🔍 掃描目標: [URL])
- 漏洞發現提示(🚨 漏洞發現!URL: [完整URL] + 關鍵字)
- 安全提示(? 安全: [完整URL])
- 請求失敗提示(? 請求失敗: [完整URL] + 錯誤信息)
- 掃描完成提示(? 掃描完成。)