Version: 2.0 Update
This commit is contained in:
33
src/main/java/burp/action/DoAction.java
Normal file
33
src/main/java/burp/action/DoAction.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package burp.action;
|
||||
|
||||
import java.util.Map;
|
||||
import burp.Config;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/*
|
||||
* @author EvilChen
|
||||
*/
|
||||
|
||||
public class DoAction {
|
||||
public String extractString(Map<String, Map<String, Object>> obj) {
|
||||
String[] result = {""};
|
||||
obj.keySet().forEach(i->{
|
||||
Map<String, Object> tmpMap = obj.get(i);
|
||||
String data = tmpMap.get("data").toString();
|
||||
String tmpStr = String.format(Config.outputTplString, i, data).intern();
|
||||
result[0] += tmpStr;
|
||||
});
|
||||
return result[0];
|
||||
}
|
||||
|
||||
public List<String> highlightList(Map<String, Map<String, Object>> obj) {
|
||||
List<String> colorList = new ArrayList<String>();
|
||||
obj.keySet().forEach(i->{
|
||||
Map<String, Object> tmpMap = obj.get(i);
|
||||
String color = tmpMap.get("color").toString();
|
||||
colorList.add(color);
|
||||
});
|
||||
return colorList;
|
||||
}
|
||||
}
|
||||
103
src/main/java/burp/action/ExtractContent.java
Normal file
103
src/main/java/burp/action/ExtractContent.java
Normal file
@@ -0,0 +1,103 @@
|
||||
package burp.action;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.*;
|
||||
|
||||
import dk.brics.automaton.Automaton;
|
||||
import dk.brics.automaton.AutomatonMatcher;
|
||||
import dk.brics.automaton.RegExp;
|
||||
import dk.brics.automaton.RunAutomaton;
|
||||
import jregex.Matcher;
|
||||
import jregex.Pattern;
|
||||
|
||||
import burp.yaml.LoadRule;
|
||||
import burp.yaml.LoadConfigFile;
|
||||
|
||||
/*
|
||||
* @author EvilChen
|
||||
*/
|
||||
|
||||
public class ExtractContent {
|
||||
private LoadConfigFile lcf = new LoadConfigFile();
|
||||
private LoadRule lr = new LoadRule(lcf.getConfigPath());
|
||||
|
||||
public Map<String, Map<String, Object>> matchRegex(byte[] content, String headers, byte[] body, String scopeString) {
|
||||
Map<String, Map<String, Object>> map = new HashMap<>(); // 最终返回的结果
|
||||
Map<String,Object[][]> rules = lr.getConfig();
|
||||
rules.keySet().forEach(i -> {
|
||||
String matchContent = "";
|
||||
for (Object[] objects : rules.get(i)) {
|
||||
// 遍历获取规则
|
||||
List<String> result = new ArrayList<String>();
|
||||
Map<String, Object> tmpMap = new HashMap<>();
|
||||
|
||||
String name = objects[1].toString();
|
||||
boolean loaded = (Boolean) objects[0];
|
||||
String regex = objects[2].toString();
|
||||
String color = objects[3].toString();
|
||||
String scope = objects[4].toString();
|
||||
String engine = objects[5].toString();
|
||||
// 判断规则是否开启与作用域
|
||||
if (loaded && (scopeString.contains(scope) || scope.equals("any"))) {
|
||||
switch (scope) {
|
||||
case "any":
|
||||
case "request":
|
||||
case "response":
|
||||
try {
|
||||
matchContent = new String(content, "UTF-8").intern();
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
case "request header":
|
||||
case "response header":
|
||||
matchContent = headers;
|
||||
break;
|
||||
case "request body":
|
||||
case "response body":
|
||||
try {
|
||||
matchContent = new String(body, "UTF-8").intern();
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (engine.equals("nfa")) {
|
||||
Pattern pattern = new Pattern(regex);
|
||||
Matcher matcher = pattern.matcher(matchContent);
|
||||
while (matcher.find()) {
|
||||
// 添加匹配数据至list
|
||||
// 强制用户使用()包裹正则
|
||||
result.add(matcher.group(1));
|
||||
}
|
||||
} else {
|
||||
RegExp regexpr = new RegExp(regex);
|
||||
Automaton auto = regexpr.toAutomaton();
|
||||
RunAutomaton runAuto = new RunAutomaton(auto, true);
|
||||
AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent);
|
||||
while (autoMatcher.find()) {
|
||||
// 添加匹配数据至list
|
||||
// 强制用户使用()包裹正则
|
||||
result.add(autoMatcher.group());
|
||||
}
|
||||
}
|
||||
|
||||
// 去除重复内容
|
||||
HashSet tmpList = new HashSet(result);
|
||||
result.clear();
|
||||
result.addAll(tmpList);
|
||||
|
||||
if (!result.isEmpty()) {
|
||||
tmpMap.put("color", color);
|
||||
tmpMap.put("data", String.join("\n", result));
|
||||
// 初始化格式
|
||||
map.put(name, tmpMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
27
src/main/java/burp/action/GetColorKey.java
Normal file
27
src/main/java/burp/action/GetColorKey.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package burp.action;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/*
|
||||
* @author EvilChen
|
||||
*/
|
||||
|
||||
public class GetColorKey {
|
||||
/*
|
||||
* 颜色下标获取
|
||||
*/
|
||||
public List<Integer> getColorKeys(List<String> keys, String[] colorArray){
|
||||
List<Integer> result = new ArrayList<Integer>();
|
||||
int size = colorArray.length;
|
||||
// 根据颜色获取下标
|
||||
for (int x = 0; x < keys.size(); x++) {
|
||||
for (int v = 0; v < size; v++) {
|
||||
if (colorArray[v].equals(keys.get(x))) {
|
||||
result.add(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
24
src/main/java/burp/action/MatchHTTP.java
Normal file
24
src/main/java/burp/action/MatchHTTP.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package burp.action;
|
||||
|
||||
import jregex.Matcher;
|
||||
import jregex.Pattern;
|
||||
import jregex.REFlags;
|
||||
import burp.yaml.LoadConfigFile;
|
||||
|
||||
/*
|
||||
* @author EvilChen
|
||||
*/
|
||||
|
||||
public class MatchHTTP {
|
||||
// 匹配后缀
|
||||
LoadConfigFile lc = new LoadConfigFile();
|
||||
public boolean matchSuffix(String str) {
|
||||
Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", lc.getExcludeSuffix()), REFlags.IGNORE_CASE);
|
||||
Matcher matcher = pattern.matcher(str);
|
||||
if(matcher.find()){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
56
src/main/java/burp/action/UpgradeColor.java
Normal file
56
src/main/java/burp/action/UpgradeColor.java
Normal file
@@ -0,0 +1,56 @@
|
||||
package burp.action;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
/*
|
||||
* @author EvilChen
|
||||
*/
|
||||
|
||||
public class UpgradeColor {
|
||||
private String endColor = "";
|
||||
/*
|
||||
* 颜色升级递归算法
|
||||
*/
|
||||
private String colorUpgrade(List<Integer> colorList, String[] colorArray) {
|
||||
int colorSize = colorList.size();
|
||||
colorList.sort(Comparator.comparingInt(Integer::intValue));
|
||||
int i = 0;
|
||||
List<Integer> stack = new ArrayList<Integer>();
|
||||
while (i < colorSize) {
|
||||
if (stack.isEmpty()) {
|
||||
stack.add(colorList.get(i));
|
||||
i++;
|
||||
} else {
|
||||
if (colorList.get(i) != stack.stream().reduce((first, second) -> second).orElse(99999999)) {
|
||||
stack.add(colorList.get(i));
|
||||
i++;
|
||||
} else {
|
||||
stack.set(stack.size() - 1, stack.get(stack.size() - 1) - 1);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// 利用HashSet删除重复元素
|
||||
HashSet tmpList = new HashSet(stack);
|
||||
if (stack.size() == tmpList.size()) {
|
||||
stack.sort(Comparator.comparingInt(Integer::intValue));
|
||||
if(stack.get(0).equals(-1)) {
|
||||
this.endColor = colorArray[0];
|
||||
} else {
|
||||
this.endColor = colorArray[stack.get(0)];
|
||||
}
|
||||
} else {
|
||||
this.colorUpgrade(stack, colorArray);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public String getEndColor(List<Integer> colorList, String[] colorArray) {
|
||||
colorUpgrade(colorList, colorArray);
|
||||
return endColor;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user