13
13
from arjun .core .utils import fetch_params , stable_request , random_str , slicer , confirm , populate , reader , nullify , prepare_requests , compatible_path
14
14
15
15
from arjun .plugins .heuristic import heuristic
16
+ from arjun .plugins .wl import detect_casing , covert_to_case
16
17
17
18
arjun_dir = compatible_path (mem .__file__ .replace (compatible_path ('/core/config.py' ), '' ))
18
19
25
26
parser .add_argument ('-d' , help = 'Delay between requests in seconds. (default: 0)' , dest = 'delay' , type = float , default = 0 )
26
27
parser .add_argument ('-t' , help = 'Number of concurrent threads. (default: 5)' , dest = 'threads' , type = int , default = 5 )
27
28
parser .add_argument ('-w' , help = 'Wordlist file path. (default: {arjundir}/db/large.txt)' , dest = 'wordlist' , default = arjun_dir + '/db/large.txt' )
28
- parser .add_argument ('-m' , help = 'Request method to use: GET/POST/XML/JSON/HEADERS . (default: GET)' , dest = 'method' , default = 'GET' )
29
+ parser .add_argument ('-m' , help = 'Request method to use: GET/POST/XML/JSON. (default: GET)' , dest = 'method' , default = 'GET' )
29
30
parser .add_argument ('-i' , help = 'Import target URLs from file.' , dest = 'import_file' , nargs = '?' , const = True )
30
31
parser .add_argument ('-T' , help = 'HTTP request timeout in seconds. (default: 15)' , dest = 'timeout' , type = float , default = 15 )
31
32
parser .add_argument ('-c' , help = 'Chunk size. The number of parameters to be sent at once' , type = int , dest = 'chunks' , default = 250 )
36
37
parser .add_argument ('--stable' , help = 'Prefer stability over speed.' , dest = 'stable' , action = 'store_true' )
37
38
parser .add_argument ('--include' , help = 'Include this data in every request.' , dest = 'include' , default = {})
38
39
parser .add_argument ('--disable-redirects' , help = 'disable redirects' , dest = 'disable_redirects' , action = 'store_true' )
40
+ parser .add_argument ('--casing' , help = 'casing style for params e.g. like_this, likeThis, likethis' , dest = 'casing' )
39
41
args = parser .parse_args () # arguments to be parsed
40
42
41
43
if args .quiet :
77
79
passive_params = fetch_params (host )
78
80
wordlist .update (passive_params )
79
81
print ('%s Collected %s parameters, added to the wordlist' % (info , len (passive_params )))
80
- wordlist = list (wordlist )
82
+ if args .casing :
83
+ delimiter , casing = detect_casing (args .casing )
84
+ wordlist = [covert_to_case (word , delimiter , casing ) for word in wordlist ]
85
+ else :
86
+ wordlist = list (wordlist )
81
87
except FileNotFoundError :
82
88
exit ('%s The specified file for parameters doesn\' t exist' % bad )
83
89
@@ -118,11 +124,15 @@ def initialize(request, wordlist, single_url=False):
118
124
return 'skipped'
119
125
print ('%s Probing the target for stability' % run )
120
126
request ['url' ] = stable_request (url , request ['headers' ])
127
+ mem .var ['healthy_url' ] = True
121
128
if not request ['url' ]:
122
129
return 'skipped'
123
130
else :
124
131
fuzz = "z" + random_str (6 )
125
132
response_1 = requester (request , {fuzz [:- 1 ]: fuzz [::- 1 ][:- 1 ]})
133
+ mem .var ['healthy_url' ] = response_1 .status_code not in (400 , 413 , 418 , 429 , 503 )
134
+ if not mem .var ['healthy_url' ]:
135
+ print ('%s Target returned HTTP %i, this may cause problems.' % (bad , request .status_code ))
126
136
if single_url :
127
137
print ('%s Analysing HTTP response for anomalies' % run )
128
138
response_2 = requester (request , {fuzz [:- 1 ]: fuzz [::- 1 ][:- 1 ]})
@@ -139,16 +149,14 @@ def initialize(request, wordlist, single_url=False):
139
149
reason = compare (response_3 , factors , {zzuf [:- 1 ]: zzuf [::- 1 ][:- 1 ]})[2 ]
140
150
if not reason :
141
151
break
142
- factors [reason ] = False
143
- if single_url :
144
- print ('%s Analysing HTTP response for potential parameter names' % run )
152
+ factors [reason ] = None
145
153
if found :
146
154
num = len (found )
147
155
if words_exist :
148
- print ('%s Heuristic scanner found %i parameters' % (good , num ))
156
+ print ('%s Extracted %i parameters from response for testing ' % (good , num ))
149
157
else :
150
158
s = 's' if num > 1 else ''
151
- print ('%s Heuristic scanner found %i parameter%s: %s' % (good , num , s , ', ' .join (found )))
159
+ print ('%s Extracted %i parameter%s from response for testing : %s' % (good , num , s , ', ' .join (found )))
152
160
if single_url :
153
161
print ('%s Logicforcing the URL endpoint' % run )
154
162
populated = populate (wordlist )
@@ -192,11 +200,11 @@ def main():
192
200
count = 0
193
201
for request in requests :
194
202
url = request ['url' ]
203
+ print ('%s Scanning %d/%d: %s' % (run , count , len (requests ), url ))
195
204
these_params = initialize (request , wordlist , single_url = is_single )
196
205
count += 1
197
206
mem .var ['kill' ] = False
198
207
mem .var ['bad_req_count' ] = 0
199
- print ('%s Scanning %d/%d: %s' % (run , count , len (requests ), url ))
200
208
if these_params == 'skipped' :
201
209
print ('%s Skipped %s due to errors' % (bad , url ))
202
210
elif these_params :
@@ -205,7 +213,7 @@ def main():
205
213
final_result [url ]['method' ] = request ['method' ]
206
214
final_result [url ]['headers' ] = request ['headers' ]
207
215
exporter (final_result )
208
- print ('%s Parameters found: %s \n ' % (good , ', ' .join (final_result [url ]['params' ])))
216
+ print ('%s Parameters found: %-4s \n ' % (good , ', ' .join (final_result [url ]['params' ])))
209
217
if not mem .var ['json_file' ]:
210
218
final_result = {}
211
219
continue
0 commit comments