Burp Suite插件开发-HTTP请求入库
前言
早前写过一个基于代理的模式的自动化的安全扫描器。
当初是用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代理即可自动的存储到数据库中。
然后就可以根据具体的需要来进行检测漏洞了。
开源
4 条评论
可输入 255 字