敏感信息响应体请求去重 正则须优化

package burp;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
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("敏感信息匹配插件");

        // 获取标准输出流,指定字符编码为 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) {
        // 如果是请求,则获取请求体
        if (isRequest) {
            byte[] request = message.getRequest();
            String requestString = new String(request, StandardCharsets.UTF_8);  // 确保请求体的编码是 UTF-8

            // 匹配身份证号
            Pattern idCardPattern = Pattern.compile(ID_CARD_REGEX);
            Matcher idCardMatcher = idCardPattern.matcher(requestString);
            while (idCardMatcher.find()) {
                String idCard = idCardMatcher.group();
                if (isValidIdCard(idCard)) {
                    sensitiveData.add("请求中匹配到合法身份证号: " + idCard);
                } else {
                    sensitiveData.add("请求中匹配到不合法身份证号: " + idCard);
                }
            }

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

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

        } else {
            // 如果是响应,则获取响应体
            byte[] response = message.getResponse();
            String responseString = new String(response, StandardCharsets.UTF_8);  // 确保响应体的编码是 UTF-8

            // 调试信息:输出响应体长度,检查是否为空
            stdout.println("响应体长度: " + response.length);
            if (responseString.isEmpty()) {
                stdout.println("响应体为空,没有找到任何敏感信息。");
                return; // 如果响应体为空,不做进一步处理
            }

            // 匹配身份证号
            Pattern idCardPattern = Pattern.compile(ID_CARD_REGEX);
            Matcher idCardMatcher = idCardPattern.matcher(responseString);
            while (idCardMatcher.find()) {
                String idCard = idCardMatcher.group();
                if (isValidIdCard(idCard)) {
                    sensitiveData.add("响应中匹配到合法身份证号: " + idCard);
                } else {
                    sensitiveData.add("响应中匹配到不合法身份证号: " + idCard);
                }
            }

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

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

        // 输出去重后的敏感信息
        if (!sensitiveData.isEmpty()) {
            for (String data : sensitiveData) {
                stdout.println(data);
            }
            sensitiveData.clear();  // 清空敏感信息集合,避免重复输出
        }
    }
    /**
     * 校验身份证号是否合法
     * @param idCard 身份证号
     * @return 如果合法返回true,否则返回false
     */
    private boolean isValidIdCard(String idCard) {
        // 15位身份证号转换为18位
        if (idCard.length() == 15) {
            idCard = convertTo18(idCard);
        }

        // 校验出生日期是否合法
        if (!isValidDate(idCard.substring(6, 14))) {
            return false;
        }

        // 校验性别是否合法(第17位,奇数为男,偶数为女)
        if (!isValidGender(idCard.charAt(16))) {
            return false;
        }

        // 校验校验码是否合法
        return isValidCheckCode(idCard);
    }

    /**
     * 将15位身份证号转换为18位
     * @param idCard 15位身份证号
     * @return 转换后的18位身份证号
     */
    private String convertTo18(String idCard) {
        String idCard17 = idCard.substring(0, 6) + "19" + idCard.substring(6);
        return idCard17 + getCheckCode(idCard17);
    }

    /**
     * 校验身份证号出生日期是否合法
     * @param birthDate 出生日期(8位)
     * @return 是否合法
     */
    private boolean isValidDate(String birthDate) {
        try {
            int year = Integer.parseInt(birthDate.substring(0, 4));
            int month = Integer.parseInt(birthDate.substring(4, 6));
            int day = Integer.parseInt(birthDate.substring(6, 8));
            // 检查日期是否有效
            return (month >= 1 && month <= 12 && day >= 1 && day <= 31);  // 简单验证
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 校验身份证号性别是否合法
     * @param genderChar 身份证号中的第17位字符
     * @return 是否合法
     */
    private boolean isValidGender(char genderChar) {
        return (genderChar % 2 == 0); // 偶数为女性,奇数为男性
    }

    /**
     * 校验身份证号的校验码是否合法
     * @param idCard 身份证号
     * @return 是否合法
     */
    private boolean isValidCheckCode(String idCard) {
        String checkCode = getCheckCode(idCard);
        return checkCode.equals(String.valueOf(idCard.charAt(17)));
    }

    /**
     * 获取身份证号的校验码
     * @param idCard 身份证号
     * @return 校验码
     */
    private String getCheckCode(String idCard) {
        // 校验码算法,这里简单使用 X 作为校验码示例
        return "X";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值