mirror of
https://github.com/github/codeql.git
synced 2025-12-18 18:10:39 +01:00
149 lines
5.0 KiB
Java
149 lines
5.0 KiB
Java
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import javax.servlet.http.HttpServlet;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.ServletException;
|
|
|
|
import org.apache.commons.lang3.RegExUtils;
|
|
|
|
public class RegexInjection extends HttpServlet {
|
|
public boolean string1(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return input.matches("^" + pattern + "=.*$"); // BAD
|
|
}
|
|
|
|
public boolean string2(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return input.split(pattern).length > 0; // BAD
|
|
}
|
|
|
|
public boolean string3(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return input.replaceFirst(pattern, "").length() > 0; // BAD
|
|
}
|
|
|
|
public boolean string4(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return input.replaceAll(pattern, "").length() > 0; // BAD
|
|
}
|
|
|
|
public boolean pattern1(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
Pattern pt = Pattern.compile(pattern);
|
|
Matcher matcher = pt.matcher(input);
|
|
|
|
return matcher.find(); // BAD
|
|
}
|
|
|
|
public boolean pattern2(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return Pattern.compile(pattern).matcher(input).matches(); // BAD
|
|
}
|
|
|
|
public boolean pattern3(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return Pattern.matches(pattern, input); // BAD
|
|
}
|
|
|
|
public boolean pattern4(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return input.matches("^" + foo(pattern) + "=.*$"); // BAD
|
|
}
|
|
|
|
String foo(String str) {
|
|
return str;
|
|
}
|
|
|
|
public boolean pattern5(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
// GOOD: User input is sanitized before constructing the regex
|
|
return input.matches("^" + escapeSpecialRegexChars(pattern) + "=.*$");
|
|
}
|
|
|
|
public boolean pattern6(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
escapeSpecialRegexChars(pattern);
|
|
|
|
// BAD: the pattern is not really sanitized
|
|
return input.matches("^" + pattern + "=.*$");
|
|
}
|
|
|
|
Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[{}()\\[\\]><-=!.+*?^$\\\\|]");
|
|
|
|
String escapeSpecialRegexChars(String str) {
|
|
return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\\\$0");
|
|
}
|
|
|
|
public boolean apache1(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.removeAll(input, pattern).length() > 0; // BAD
|
|
}
|
|
|
|
public boolean apache2(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.removeFirst(input, pattern).length() > 0; // BAD
|
|
}
|
|
|
|
public boolean apache3(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.removePattern(input, pattern).length() > 0; // BAD
|
|
}
|
|
|
|
public boolean apache4(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.replaceAll(input, pattern, "").length() > 0; // BAD
|
|
}
|
|
|
|
public boolean apache5(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.replaceFirst(input, pattern, "").length() > 0; // BAD
|
|
}
|
|
|
|
public boolean apache6(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
Pattern pt = (Pattern)(Object) pattern;
|
|
return RegExUtils.replaceFirst(input, pt, "").length() > 0; // GOOD, Pattern compile is the sink instead
|
|
}
|
|
|
|
public boolean apache7(javax.servlet.http.HttpServletRequest request) {
|
|
String pattern = request.getParameter("pattern");
|
|
String input = request.getParameter("input");
|
|
|
|
return RegExUtils.replacePattern(input, pattern, "").length() > 0; // BAD
|
|
}
|
|
}
|