【敏感信息查询】Findsensitive_v1.0.jar 完整版

package burp;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BurpExtender implements IBurpExtender, IHttpListener {
    private IBurpExtenderCallbacks callbacks;
    private PrintWriter stdout;

    // 身份证号的正则表达式 (15位或18位)
    private static final String ID_CARD_REGEX = "(\\d{17}[0-9Xx]|\\d{15})";
    // 手机号的正则表达式 (以 1 开头,后跟 3-9 的数字,11位)
    private static final String PHONE_REGEX = "(1[3-9]\\d{9})";
    // 邮箱地址的正则表达式
    private static final String EMAIL_REGEX = "([a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7})";

    // 存储去重后的敏感信息
    private HashSet<String> sensitiveData = new HashSet<>();

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        this.callbacks = callbacks;
        this.callbacks.setExtensionName("Findsensitive_v1.0");

        // 获取标准输出流,指定字符编码为 UTF-8
        OutputStream stdoutStream = callbacks.getStdout();
        this.stdout = new PrintWriter(new OutputStreamWriter(stdoutStream, StandardCharsets.UTF_8), true);

        // 注册 HTTP 请求监听器
        this.callbacks.registerHttpListener(this);

        // 输出插件加载完成信息
        stdout.println("插件已加载,开始匹配身份证号、手机号、邮箱等敏感信息。");
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean isRequest, IHttpRequestResponse message) {
        // 如果是请求或响应,则获取其体内容
        byte[] requestResponse = isRequest ? message.getRequest() : message.getResponse();
        String requestResponseString = new String(requestResponse, StandardCharsets.UTF_8);  // 确保请求/响应体的编码是 UTF-8

        // 匹配身份证号
        Pattern idCardPattern = Pattern.compile(ID_CARD_REGEX);
        Matcher idCardMatcher = idCardPattern.matcher(requestResponseString);
        while (idCardMatcher.find()) {
            String idCard = idCardMatcher.group();
            String idCardInfo = validateAndExtractInfo(idCard);
            sensitiveData.add((isRequest ? "请求" : "响应") + "中匹配到身份证号: " + idCardInfo);
        }

        // 匹配手机号
        Pattern phonePattern = Pattern.compile(PHONE_REGEX);
        Matcher phoneMatcher = phonePattern.matcher(requestResponseString);
        while (phoneMatcher.find()) {
            String phone = phoneMatcher.group();
            sensitiveData.add((isRequest ? "请求" : "响应") + "中匹配到手机号: " + phone);
        }

        // 匹配邮箱
        Pattern emailPattern = Pattern.compile(EMAIL_REGEX);
        Matcher emailMatcher = emailPattern.matcher(requestResponseString);
        while (emailMatcher.find()) {
            String email = emailMatcher.group();
            sensitiveData.add((isRequest ? "请求" : "响应") + "中匹配到邮箱: " + email);
        }

        // 输出去重后的敏感信息
        if (!sensitiveData.isEmpty()) {
            for (String data : sensitiveData) {
                stdout.println(data);
            }
            sensitiveData.clear();  // 清空敏感信息集合,避免重复输出
        }
    }

    private static final String ID_CARD_REGEX_two = "^(\\d{17}[0-9Xx]|\\d{15})$";
    // 加权因子,权重系数
    private static final int[] WEIGHT = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    // 校验码映射表
    private static final char[] CHECK_CODES = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

    /**
     * 校验身份证号是否合法,并返回身份证号码信息
     * @param idCard 身份证号
     * @return 如果合法返回身份证信息,否则返回错误信息
     */
    public static String validateAndExtractInfo(String idCard) {
        // 校验格式
        if (!idCard.matches(ID_CARD_REGEX_two)) {
            return "身份证号格式不正确";
        }

        // 如果是15位身份证号,则转换为18位
        if (idCard.length() == 15) {
            idCard = convertTo18(idCard);
        }

        // 校验出生日期是否合法
        String birthDate = idCard.substring(6, 14);
        if (!isValidDate(birthDate)) {
            return "身份证号中的出生日期无效";
        }

        // 校验性别是否合法(第17位,奇数为男,偶数为女)
        String gender = (idCard.charAt(16) % 2 == 0) ? "女" : "男";

        // 校验校验码是否合法
        if (!isValidCheckCode(idCard)) {
            return "身份证号中的校验码无效";
        }

        // 格式化出生日期并返回完整信息
        String formattedDate = formatDate(birthDate);
        return String.format("身份证号: %s, 出生日期: %s, 性别: %s", idCard, formattedDate, gender);
    }

    /**
     * 将15位身份证号转换为18位
     * @param idCard 15位身份证号
     * @return 18位身份证号
     */
    private static String convertTo18(String idCard) {
        StringBuilder sb = new StringBuilder(idCard);
        sb.insert(6, "19");  // 插入年份前缀“19”,形成18位
        String newIdCard = sb.toString();
        char[] c = newIdCard.toCharArray();
        int[] ai = new int[18];

        // 将字符串转换为数字数组
        for (int i = 0; i < 17; i++) {
            ai[i] = c[i] - '0';
        }

        // 计算加权和
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += ai[i] * WEIGHT[i];
        }

        // 校验码计算
        int mod = sum % 11;
        char checkCode = CHECK_CODES[mod];

        // 返回18位身份证号
        return newIdCard + checkCode;
    }

    /**
     * 校验日期是否合法
     * @param birthDate 出生日期 (YYYYMMDD)
     * @return 如果日期合法返回true,否则返回false
     */
    private static boolean isValidDate(String birthDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        sdf.setLenient(false);
        try {
            sdf.parse(birthDate);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

    /**
     * 校验性别是否合法
     * @param gender 性别标识 (第17位)
     * @return 如果性别合法返回true,否则返回false
     */
    private static boolean isValidGender(char gender) {
        return (gender - '0') % 2 == 1 || gender == 'X' || gender == 'x';
    }

    /**
     * 校验校验码是否有效
     * @param idCard 身份证号
     * @return 如果校验码合法返回true,否则返回false
     */
    private static boolean isValidCheckCode(String idCard) {
        char[] idCardChars = idCard.toCharArray();
        int sum = 0;

        // 计算前17位的加权和
        for (int i = 0; i < 17; i++) {
            sum += (idCardChars[i] - '0') * WEIGHT[i];
        }

        // 校验码映射
        int mod = sum % 11;
        char checkCode = CHECK_CODES[mod];

        // 校验第18位是否与计算的校验码匹配
        return checkCode == idCardChars[17];
    }

    /**
     * 格式化出生日期为 YYYY-MM-DD
     * @param birthDate 出生日期 (YYYYMMDD)
     * @return 格式化后的日期字符串
     */
    private static String formatDate(String birthDate) {
        return birthDate.substring(0, 4) + "-" + birthDate.substring(4, 6) + "-" + birthDate.substring(6, 8);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值