Burp Suite插件开发-HTTP请求入库
s33xy 安全工具 8958浏览 · 2017-08-21 21:25

前言

早前写过一个基于代理的模式的自动化的安全扫描器。
当初是用python来写的一个代理,但是可能我实际安全测试的时候用burpsuite比较多一点,所以写个burpsuite的插件来被动的存储http请求到数据库里。
这个也比较简单,所以大概跟同学们说下,代码会开源。

插件基础

基础环境的搭建可参考上篇文章,一些API的基础可参考官方文档。
还是同之前的插件一样,所有的burpsuite插件都必须实现IBurpExtender这个接口。由于我们需要被动的收集http的请求,所以还要实现IScannerCheck。

为了界面客观性,加了个UI面板,所以需要实现ITab接口。

代码实现

burpsuite插件的注册声明

public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        this.callbacks = callbacks;
        this.helpers = callbacks.getHelpers();
        stdout = new PrintWriter(callbacks.getStdout(),true);
        db = jdbcUtils.getInitJDBCUtil();

        bpGui(callbacks);
        callbacks.setExtensionName("NST Proxy");
        callbacks.registerScannerCheck(this);
        stdout.println("NST Proxy V1.1 load Success ");

}

这个方法每个插件都要实现,基本操作都是类似的。初始化一些变量并注册插件。

为了避免一些静态资源js和css之类的存到数据库,所以进行了后缀的检测。

同样的,避免一些不需要检测的请求入库,还进行了域名的黑名单过滤。预定义如下

    public static String[] blackExt = {
            ".ico",".woff",".flv",".js",".css",".jpg",
            ".png",".jpeg",".gif",".pdf",".txt",
            ".rar",".zip",".mp4",".svg","woff2",
            ".swf",".wmi",".exe",".mpeg",".htm"
    };
    public static String[] url_black_hosts = {".gov","qq.com","so.com","12306.cn",
            "itwzw.cn","google","gstatic","cnzz.com","doubleclick","bootcss.com",
            "360safe.com","mil.cn","gov.cn","gov.com","cnblogs.com","box3.cn","bdimg.com","360.cn",
            "baidu.com","csdn.com","github.com","127.0.0.1","localhost","googleadsserving.cn",".csdn.net"
 };

可以根据需求来进行具体的修改。

检测方法如下

public static boolean isblackext(String url) {
        for (String ext : blackExt) {
            //such as : a.js
            if(url.endsWith(ext)) {
                return true;
            }else {
                //such as : as.js?ver=20170101
                if(url.contains("?")){
                    String[] urls = url.split("?");
                    isblackext(urls[0]);
                }
            }

        }
        return false;
    }

    public static boolean isblackdomain(String url) {
        for (String string : url_black_hosts) {
            if(url.contains(string)) {
                return true;
            }
        }
        return false;
    }

重复的URL地址将不会再次存储,每次入库前会进行查重,具体为

public int queryrepeat(String url,String body,Connection conn) {
         String sql_exec = "SELECT COUNT(*) as count FROM httplog WHERE url=? AND body = ?";
         int flag = 0;
         try {
            PreparedStatement ps = conn.prepareStatement(sql_exec);
            ps.setString(1, url);
            ps.setString(2, body);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                flag = rs.getInt("count");
            }
            return flag;

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return 0;
     }

然后就是根据被动的请求,来拿到http请求,进行拆分组装后存到MySQL数据库里。

String url = this.helpers.analyzeRequest(baseRequestResponse).getUrl().toString();

helpers是burpsuite提供的一个帮助类的插件,可由他来获取到http请求的URL,method,body参数等信息。

封装后入库。

public int insert(Map<String,String> sql,Connection conn,PrintWriter stdout) {
         String sql_exec = "INSERT INTO httplog(url,method,header,body) VALUE(?,?,?,?)";
         try {
            PreparedStatement ps = conn.prepareStatement(sql_exec);
            ps.setString(1, sql.get("url"));
            ps.setString(2, sql.get("method"));
            ps.setString(3, sql.get("headers"));
            ps.setString(4, sql.get("body"));
            int i = ps.executeUpdate();
            stdout.println("[+] insert ["+i+"] row ");
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }

         return 0;
     }

httplog表结构如下,需要先创建表

USE `scan`;

/*Table structure for table `httplog` */

DROP TABLE IF EXISTS `httplog`;

CREATE TABLE `httplog` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) DEFAULT NULL,
  `method` varchar(50) DEFAULT NULL,
  `header` text,
  `body` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;

使用

直接导入插件后

修改响应的MySQL连接字符串,当Proxy被选中则存储到数据库,否则将不会处理。方便手工测试一些东西时,所以加个是否开启的开关。

控制台输出

然后浏览器开启burpsuite代理即可自动的存储到数据库中。


然后就可以根据具体的需要来进行检测漏洞了。

开源

项目地址
https://github.com/ibey0nd/NSTProxy

4 条评论
某人
表情
可输入 255
目录