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