11class SQLMapGenerator {
22constructor ( ) {
33this . 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+
4128this . tamperScriptList = [
5129"0eunion" ,
6130"apostrophemask" ,
@@ -431,7 +555,10 @@ class SQLMapGenerator {
431555if ( suffix ) config [ '--suffix' ] = suffix ;
432556
433557const 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
437564const techniques = [ ] ;
@@ -493,6 +620,7 @@ class SQLMapGenerator {
493620if ( document . getElementById ( 'dumpAll' ) . checked ) config [ '--dump-all' ] = true ;
494621if ( document . getElementById ( 'hostname' ) . checked ) config [ '--hostname' ] = true ;
495622if ( document . getElementById ( 'isDba' ) . checked ) config [ '--is-dba' ] = true ;
623+ if ( document . getElementById ( 'excludeSysdbs' ) . checked ) config [ '--exclude-sysdbs' ] = true ;
496624if ( document . getElementById ( 'passwords' ) . checked ) config [ '--passwords' ] = true ;
497625if ( document . getElementById ( 'privileges' ) . checked ) config [ '--privileges' ] = true ;
498626if ( document . getElementById ( 'roles' ) . checked ) config [ '--roles' ] = true ;
@@ -530,11 +658,17 @@ class SQLMapGenerator {
530658if ( stop ) config [ '--stop' ] = stop ;
531659
532660const first = document . getElementById ( 'first' ) . value . trim ( ) ;
533- if ( first ) config [ '--first' ] = first ;
661+ if ( first ) config [ '--first' ] = first ;
534662
535663const last = document . getElementById ( 'last' ) . value . trim ( ) ;
536664if ( 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+
538672return config ;
539673}
540674
@@ -543,26 +677,7 @@ class SQLMapGenerator {
543677let 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
568683paramOrder . forEach ( param => {
@@ -592,9 +707,10 @@ class SQLMapGenerator {
592707// Check if we have hashtag with proper config and load it if so
593708try {
594709let hashtag = location . hash . substr ( 1 ) ;
595- if ( hashtag . length > 0 ) {
710+ if ( hashtag . length > 0 && hashtag !== "e30=" ) {
596711let hashtagCmd = JSON . parse ( atob ( hashtag ) ) ;
597712this . applyConfiguration ( hashtagCmd ) ;
713+ this . showMessage ( "Configuration loaded from URL" , 'success' ) ;
598714}
599715} catch ( ex ) {
600716console . log ( ex ) ;
@@ -792,119 +908,12 @@ class SQLMapGenerator {
792908
793909applyConfiguration ( config ) {
794910// Reset form first
795- this . resetConfiguration ( ) ;
911+ this . resetConfiguration ( true ) ;
796912
797913// Apply configuration
798914Object . 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 ] ;
908917if ( elementId ) {
909918const element = document . getElementById ( elementId ) ;
910919if ( element ) {
@@ -947,7 +956,7 @@ class SQLMapGenerator {
947956this . updateCommand ( ) ;
948957}
949958
950- resetConfiguration ( ) {
959+ resetConfiguration ( skipResetAlert = false ) {
951960// Reset all form fields
952961document . querySelectorAll ( 'input, select, textarea' ) . forEach ( element => {
953962if ( element . type === 'checkbox' ) {
@@ -974,29 +983,25 @@ class SQLMapGenerator {
974983document . getElementById ( 'customCsrfMethodGroup' ) . style . display = 'none' ;
975984
976985this . updateCommand ( ) ;
977- this . showMessage ( 'Configuration deleted' , 'info' ) ;
986+ if ( ! skipResetAlert ) {
987+ this . showMessage ( 'Configuration loaded' , 'info' ) ;
988+ }
978989}
979990
980991showMessage ( message , type = 'info' ) {
981992// Create message element
982993const messageEl = document . createElement ( 'div' ) ;
983994messageEl . className = `status status--${ type } ` ;
984995messageEl . 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 after10 seconds
999+ // Remove after6 seconds
9951000setTimeout ( ( ) => {
9961001if ( messageEl . parentNode ) {
9971002messageEl . parentNode . removeChild ( messageEl ) ;
9981003}
999- } , 10000 ) ;
1004+ } , 6000 ) ;
10001005}
10011006}
10021007