Skip to content

Commit ad2f822

Browse files
committed
- Refactoring
- Better consistency in parameter order - Better UX and responsivness for the headers inside the tabs - Popup messages - Optimization for the config load from the URL
1 parent 0777a9e commit ad2f822

File tree

3 files changed

+187
-164
lines changed

3 files changed

+187
-164
lines changed

app.js

Lines changed: 148 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,130 @@
11
class SQLMapGenerator {
22
constructor() {
33
this.config = {};
4+
5+
this.paramMapping = {
6+
'-u': 'url',
7+
'-d': 'directDb',
8+
'-g': 'googleDork',
9+
'-m': 'targetsFile',
10+
'-l': 'burpFile',
11+
'--scope': 'burpFileScope',
12+
13+
'--timeout': 'timeout',
14+
'--delay': 'delay',
15+
'--threads': 'threads',
16+
'--force-ssl': 'forceSsl',
17+
'--keep-alive': 'keepAlive',
18+
'--null-connection': 'nullConnection',
19+
20+
'--proxy': 'proxy',
21+
'--proxy-cred': 'proxyCred',
22+
'--proxy-file': 'proxyFile',
23+
'--proxy-freq': 'proxyFreq',
24+
'--ignore-proxy': 'proxyIgnore',
25+
'--tor': 'tor',
26+
'--check-tor': 'checkTor',
27+
'--tor-port': 'torPort',
28+
'--tor-type': 'torType',
29+
30+
'--method': 'method',
31+
'--param-del': 'paramDel',
32+
'-r': 'requestFile',
33+
'--data': 'data',
34+
35+
'--host': 'host',
36+
'-A': 'userAgent',
37+
'--random-agent': 'userAgent',
38+
'--mobile': 'mobileUserAgent',
39+
'--referer': 'referer',
40+
'-H': 'headers',
41+
42+
'--cookie': 'cookie',
43+
'--cookie-del': 'cookieDel',
44+
'--live-cookies': 'cookieLive',
45+
'--load-cookies': 'cookieLoad',
46+
'--drop-set-cookie': 'cookieDrop',
47+
'--auth-type': 'authType',
48+
'--auth-cred': 'authCred',
49+
'--auth-file': 'authFile',
50+
51+
'--csrf-token': 'csrfToken',
52+
'--csrf-method': 'csrfMethod',
53+
'--csrf-url': 'csrfUrl',
54+
'--csrf-retries': 'csrfRetries',
55+
56+
'-p': 'paramTest',
57+
'--skip': 'paramSkip',
58+
'--param-exclude': 'paramExclude',
59+
'--param-filter': 'paramFilter',
60+
'--prefix': 'prefix',
61+
'--suffix': 'suffix',
62+
63+
'--string': 'string',
64+
'--regexp': 'regexp',
65+
'--not-string': 'notString',
66+
'--code': 'code',
67+
'--titles': 'titles',
68+
'--text-only': 'textOnly',
69+
'--level': 'level',
70+
71+
'--risk': 'risk',
72+
'--dbms': 'dbms',
73+
'--os': 'os',
74+
'--second-url': 'secondUrl',
75+
'--second-req': 'secondReq',
76+
'--technique': 'technique',
77+
'--invalid-bignum': 'invalidBignum',
78+
'--invalid-logical': 'invalidLogical',
79+
'--invalid-string': 'invalidString',
80+
'--no-cast': 'noCast',
81+
'--no-escape': 'noEscape',
82+
'--predict-output':'predictOutput',
83+
84+
'--all': 'all',
85+
'--banner': 'banner',
86+
'--columns': 'columns',
87+
'--comments': 'comments',
88+
'--count': 'count',
89+
'--current-user': 'currentUser',
90+
'--current-db': 'currentDb',
91+
'--dbs': 'dbs',
92+
'--dump': 'dump',
93+
'--dump-all': 'dumpAll',
94+
'--exclude-sysdbs': 'excludeSysdbs',
95+
'--hostname': 'hostname',
96+
'--is-dba': 'isDba',
97+
'--passwords': 'passwords',
98+
'--privileges': 'privileges',
99+
'--roles': 'roles',
100+
'--schema': 'schema',
101+
'--search': 'search',
102+
'--statements': 'statements',
103+
'--tables': 'tables',
104+
'--users': 'users',
105+
106+
'-D': 'database',
107+
'-T': 'table',
108+
'-C': 'column',
109+
'-X': 'exclude',
110+
'-U': 'user',
111+
'--pivot-column': 'pivotColumn',
112+
'--where': 'where',
113+
'--start': 'start',
114+
'--stop': 'stop',
115+
'--first': 'first',
116+
'--last': 'last',
117+
'--sql-query': 'sqlQuery',
118+
'--sql-file': 'sqlFile',
119+
120+
'--tamper': 'tamper',
121+
122+
'-v': 'verbose',
123+
'-t': 'trafficFile',
124+
'--batch': 'batch',
125+
'--parse-errors': 'parseErrors'
126+
};
127+
4128
this.tamperScriptList = [
5129
"0eunion",
6130
"apostrophemask",
@@ -431,7 +555,10 @@ class SQLMapGenerator {
431555
if (suffix) config['--suffix'] = suffix;
432556

433557
const secondUrl = document.getElementById('secondUrl').value.trim();
434-
if (secondUrl) config['--second-url'] = secondUrl;
558+
if (secondUrl) config['--second-url'] = secondUrl;
559+
560+
const secondReq = document.getElementById('secondReq').value.trim();
561+
if (secondReq) config['--second-req'] = secondReq;
435562

436563
// Techniques
437564
const techniques = [];
@@ -493,6 +620,7 @@ class SQLMapGenerator {
493620
if (document.getElementById('dumpAll').checked) config['--dump-all'] = true;
494621
if (document.getElementById('hostname').checked) config['--hostname'] = true;
495622
if (document.getElementById('isDba').checked) config['--is-dba'] = true;
623+
if (document.getElementById('excludeSysdbs').checked) config['--exclude-sysdbs'] = true;
496624
if (document.getElementById('passwords').checked) config['--passwords'] = true;
497625
if (document.getElementById('privileges').checked) config['--privileges'] = true;
498626
if (document.getElementById('roles').checked) config['--roles'] = true;
@@ -530,11 +658,17 @@ class SQLMapGenerator {
530658
if (stop) config['--stop'] = stop;
531659

532660
const first = document.getElementById('first').value.trim();
533-
if (first) config['--first'] = first;
661+
if (first) config['--first'] = first;
534662

535663
const last = document.getElementById('last').value.trim();
536664
if (last) config['--last'] = last;
537665

666+
const sqlQuery = document.getElementById('sqlQuery').value.trim();
667+
if (sqlQuery) config['--sql-query'] = sqlQuery;
668+
669+
const sqlFile = document.getElementById('sqlFile').value.trim();
670+
if (sqlFile) config['--sql-file'] = sqlFile;
671+
538672
return config;
539673
}
540674

@@ -543,26 +677,7 @@ class SQLMapGenerator {
543677
let command = 'sqlmap';
544678

545679
// Order of parameters for better readability
546-
const paramOrder = [
547-
'-u', '-d', '-r', '-m', '-l', '--scope', '-g',
548-
'--timeout', '--delay', '--threads',
549-
'--proxy', '--proxy-cred', '--proxy-file', '--proxy-freq', '--ignore-proxy',
550-
'--tor', '--check-tor', '--tor-port', '--tor-type',
551-
'--force-ssl', '--keep-alive', '--null-connection', '--http2',
552-
'--method', '--data', '--param-del',
553-
'--string', '--not-string', '--regexp', '--code', '--text-only', '--titles',
554-
'--host', '-A', '--mobile', '--random-agent', "--referer", "-H",
555-
'--cookie', '--cookie-del', '--live-cookies', '--load-cookies', '--drop-set-cookie',
556-
'--auth-type', '--auth-cred', '--auth-file',
557-
'--csrf-token', '--csrf-url', '--csrf-method', '--csrf-retries',
558-
'-p', '--skip', '--param-exclude', '--param-filter', '--level', '--risk', '--dbms', '--os',
559-
'--technique', '--invalid-bignum', '--invalid-logical', '--invalid-string', '--no-cast', '--no-escape', '--predict-output',
560-
'--batch', '-v', '-t', '--parse-errors', '--test-filter',
561-
'--all', '--banner', '--columns', '--comments', '--count', '--current-user', '--current-db', '--dbs', '--dump', '--dump-all',
562-
'--hostname', '--is-dba', '--passwords', '--privileges', '--roles', '--schema', '--search', '--statements', '--tables', '--users',
563-
'-D', '-T', '-C', '-X', '-U', '--pivot-column', '--where', '--start', '--stop', '--first', '--last',
564-
'--tamper', '--prefix', '--suffix', '--csrf-token', '--csrf-url', '--second-url'
565-
];
680+
const paramOrder = Object.keys(this.paramMapping);
566681

567682
// Add parameters in order
568683
paramOrder.forEach(param => {
@@ -592,9 +707,10 @@ class SQLMapGenerator {
592707
// Check if we have hashtag with proper config and load it if so
593708
try {
594709
let hashtag = location.hash.substr(1);
595-
if (hashtag.length > 0) {
710+
if (hashtag.length > 0 && hashtag !== "e30=") {
596711
let hashtagCmd = JSON.parse(atob(hashtag));
597712
this.applyConfiguration(hashtagCmd);
713+
this.showMessage("Configuration loaded from URL", 'success');
598714
}
599715
} catch (ex) {
600716
console.log(ex);
@@ -792,119 +908,12 @@ class SQLMapGenerator {
792908

793909
applyConfiguration(config) {
794910
// Reset form first
795-
this.resetConfiguration();
911+
this.resetConfiguration(true);
796912

797913
// Apply configuration
798914
Object.entries(config).forEach(([param, value]) => {
799-
// Map parameters to form element IDs
800-
const paramMapping = {
801-
'-u': 'url',
802-
'-d': 'directDb',
803-
'-r': 'requestFile',
804-
'-m': 'targetsFile',
805-
'-l': 'burpFile',
806-
'--scope': 'burpFileScope',
807-
'-g': 'googleDork',
808-
'--force-ssl': 'forceSsl',
809-
'--timeout': 'timeout',
810-
'--delay': 'delay',
811-
'--threads': 'threads',
812-
'--proxy': 'proxy',
813-
'--proxy-cred': 'proxyCred',
814-
'--proxy-file': 'proxyFile',
815-
'--proxy-freq': 'proxyFreq',
816-
'--ignore-proxy': 'proxyIgnore',
817-
'--tor': 'tor',
818-
'--check-tor': 'checkTor',
819-
'--tor-port': 'torPort',
820-
'--tor-type': 'torType',
821-
'--method': 'method',
822-
'--data': 'data',
823-
'--param-del': 'paramDel',
824-
'--prefix': 'prefix',
825-
'--suffix': 'suffix',
826-
'--host': 'host',
827-
'-A': 'userAgent',
828-
'--string': 'string',
829-
'--not-string': 'notString',
830-
'--regexp': 'regexp',
831-
'--code': 'code',
832-
'--titles': 'titles',
833-
'--text-only': 'textOnly',
834-
'--mobile': 'mobileUserAgent',
835-
'--random-agent': 'userAgent',
836-
'--referer': 'referer',
837-
'-H': 'headers',
838-
'--cookie': 'cookie',
839-
'--cookie-del': 'cookieDel',
840-
'--live-cookies': 'cookieLive',
841-
'--drop-set-cookie': 'cookieDrop',
842-
'--load-cookies': 'cookieLoad',
843-
'--auth-type': 'authType',
844-
'--auth-cred': 'authCred',
845-
'--auth-file': 'authFile',
846-
'--csrf-token': 'csrfToken',
847-
'--csrf-url': 'csrfUrl',
848-
'--csrf-method': 'csrfMethod',
849-
'--csrf-retries': 'csrfRetries',
850-
'-p': 'paramTest',
851-
'--skip': 'paramSkip',
852-
'--param-exclude': 'paramExclude',
853-
'--param-filter': 'paramFilter',
854-
'--level': 'level',
855-
'--risk': 'risk',
856-
'--dbms': 'dbms',
857-
'--os': 'os',
858-
'--technique': 'technique',
859-
'--invalid-bignum': 'invalidBignum',
860-
'--invalid-logical': 'invalidLogical',
861-
'--invalid-string': 'invalidString',
862-
'--no-cast': 'noCast',
863-
'--no-escape': 'noEscape',
864-
'--predict-output':'predictOutput',
865-
'--keep-alive': 'keepAlive',
866-
'--batch': 'batch',
867-
'-v': 'verbose',
868-
'-t': 'trafficFile',
869-
'--parse-errors': 'parseErrors',
870-
'--test-filter': 'testFilter',
871-
'--all': 'all',
872-
'--banner': 'banner',
873-
'--columns': 'columns',
874-
'--comments': 'comments',
875-
'--count': 'count',
876-
'--current-user': 'currentUser',
877-
'--current-db': 'currentDb',
878-
'--dbs': 'dbs',
879-
'--dump': 'dump',
880-
'--dump-all': 'dumpAll',
881-
'--hostname': 'hostname',
882-
'--is-dba': 'isDba',
883-
'--passwords': 'passwords',
884-
'--privileges': 'privileges',
885-
'--roles': 'roles',
886-
'--schema': 'schema',
887-
'--search': 'search',
888-
'--statements': 'statements',
889-
'--tables': 'tables',
890-
'--users': 'users',
891-
'-D': 'database',
892-
'-T': 'table',
893-
'-C': 'column',
894-
'-X': 'exclude',
895-
'-U': 'user',
896-
'--where': 'where',
897-
'--start': 'start',
898-
'--stop': 'stop',
899-
'--first': 'first',
900-
'--last': 'last',
901-
'--pivot-column': 'pivotColumn',
902-
'--null-connection': 'nullConnection',
903-
'--tamper': 'tamper',
904-
'--second-url': 'secondUrl'
905-
};
906915

907-
const elementId = paramMapping[param];
916+
const elementId = this.paramMapping[param];
908917
if (elementId) {
909918
const element = document.getElementById(elementId);
910919
if (element) {
@@ -947,7 +956,7 @@ class SQLMapGenerator {
947956
this.updateCommand();
948957
}
949958

950-
resetConfiguration() {
959+
resetConfiguration(skipResetAlert = false) {
951960
// Reset all form fields
952961
document.querySelectorAll('input, select, textarea').forEach(element => {
953962
if (element.type === 'checkbox') {
@@ -974,29 +983,25 @@ class SQLMapGenerator {
974983
document.getElementById('customCsrfMethodGroup').style.display = 'none';
975984

976985
this.updateCommand();
977-
this.showMessage('Configuration deleted', 'info');
986+
if (!skipResetAlert) {
987+
this.showMessage('Configuration loaded', 'info');
988+
}
978989
}
979990

980991
showMessage(message, type = 'info') {
981992
// Create message element
982993
const messageEl = document.createElement('div');
983994
messageEl.className = `status status--${type}`;
984995
messageEl.textContent = message;
985-
messageEl.style.position = 'fixed';
986-
messageEl.style.top = '20px';
987-
messageEl.style.right = '20px';
988-
messageEl.style.zIndex = '1000';
989-
messageEl.style.minWidth = '300px';
990-
messageEl.style.padding = '12px 16px';
991996

992-
document.body.appendChild(messageEl);
997+
document.getElementById("status-container").appendChild(messageEl);
993998

994-
// Remove after 10 seconds
999+
// Remove after 6 seconds
9951000
setTimeout(() => {
9961001
if (messageEl.parentNode) {
9971002
messageEl.parentNode.removeChild(messageEl);
9981003
}
999-
}, 10000);
1004+
}, 6000);
10001005
}
10011006
}
10021007

0 commit comments

Comments
 (0)