1 package com.jsql.model.injection.strategy.blind.callable;
2
3 import com.jsql.model.InjectionModel;
4 import com.jsql.model.injection.strategy.blind.AbstractInjectionBit.BlindOperator;
5 import com.jsql.model.injection.strategy.blind.InjectionBlindBit;
6 import name.fraser.neil.plaintext.diff_match_patch;
7 import static name.fraser.neil.plaintext.diff_match_patch.Diff;
8
9 import java.util.LinkedList;
10 import java.util.List;
11 import java.util.concurrent.CopyOnWriteArrayList;
12
13
14
15
16
17
18 public class CallableBlindBit extends AbstractCallableBit<CallableBlindBit> {
19
20 private LinkedList<Diff> diffsWithReference = new LinkedList<>();
21
22 private static final diff_match_patch DIFF_MATCH_PATCH = new diff_match_patch();
23
24 private final InjectionBlindBit injectionBlindBit;
25
26 private final InjectionModel injectionModel;
27 private final String metadataInjectionProcess;
28
29
30
31
32 public CallableBlindBit(String sqlQuery, InjectionModel injectionModel, InjectionBlindBit injectionBlindBit, BlindOperator blindMode, String metadataInjectionProcess) {
33 this.injectionModel = injectionModel;
34 this.injectionBlindBit = injectionBlindBit;
35 this.metadataInjectionProcess = metadataInjectionProcess;
36 this.booleanUrl = this.injectionModel.getMediatorVendor().getVendor().instance().sqlTestBlindWithOperator(sqlQuery, blindMode);
37 }
38
39
40
41
42 public CallableBlindBit(
43 String sqlQuery,
44 int indexChar,
45 int bit,
46 InjectionModel injectionModel,
47 InjectionBlindBit injectionBlindBit,
48 BlindOperator blindMode,
49 String metadataInjectionProcess
50 ) {
51 this(sqlQuery, injectionModel, injectionBlindBit, blindMode, metadataInjectionProcess);
52 this.booleanUrl = this.injectionModel.getMediatorVendor().getVendor().instance().sqlBlindBit(sqlQuery, indexChar, bit, blindMode);
53 this.currentIndex = indexChar;
54 this.currentBit = bit;
55 }
56
57
58
59
60
61
62
63 @Override
64 public boolean isTrue() {
65
66 List<Diff> falseDiffs = new CopyOnWriteArrayList<>(this.injectionBlindBit.getFalseDiffs());
67 for (Diff falseDiff: falseDiffs) {
68
69
70 if (this.diffsWithReference.contains(falseDiff)) {
71 return false;
72 }
73 }
74 return true;
75 }
76
77
78
79
80
81
82 @Override
83 public CallableBlindBit call() {
84 String result = this.injectionBlindBit.callUrl(this.booleanUrl, this.metadataInjectionProcess, this);
85 this.diffsWithReference = CallableBlindBit.DIFF_MATCH_PATCH.diff_main(this.injectionBlindBit.getSourceReferencePage(), result, true);
86 CallableBlindBit.DIFF_MATCH_PATCH.diff_cleanupEfficiency(this.diffsWithReference);
87 return this;
88 }
89
90 public List<Diff> getDiffsWithReference() {
91 return this.diffsWithReference;
92 }
93 }