| 1 | package com.jsql.model.suspendable; | |
| 2 | ||
| 3 | import com.jsql.model.InjectionModel; | |
| 4 | import com.jsql.util.CookiesUtil; | |
| 5 | import com.jsql.util.JsonUtil; | |
| 6 | import com.jsql.view.subscriber.Seal; | |
| 7 | import com.jsql.model.exception.JSqlException; | |
| 8 | import com.jsql.model.exception.StoppedByUserSlidingException; | |
| 9 | import com.jsql.model.injection.strategy.blind.InjectionCharInsertion; | |
| 10 | import com.jsql.model.injection.engine.MediatorEngine; | |
| 11 | import com.jsql.model.injection.engine.model.Engine; | |
| 12 | import com.jsql.model.suspendable.callable.CallablePageSource; | |
| 13 | import com.jsql.util.I18nUtil; | |
| 14 | import com.jsql.util.LogLevelUtil; | |
| 15 | import org.apache.commons.lang3.RandomStringUtils; | |
| 16 | import org.apache.commons.lang3.StringUtils; | |
| 17 | import org.apache.logging.log4j.LogManager; | |
| 18 | import org.apache.logging.log4j.Logger; | |
| 19 | ||
| 20 | import java.util.*; | |
| 21 | import java.util.concurrent.CompletionService; | |
| 22 | import java.util.concurrent.ExecutionException; | |
| 23 | import java.util.concurrent.ExecutorCompletionService; | |
| 24 | import java.util.concurrent.ExecutorService; | |
| 25 | import java.util.regex.Pattern; | |
| 26 | import java.util.stream.Stream; | |
| 27 | ||
| 28 | /** | |
| 29 | * Runnable class, define insertionCharacter to be used during injection, | |
| 30 | * i.e -1 in "...php?id=-1 union select...", sometimes it's -1, 0', 0, etc. | |
| 31 | * Find working insertion char when error message occurs in source. | |
| 32 | * Force to 1 if no insertion char works and empty value from user, | |
| 33 | * Force to user's value if no insertion char works, | |
| 34 | * Force to insertion char otherwise. | |
| 35 | */ | |
| 36 | public class SuspendableGetCharInsertion extends AbstractSuspendable { | |
| 37 | | |
| 38 | private static final Logger LOGGER = LogManager.getRootLogger(); | |
| 39 | private final String parameterOriginalValue; | |
| 40 | ||
| 41 | public SuspendableGetCharInsertion(InjectionModel injectionModel, String parameterOriginalValue) { | |
| 42 | super(injectionModel); | |
| 43 | this.parameterOriginalValue = parameterOriginalValue; | |
| 44 | } | |
| 45 | ||
| 46 | @Override | |
| 47 | public String run(Input input) throws JSqlException { | |
| 48 | String characterInsertionByUser = input.payload(); | |
| 49 | | |
| 50 | ExecutorService taskExecutor = this.injectionModel.getMediatorUtils().threadUtil().getExecutor("CallableGetInsertionCharacter"); | |
| 51 | CompletionService<CallablePageSource> taskCompletionService = new ExecutorCompletionService<>(taskExecutor); | |
| 52 | ||
| 53 | var characterInsertionFoundOrByUser = new String[1]; | |
| 54 | characterInsertionFoundOrByUser[0] = characterInsertionByUser; // either raw char or cookie char, with star | |
| 55 | List<String> charactersInsertion = this.initCallables(taskCompletionService, characterInsertionFoundOrByUser); | |
| 56 | | |
| 57 | var mediatorEngine = this.injectionModel.getMediatorEngine(); | |
| 58 | LOGGER.log(LogLevelUtil.CONSOLE_DEFAULT, "[Step 3] Fingerprinting database and prefix using ORDER BY..."); | |
| 59 | ||
| 60 | String charFromOrderBy = null; | |
| 61 | | |
| 62 | int total = charactersInsertion.size(); | |
| 63 |
2
1. run : changed conditional boundary → NO_COVERAGE 2. run : negated conditional → NO_COVERAGE |
while (0 < total) { |
| 64 |
1
1. run : negated conditional → NO_COVERAGE |
if (this.isSuspended()) { |
| 65 | throw new StoppedByUserSlidingException(); | |
| 66 | } | |
| 67 | try { | |
| 68 | CallablePageSource currentCallable = taskCompletionService.take().get(); | |
| 69 |
1
1. run : Changed increment from -1 to 1 → NO_COVERAGE |
total--; |
| 70 | String pageSource = currentCallable.getContent(); | |
| 71 | | |
| 72 | List<Engine> enginesOrderByMatches = this.getEnginesOrderByMatch(mediatorEngine, pageSource); | |
| 73 |
1
1. run : negated conditional → NO_COVERAGE |
if (!enginesOrderByMatches.isEmpty()) { |
| 74 |
1
1. run : negated conditional → NO_COVERAGE |
if (this.injectionModel.getMediatorEngine().getEngineByUser() == this.injectionModel.getMediatorEngine().getAuto()) { |
| 75 |
1
1. run : removed call to com/jsql/model/suspendable/SuspendableGetCharInsertion::setEngine → NO_COVERAGE |
this.setEngine(mediatorEngine, enginesOrderByMatches); |
| 76 |
1
1. run : removed call to com/jsql/model/InjectionModel::sendToViews → NO_COVERAGE |
this.injectionModel.sendToViews(new Seal.ActivateEngine(mediatorEngine.getEngine())); |
| 77 | } | |
| 78 | | |
| 79 | charFromOrderBy = currentCallable.getCharacterInsertion(); | |
| 80 | String finalCharFromOrderBy = charFromOrderBy; | |
| 81 | LOGGER.log( | |
| 82 | LogLevelUtil.CONSOLE_SUCCESS, | |
| 83 | "Found prefix [{}] using ORDER BY and compatible with Error strategy", | |
| 84 |
1
1. lambda$run$0 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$run$0 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(finalCharFromOrderBy) |
| 85 | ); | |
| 86 | break; | |
| 87 | } | |
| 88 | } catch (InterruptedException e) { | |
| 89 | LOGGER.log(LogLevelUtil.IGNORE, e, e); | |
| 90 |
1
1. run : removed call to java/lang/Thread::interrupt → NO_COVERAGE |
Thread.currentThread().interrupt(); |
| 91 | } catch (ExecutionException e) { | |
| 92 | LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e); | |
| 93 | } | |
| 94 | } | |
| 95 |
1
1. run : removed call to com/jsql/util/ThreadUtil::shutdown → NO_COVERAGE |
this.injectionModel.getMediatorUtils().threadUtil().shutdown(taskExecutor); |
| 96 |
2
1. run : negated conditional → NO_COVERAGE 2. run : negated conditional → NO_COVERAGE |
if (charFromOrderBy == null && characterInsertionFoundOrByUser[0] != null) { |
| 97 | charFromOrderBy = characterInsertionFoundOrByUser[0]; | |
| 98 | } | |
| 99 |
1
1. run : replaced return value with "" for com/jsql/model/suspendable/SuspendableGetCharInsertion::run → NO_COVERAGE |
return this.getCharacterInsertion(characterInsertionByUser, charFromOrderBy); |
| 100 | } | |
| 101 | ||
| 102 | private void setEngine(MediatorEngine mediatorEngine, List<Engine> enginesOrderByMatches) { | |
| 103 | if ( | |
| 104 |
1
1. setEngine : negated conditional → NO_COVERAGE |
enginesOrderByMatches.size() == 1 |
| 105 |
1
1. setEngine : negated conditional → NO_COVERAGE |
&& enginesOrderByMatches.getFirst() != mediatorEngine.getEngine() |
| 106 | ) { | |
| 107 |
1
1. setEngine : removed call to com/jsql/model/injection/engine/MediatorEngine::setEngine → NO_COVERAGE |
mediatorEngine.setEngine(enginesOrderByMatches.getFirst()); |
| 108 |
2
1. setEngine : changed conditional boundary → NO_COVERAGE 2. setEngine : negated conditional → NO_COVERAGE |
} else if (enginesOrderByMatches.size() > 1) { |
| 109 |
1
1. setEngine : negated conditional → NO_COVERAGE |
if (enginesOrderByMatches.contains(mediatorEngine.getPostgres())) { |
| 110 |
1
1. setEngine : removed call to com/jsql/model/injection/engine/MediatorEngine::setEngine → NO_COVERAGE |
mediatorEngine.setEngine(mediatorEngine.getPostgres()); |
| 111 |
1
1. setEngine : negated conditional → NO_COVERAGE |
} else if (enginesOrderByMatches.contains(mediatorEngine.getMysql())) { |
| 112 |
1
1. setEngine : removed call to com/jsql/model/injection/engine/MediatorEngine::setEngine → NO_COVERAGE |
mediatorEngine.setEngine(mediatorEngine.getMysql()); |
| 113 | } else { | |
| 114 |
1
1. setEngine : removed call to com/jsql/model/injection/engine/MediatorEngine::setEngine → NO_COVERAGE |
mediatorEngine.setEngine(enginesOrderByMatches.getFirst()); |
| 115 | } | |
| 116 | } | |
| 117 | } | |
| 118 | ||
| 119 | private List<Engine> getEnginesOrderByMatch(MediatorEngine mediatorEngine, String pageSource) { | |
| 120 |
1
1. getEnginesOrderByMatch : replaced return value with Collections.emptyList for com/jsql/model/suspendable/SuspendableGetCharInsertion::getEnginesOrderByMatch → NO_COVERAGE |
return mediatorEngine.getEnginesForFingerprint() |
| 121 | .stream() | |
| 122 |
2
1. lambda$getEnginesOrderByMatch$1 : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$1 → NO_COVERAGE 2. lambda$getEnginesOrderByMatch$1 : negated conditional → NO_COVERAGE |
.filter(engine -> engine != mediatorEngine.getAuto()) |
| 123 |
2
1. lambda$getEnginesOrderByMatch$2 : replaced boolean return with false for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$2 → NO_COVERAGE 2. lambda$getEnginesOrderByMatch$2 : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$2 → NO_COVERAGE |
.filter(engine -> StringUtils.isNotEmpty( |
| 124 | engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getOrderByErrorMessage() | |
| 125 | )) | |
| 126 | .filter(engine -> { | |
| 127 | Optional<String> optionalOrderByErrorMatch = Stream.of( | |
| 128 | engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getOrderByErrorMessage() | |
| 129 | .split("[\\r\\n]+") | |
| 130 | ) | |
| 131 | .filter(errorMessage -> | |
| 132 |
2
1. lambda$getEnginesOrderByMatch$3 : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$3 → NO_COVERAGE 2. lambda$getEnginesOrderByMatch$3 : replaced boolean return with false for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$3 → NO_COVERAGE |
Pattern |
| 133 | .compile(".*" + errorMessage + ".*", Pattern.DOTALL) | |
| 134 | .matcher(pageSource) | |
| 135 | .matches() | |
| 136 | ) | |
| 137 | .findAny(); | |
| 138 |
1
1. lambda$getEnginesOrderByMatch$4 : negated conditional → NO_COVERAGE |
if (optionalOrderByErrorMatch.isPresent()) { |
| 139 | LOGGER.log( | |
| 140 | LogLevelUtil.CONSOLE_SUCCESS, | |
| 141 | "Found [{}] using ORDER BY", | |
| 142 | engine | |
| 143 | ); | |
| 144 | } | |
| 145 |
2
1. lambda$getEnginesOrderByMatch$4 : replaced boolean return with false for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$4 → NO_COVERAGE 2. lambda$getEnginesOrderByMatch$4 : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getEnginesOrderByMatch$4 → NO_COVERAGE |
return optionalOrderByErrorMatch.isPresent(); |
| 146 | }) | |
| 147 | .toList(); | |
| 148 | } | |
| 149 | ||
| 150 | private List<String> initCallables(CompletionService<CallablePageSource> taskCompletionService, String[] characterInsertionFoundOrByUser) throws JSqlException { | |
| 151 | List<String> prefixValues = Arrays.asList( | |
| 152 | RandomStringUtils.secure().next(10, "012"), // trigger probable failure | |
| 153 | StringUtils.EMPTY, // trigger matching, compatible with backtick | |
| 154 | "1" // trigger eventual success | |
| 155 | ); | |
| 156 | List<String> prefixQuotes = Arrays.asList( | |
| 157 | "'", | |
| 158 | StringUtils.EMPTY, | |
| 159 | "`", | |
| 160 | "\"", | |
| 161 | "%bf'" // GBK slash encoding use case | |
| 162 | ); | |
| 163 | List<String> prefixParentheses = Arrays.asList( | |
| 164 | StringUtils.EMPTY, | |
| 165 | ")", | |
| 166 | "))" | |
| 167 | ); | |
| 168 | List<String> charactersInsertion = new ArrayList<>(); | |
| 169 | LOGGER.log(LogLevelUtil.CONSOLE_DEFAULT, "[Step 2] Fingerprinting prefix using boolean match..."); | |
| 170 | boolean isFound = false; | |
| 171 | for (String prefixValue: prefixValues) { | |
| 172 | for (String prefixQuote: prefixQuotes) { | |
| 173 | for (String prefixParenthesis: prefixParentheses) { | |
| 174 |
1
1. initCallables : negated conditional → NO_COVERAGE |
if (!isFound) { // stop checking when found |
| 175 | var prefixValueAndQuote = prefixValue + prefixQuote; | |
| 176 |
2
1. initCallables : negated conditional → NO_COVERAGE 2. initCallables : negated conditional → NO_COVERAGE |
var isRequiringSpace = prefixValueAndQuote.matches(".*\\w$") && prefixParenthesis.isEmpty(); |
| 177 | isFound = this.checkInsertionChar( | |
| 178 | characterInsertionFoundOrByUser, | |
| 179 | charactersInsertion, | |
| 180 | prefixValueAndQuote + prefixParenthesis | |
| 181 |
1
1. initCallables : negated conditional → NO_COVERAGE |
+ (isRequiringSpace ? "%20" : StringUtils.EMPTY) // %20 required, + or space not working in path |
| 182 | ); | |
| 183 | } | |
| 184 | } | |
| 185 | } | |
| 186 | } | |
| 187 | for (String characterInsertion: charactersInsertion) { | |
| 188 | taskCompletionService.submit( | |
| 189 | new CallablePageSource( | |
| 190 | characterInsertion.replace( | |
| 191 | InjectionModel.STAR, | |
| 192 | StringUtils.SPACE // covered by cleaning | |
| 193 | + this.injectionModel.getMediatorEngine().getEngine().instance().sqlOrderBy() | |
| 194 | ), | |
| 195 | characterInsertion, | |
| 196 | this.injectionModel, | |
| 197 | "prefix#orderby" | |
| 198 | ) | |
| 199 | ); | |
| 200 | } | |
| 201 |
1
1. initCallables : replaced return value with Collections.emptyList for com/jsql/model/suspendable/SuspendableGetCharInsertion::initCallables → NO_COVERAGE |
return charactersInsertion; |
| 202 | } | |
| 203 | ||
| 204 | private boolean checkInsertionChar( | |
| 205 | String[] characterInsertionFoundOrByUser, | |
| 206 | List<String> charactersInsertion, | |
| 207 | String prefixParenthesis | |
| 208 | ) throws StoppedByUserSlidingException { // requires prefix by user for cookie, else empty and failing | |
| 209 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
var isCookie = this.injectionModel.getMediatorMethod().getHeader() == this.injectionModel.getMediatorUtils().connectionUtil().getMethodInjection() |
| 210 | && this.injectionModel.getMediatorUtils().parameterUtil().getListHeader() | |
| 211 | .stream() | |
| 212 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
.anyMatch(entry -> |
| 213 |
2
1. lambda$checkInsertionChar$5 : negated conditional → NO_COVERAGE 2. lambda$checkInsertionChar$5 : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$checkInsertionChar$5 → NO_COVERAGE |
CookiesUtil.COOKIE.equalsIgnoreCase(entry.getKey()) |
| 214 |
1
1. lambda$checkInsertionChar$5 : negated conditional → NO_COVERAGE |
&& entry.getValue().contains(InjectionModel.STAR) |
| 215 | ); | |
| 216 | ||
| 217 | var isJson = false; | |
| 218 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (StringUtils.isNotBlank(this.parameterOriginalValue)) { // can be null when path param |
| 219 | Object jsonEntity = JsonUtil.getJson(this.parameterOriginalValue); | |
| 220 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
isJson = !JsonUtil.createEntries(jsonEntity, "root", null).isEmpty(); |
| 221 | } | |
| 222 | ||
| 223 |
2
1. checkInsertionChar : negated conditional → NO_COVERAGE 2. checkInsertionChar : negated conditional → NO_COVERAGE |
var isRawParamRequired = isJson || isCookie; |
| 224 | ||
| 225 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (isRawParamRequired) { |
| 226 | charactersInsertion.add(characterInsertionFoundOrByUser[0].replace( | |
| 227 | InjectionModel.STAR, | |
| 228 | prefixParenthesis | |
| 229 | + InjectionModel.STAR | |
| 230 | + this.injectionModel.getMediatorEngine().getEngine().instance().endingComment() | |
| 231 | )); | |
| 232 | } else { | |
| 233 | charactersInsertion.add( | |
| 234 | prefixParenthesis | |
| 235 | + InjectionModel.STAR | |
| 236 | + this.injectionModel.getMediatorEngine().getEngine().instance().endingComment() | |
| 237 | ); | |
| 238 | } | |
| 239 | ||
| 240 | InjectionCharInsertion injectionCharInsertion; | |
| 241 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (isRawParamRequired) { |
| 242 | injectionCharInsertion = new InjectionCharInsertion( | |
| 243 | this.injectionModel, | |
| 244 | characterInsertionFoundOrByUser[0].replace(InjectionModel.STAR, prefixParenthesis), | |
| 245 | characterInsertionFoundOrByUser[0].replace(InjectionModel.STAR, prefixParenthesis + InjectionModel.STAR) | |
| 246 | ); | |
| 247 | } else { | |
| 248 | injectionCharInsertion = new InjectionCharInsertion( | |
| 249 | this.injectionModel, | |
| 250 | prefixParenthesis, | |
| 251 | prefixParenthesis + InjectionModel.STAR | |
| 252 | + this.injectionModel.getMediatorEngine().getEngine().instance().endingComment() | |
| 253 | ); | |
| 254 | } | |
| 255 | ||
| 256 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (this.isSuspended()) { |
| 257 | throw new StoppedByUserSlidingException(); | |
| 258 | } | |
| 259 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (injectionCharInsertion.isInjectable()) { |
| 260 |
1
1. checkInsertionChar : negated conditional → NO_COVERAGE |
if (isRawParamRequired) { |
| 261 | characterInsertionFoundOrByUser[0] = characterInsertionFoundOrByUser[0].replace( | |
| 262 | InjectionModel.STAR, | |
| 263 | prefixParenthesis + InjectionModel.STAR | |
| 264 | + this.injectionModel.getMediatorEngine().getEngine().instance().endingComment() | |
| 265 | ); | |
| 266 | } else { | |
| 267 | characterInsertionFoundOrByUser[0] = prefixParenthesis | |
| 268 | + InjectionModel.STAR | |
| 269 | + this.injectionModel.getMediatorEngine().getEngine().instance().endingComment(); | |
| 270 | } | |
| 271 | ||
| 272 | LOGGER.log( | |
| 273 | LogLevelUtil.CONSOLE_SUCCESS, | |
| 274 | "Found [{}] using boolean match", | |
| 275 |
1
1. lambda$checkInsertionChar$6 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$checkInsertionChar$6 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(characterInsertionFoundOrByUser[0]) |
| 276 | ); | |
| 277 |
1
1. checkInsertionChar : replaced boolean return with false for com/jsql/model/suspendable/SuspendableGetCharInsertion::checkInsertionChar → NO_COVERAGE |
return true; |
| 278 | } | |
| 279 |
1
1. checkInsertionChar : replaced boolean return with true for com/jsql/model/suspendable/SuspendableGetCharInsertion::checkInsertionChar → NO_COVERAGE |
return false; |
| 280 | } | |
| 281 | | |
| 282 | private String getCharacterInsertion(String characterInsertionByUser, String characterInsertionDetected) { | |
| 283 | String characterInsertionDetectedFixed = characterInsertionDetected; | |
| 284 |
1
1. getCharacterInsertion : negated conditional → NO_COVERAGE |
if (characterInsertionDetectedFixed == null) { |
| 285 | characterInsertionDetectedFixed = characterInsertionByUser; | |
| 286 | String logCharacterInsertion = characterInsertionDetectedFixed; | |
| 287 | LOGGER.log( | |
| 288 | LogLevelUtil.CONSOLE_ERROR, | |
| 289 | "No prefix found, forcing to [{}]", | |
| 290 |
1
1. lambda$getCharacterInsertion$7 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getCharacterInsertion$7 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(logCharacterInsertion) |
| 291 | ); | |
| 292 | } else if ( | |
| 293 |
1
1. getCharacterInsertion : negated conditional → NO_COVERAGE |
!SuspendableGetCharInsertion.format(characterInsertionByUser).isBlank() |
| 294 |
1
1. getCharacterInsertion : negated conditional → NO_COVERAGE |
&& !SuspendableGetCharInsertion.format(characterInsertionByUser).equals( |
| 295 | SuspendableGetCharInsertion.format(characterInsertionDetectedFixed) | |
| 296 | ) | |
| 297 | ) { | |
| 298 | String finalCharacterInsertionDetectedFixed = characterInsertionDetectedFixed; | |
| 299 | LOGGER.log( | |
| 300 | LogLevelUtil.CONSOLE_INFORM, | |
| 301 | "Found prefix [{}], disable auto search in Preferences to force [{}]", | |
| 302 |
1
1. lambda$getCharacterInsertion$8 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getCharacterInsertion$8 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(finalCharacterInsertionDetectedFixed), |
| 303 |
1
1. lambda$getCharacterInsertion$9 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getCharacterInsertion$9 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(characterInsertionByUser) |
| 304 | ); | |
| 305 | } else { | |
| 306 | LOGGER.log( | |
| 307 | LogLevelUtil.CONSOLE_INFORM, | |
| 308 | "{} [{}]", | |
| 309 |
1
1. lambda$getCharacterInsertion$10 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getCharacterInsertion$10 → NO_COVERAGE |
() -> I18nUtil.valueByKey("LOG_USING_INSERTION_CHARACTER"), |
| 310 |
1
1. lambda$getCharacterInsertion$11 : replaced return value with null for com/jsql/model/suspendable/SuspendableGetCharInsertion::lambda$getCharacterInsertion$11 → NO_COVERAGE |
() -> SuspendableGetCharInsertion.format(characterInsertionDetected) |
| 311 | ); | |
| 312 | } | |
| 313 |
1
1. getCharacterInsertion : replaced return value with "" for com/jsql/model/suspendable/SuspendableGetCharInsertion::getCharacterInsertion → NO_COVERAGE |
return characterInsertionDetectedFixed; |
| 314 | } | |
| 315 | ||
| 316 | public static String format(String prefix) { // trim space prefix in cookie | |
| 317 |
1
1. format : replaced return value with "" for com/jsql/model/suspendable/SuspendableGetCharInsertion::format → NO_COVERAGE |
return prefix.trim().replaceAll("(%20)?"+ Pattern.quote(InjectionModel.STAR) +".*", StringUtils.EMPTY); |
| 318 | } | |
| 319 | } | |
Mutations | ||
| 63 |
1.1 2.2 |
|
| 64 |
1.1 |
|
| 69 |
1.1 |
|
| 73 |
1.1 |
|
| 74 |
1.1 |
|
| 75 |
1.1 |
|
| 76 |
1.1 |
|
| 84 |
1.1 |
|
| 90 |
1.1 |
|
| 95 |
1.1 |
|
| 96 |
1.1 2.2 |
|
| 99 |
1.1 |
|
| 104 |
1.1 |
|
| 105 |
1.1 |
|
| 107 |
1.1 |
|
| 108 |
1.1 2.2 |
|
| 109 |
1.1 |
|
| 110 |
1.1 |
|
| 111 |
1.1 |
|
| 112 |
1.1 |
|
| 114 |
1.1 |
|
| 120 |
1.1 |
|
| 122 |
1.1 2.2 |
|
| 123 |
1.1 2.2 |
|
| 132 |
1.1 2.2 |
|
| 138 |
1.1 |
|
| 145 |
1.1 2.2 |
|
| 174 |
1.1 |
|
| 176 |
1.1 2.2 |
|
| 181 |
1.1 |
|
| 201 |
1.1 |
|
| 209 |
1.1 |
|
| 212 |
1.1 |
|
| 213 |
1.1 2.2 |
|
| 214 |
1.1 |
|
| 218 |
1.1 |
|
| 220 |
1.1 |
|
| 223 |
1.1 2.2 |
|
| 225 |
1.1 |
|
| 241 |
1.1 |
|
| 256 |
1.1 |
|
| 259 |
1.1 |
|
| 260 |
1.1 |
|
| 275 |
1.1 |
|
| 277 |
1.1 |
|
| 279 |
1.1 |
|
| 284 |
1.1 |
|
| 290 |
1.1 |
|
| 293 |
1.1 |
|
| 294 |
1.1 |
|
| 302 |
1.1 |
|
| 303 |
1.1 |
|
| 309 |
1.1 |
|
| 310 |
1.1 |
|
| 313 |
1.1 |
|
| 317 |
1.1 |