前言

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

插件基础

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

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

代码实现

burpsuite插件的注册声明

1
2
3
4
5
6
7
8
9
10
11
12
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之类的存到数据库,所以进行了后缀的检测。

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

1
2
3
4
5
6
7
8
9
10
11
   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"
};

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

检测方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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地址将不会再次存储,每次入库前会进行查重,具体为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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数据库里。

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

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

封装后入库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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表结构如下,需要先创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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被选中则存储到数据库,否则将不会处理。方便手工测试一些东西时,所以加个是否开启的开关。

burp

控制台输出

burp

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

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

开源

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