1 package com.jsql.model.suspendable;
2
3 import com.jsql.model.InjectionModel;
4 import com.jsql.view.subscriber.Seal;
5 import com.jsql.model.exception.JSqlRuntimeException;
6 import com.jsql.model.exception.StoppedByUserSlidingException;
7 import com.jsql.model.injection.strategy.blind.AbstractInjectionBit;
8 import com.jsql.model.injection.strategy.blind.InjectionEngine;
9 import com.jsql.util.LogLevelUtil;
10 import org.apache.commons.lang3.StringUtils;
11 import org.apache.logging.log4j.LogManager;
12 import org.apache.logging.log4j.Logger;
13
14 import java.util.concurrent.atomic.AtomicBoolean;
15
16 public class SuspendableGetEngine extends AbstractSuspendable {
17
18 private static final Logger LOGGER = LogManager.getRootLogger();
19
20 public SuspendableGetEngine(InjectionModel injectionModel) {
21 super(injectionModel);
22 }
23
24 @Override
25 public String run(Object... args) {
26 LOGGER.log(LogLevelUtil.CONSOLE_DEFAULT, "Fingerprinting database with Boolean match...");
27
28 AtomicBoolean isEngineFound = new AtomicBoolean(false);
29 this.injectionModel.getMediatorEngine().getEnginesForFingerprint()
30 .stream()
31 .filter(engine -> engine != this.injectionModel.getMediatorEngine().getAuto())
32 .filter(engine -> StringUtils.isNotEmpty(
33 engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getEngineSpecific()
34 ))
35 .forEach(engine -> {
36 if (isEngineFound.get()) {
37 return;
38 }
39 String engineSpecificWithOperator = this.injectionModel.getMediatorEngine().getEngine().instance().sqlTestBlindWithOperator(
40 engine.instance().getModelYaml().getStrategy().getConfiguration().getFingerprint().getEngineSpecific(),
41 AbstractInjectionBit.BlindOperator.OR
42 );
43 try {
44 var injectionCharInsertion = new InjectionEngine(this.injectionModel, engineSpecificWithOperator, engine);
45 if (injectionCharInsertion.isInjectable(engineSpecificWithOperator)) {
46 if (this.isSuspended()) {
47 throw new StoppedByUserSlidingException();
48 }
49
50 LOGGER.log(LogLevelUtil.CONSOLE_SUCCESS, "Found [{}] using Boolean match", engine);
51 this.injectionModel.getMediatorEngine().setEngine(engine);
52 isEngineFound.set(true);
53
54 this.injectionModel.sendToViews(new Seal.ActivateEngine(this.injectionModel.getMediatorEngine().getEngine()));
55 }
56 } catch (StoppedByUserSlidingException e) {
57 throw new JSqlRuntimeException(e);
58 }
59 });
60 return null;
61 }
62 }