ronin-vulns 0.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.rspec +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -0
  8. data/COPYING.txt +165 -0
  9. data/ChangeLog.md +22 -0
  10. data/Gemfile +34 -0
  11. data/README.md +328 -0
  12. data/Rakefile +34 -0
  13. data/bin/ronin-vulns +19 -0
  14. data/data/rfi_test.asp +21 -0
  15. data/data/rfi_test.aspx +25 -0
  16. data/data/rfi_test.cfm +27 -0
  17. data/data/rfi_test.jsp +19 -0
  18. data/data/rfi_test.php +24 -0
  19. data/data/rfi_test.pl +25 -0
  20. data/gemspec.yml +41 -0
  21. data/lib/ronin/vulns/cli/command.rb +39 -0
  22. data/lib/ronin/vulns/cli/commands/lfi.rb +145 -0
  23. data/lib/ronin/vulns/cli/commands/open_redirect.rb +119 -0
  24. data/lib/ronin/vulns/cli/commands/reflected_xss.rb +99 -0
  25. data/lib/ronin/vulns/cli/commands/rfi.rb +156 -0
  26. data/lib/ronin/vulns/cli/commands/scan.rb +316 -0
  27. data/lib/ronin/vulns/cli/commands/sqli.rb +133 -0
  28. data/lib/ronin/vulns/cli/commands/ssti.rb +126 -0
  29. data/lib/ronin/vulns/cli/logging.rb +78 -0
  30. data/lib/ronin/vulns/cli/web_vuln_command.rb +347 -0
  31. data/lib/ronin/vulns/cli.rb +45 -0
  32. data/lib/ronin/vulns/lfi/test_file.rb +91 -0
  33. data/lib/ronin/vulns/lfi.rb +266 -0
  34. data/lib/ronin/vulns/open_redirect.rb +118 -0
  35. data/lib/ronin/vulns/reflected_xss/context.rb +224 -0
  36. data/lib/ronin/vulns/reflected_xss/test_string.rb +149 -0
  37. data/lib/ronin/vulns/reflected_xss.rb +184 -0
  38. data/lib/ronin/vulns/rfi.rb +224 -0
  39. data/lib/ronin/vulns/root.rb +28 -0
  40. data/lib/ronin/vulns/sqli/error_pattern.rb +89 -0
  41. data/lib/ronin/vulns/sqli.rb +397 -0
  42. data/lib/ronin/vulns/ssti/test_expression.rb +104 -0
  43. data/lib/ronin/vulns/ssti.rb +203 -0
  44. data/lib/ronin/vulns/url_scanner.rb +218 -0
  45. data/lib/ronin/vulns/version.rb +26 -0
  46. data/lib/ronin/vulns/vuln.rb +49 -0
  47. data/lib/ronin/vulns/web_vuln/http_request.rb +223 -0
  48. data/lib/ronin/vulns/web_vuln.rb +774 -0
  49. data/man/ronin-vulns-lfi.1 +107 -0
  50. data/man/ronin-vulns-lfi.1.md +80 -0
  51. data/man/ronin-vulns-open-redirect.1 +98 -0
  52. data/man/ronin-vulns-open-redirect.1.md +73 -0
  53. data/man/ronin-vulns-reflected-xss.1 +95 -0
  54. data/man/ronin-vulns-reflected-xss.1.md +71 -0
  55. data/man/ronin-vulns-rfi.1 +107 -0
  56. data/man/ronin-vulns-rfi.1.md +80 -0
  57. data/man/ronin-vulns-scan.1 +138 -0
  58. data/man/ronin-vulns-scan.1.md +103 -0
  59. data/man/ronin-vulns-sqli.1 +107 -0
  60. data/man/ronin-vulns-sqli.1.md +80 -0
  61. data/man/ronin-vulns-ssti.1 +99 -0
  62. data/man/ronin-vulns-ssti.1.md +74 -0
  63. data/ronin-vulns.gemspec +60 -0
  64. metadata +161 -0
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-vulns - A Ruby library for blind vulnerability testing.
4
+ #
5
+ # Copyright (c) 2007-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-vulns is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-vulns is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-vulns. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/vulns/cli/web_vuln_command'
22
+ require 'ronin/vulns/rfi'
23
+
24
+ module Ronin
25
+ module Vulns
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Scans URL(s) for Remote File Inclusion (RFI) vulnerabilities.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-vulns rfi [options] {URL ... | --input FILE}
34
+ #
35
+ # ## Options
36
+ #
37
+ # --first Only find the first vulnerability for each URL
38
+ # -A, --all Find all vulnerabilities for each URL
39
+ # -H, --header "Name: value" Sets an additional header
40
+ # -C, --cookie COOKIE Sets the raw Cookie header
41
+ # -c, --cookie-param NAME=VALUE Sets an additional cookie param
42
+ # -R, --referer URL Sets the Referer header
43
+ # -F, --form-param NAME=VALUE Sets an additional form param
44
+ # --test-query-param NAME Tests the URL query param name
45
+ # --test-all-query-params Test all URL query param names
46
+ # --test-header-name NAME Tests the HTTP Header name
47
+ # --test-cookie-param NAME Tests the HTTP Cookie name
48
+ # --test-all-cookie-params Test all Cookie param names
49
+ # --test-form-param NAME Tests the form param name
50
+ # -i, --input FILE Reads URLs from the list file
51
+ # -B double-encode|suffix-escape|null-byte,
52
+ # --filter-bypass Optional filter-bypass strategy to use
53
+ # -S asp|asp.net|coldfusion|jsp|php|perl,
54
+ # --script-lang Explicitly specify the scripting language to test for
55
+ # -T, --test-script-url URL Use an altnerative test script URL
56
+ # -h, --help Print help information
57
+ #
58
+ # ## Arguments
59
+ #
60
+ # [URL ...] The URL(s) to scan
61
+ #
62
+ class Rfi < WebVulnCommand
63
+
64
+ usage '[options] {URL ... | --input FILE}'
65
+
66
+ option :filter_bypass, short: '-B',
67
+ value: {
68
+ type: {
69
+ 'double-encode' => :double_encode,
70
+ 'suffix-escape' => :suffix_escape,
71
+ 'null-byte' => :null_byte
72
+ },
73
+ },
74
+ desc: 'Optional filter-bypass strategy to use'
75
+
76
+ option :script_lang, short: '-S',
77
+ value: {
78
+ type: {
79
+ 'asp' => :asp,
80
+ 'asp.net' => :asp_net,
81
+ 'coldfusion' => :cold_fusion,
82
+ 'jsp' => :jsp,
83
+ 'php' => :php,
84
+ 'perl' => :perl
85
+ }
86
+ },
87
+ desc: 'Explicitly specify the scripting language to test for'
88
+
89
+ option :test_script_url, short: '-T',
90
+ value: {
91
+ type: String,
92
+ usage: 'URL'
93
+ },
94
+ desc: 'Use an altnerative test script URL'
95
+
96
+ description 'Scans URL(s) for Remote File Inclusion (RFI) vulnerabilities'
97
+
98
+ man_page 'ronin-vulns-rfi.1'
99
+
100
+ #
101
+ # Keyword arguments for `Vulns::RFI.scan` and `Vulns::RFI.test`.
102
+ #
103
+ # @return [Hash{Symbol => Object}]
104
+ #
105
+ def scan_kwargs
106
+ kwargs = super()
107
+
108
+ if options[:filter_bypass]
109
+ kwargs[:filter_bypass] = options[:filter_bypass]
110
+ end
111
+
112
+ if options[:script_lang]
113
+ kwargs[:script_lang] = options[:script_lang]
114
+ end
115
+
116
+ if options[:test_script_url]
117
+ kwargs[:test_script_url] = options[:test_script_url]
118
+ end
119
+
120
+ return kwargs
121
+ end
122
+
123
+ #
124
+ # Scans a URL for RFI vulnerabiltiies.
125
+ #
126
+ # @param [String] url
127
+ # The URL to scan.
128
+ #
129
+ # @yield [vuln]
130
+ # The given block will be passed each discovered RFI vulnerability.
131
+ #
132
+ # @yieldparam [Vulns::RFI] vuln
133
+ # A RFI vulnerability discovered on the URL.
134
+ #
135
+ def scan_url(url,&block)
136
+ Vulns::RFI.scan(url,**scan_kwargs,&block)
137
+ end
138
+
139
+ #
140
+ # Tests a URL for RFI vulnerabiltiies.
141
+ #
142
+ # @param [String] url
143
+ # The URL to test.
144
+ #
145
+ # @return [Vulns::RFI, nil]
146
+ # The first RFI vulnerability discovered on the URL.
147
+ #
148
+ def test_url(url,&block)
149
+ Vulns::RFI.test(url,**scan_kwargs)
150
+ end
151
+
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,316 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-vulns - A Ruby library for blind vulnerability testing.
4
+ #
5
+ # Copyright (c) 2007-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-vulns is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-vulns is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-vulns. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/vulns/cli/web_vuln_command'
22
+ require 'ronin/vulns/url_scanner'
23
+
24
+ module Ronin
25
+ module Vulns
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Scans URL(s) for web vulnerabilities.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-vulns scan [options] {URL ... | --input FILE}
34
+ #
35
+ # ## Options
36
+ #
37
+ # --first Only find the first vulnerability for each URL
38
+ # -A, --all Find all vulnerabilities for each URL
39
+ # -H, --header "Name: value" Sets an additional header
40
+ # -C, --cookie COOKIE Sets the raw Cookie header
41
+ # -c, --cookie-param NAME=VALUE Sets an additional cookie param
42
+ # -R, --referer URL Sets the Referer header
43
+ # -F, --form-param NAME=VALUE Sets an additional form param
44
+ # --test-query-param NAME Tests the URL query param name
45
+ # --test-header-names NAME Tests the HTTP Header name
46
+ # --test-cookie-params NAME Tests the HTTP Cookie name
47
+ # --test-form-params NAME Tests the form param name
48
+ # -i, --input FILE Reads URLs from the list file
49
+ # --lfi-os unix|windows Sets the OS to test for
50
+ # --lfi-depth COUNT Sets the directory depth to escape up
51
+ # --lfi-filter-bypass null_byte|double_escape|base64|rot13|zlib
52
+ # Sets the filter bypass strategy to use
53
+ # --rfi-filter-bypass double-encode|suffix-escape|null-byte
54
+ # Optional filter-bypass strategy to use
55
+ # --rfi-script-lang asp|asp.net|coldfusion|jsp|php|perl
56
+ # Explicitly specify the scripting language to test for
57
+ # --rfi-test-script-url URL Use an altnerative test script URL
58
+ # --sqli-escape-quote Escapes quotation marks
59
+ # --sqli-escape-parens Escapes parenthesis
60
+ # --sqli-terminate Terminates the SQL expression with a --
61
+ # --ssti-test-expr {X*Y | X/Z | X+Y | X-Y}
62
+ # Optional numeric test to use
63
+ # --open-redirect-url URL Optional test URL to try to redirect to
64
+ # -h, --help Print help information
65
+ #
66
+ # ## Arguments
67
+ #
68
+ # [URL ...] The URL(s) to scan
69
+ #
70
+ class Scan < WebVulnCommand
71
+
72
+ usage '[options] {URL ... | --input FILE}'
73
+
74
+ option :lfi_os, value: {
75
+ type: [:unix, :windows]
76
+ },
77
+ desc: 'Sets the OS to test for'
78
+
79
+ option :lfi_depth, value: {
80
+ type: Integer,
81
+ usage: 'COUNT'
82
+ },
83
+ desc: 'Sets the directory depth to escape up'
84
+
85
+ option :lfi_filter_bypass, value: {
86
+ type: [
87
+ :null_byte,
88
+ :double_escape,
89
+ :base64,
90
+ :rot13,
91
+ :zlib
92
+ ]
93
+ },
94
+ desc: 'Sets the filter bypass strategy to use'
95
+
96
+ option :rfi_filter_bypass, value: {
97
+ type: {
98
+ 'double-encode' => :double_encode,
99
+ 'suffix-escape' => :suffix_escape,
100
+ 'null-byte' => :null_byte
101
+ },
102
+ },
103
+ desc: 'Optional filter-bypass strategy to use'
104
+
105
+ option :rfi_script_lang, value: {
106
+ type: {
107
+ 'asp' => :asp,
108
+ 'asp.net' => :asp_net,
109
+ 'coldfusion' => :cold_fusion,
110
+ 'jsp' => :jsp,
111
+ 'php' => :php,
112
+ 'perl' => :perl
113
+ }
114
+ },
115
+ desc: 'Explicitly specify the scripting language to test for'
116
+
117
+ option :rfi_test_script_url, value: {
118
+ type: String,
119
+ usage: 'URL'
120
+ },
121
+ desc: 'Use an altnerative test script URL'
122
+
123
+ option :sqli_escape_quote, desc: 'Escapes quotation marks'
124
+
125
+ option :sqli_escape_parens, desc: 'Escapes parenthesis'
126
+
127
+ option :sqli_terminate, desc: 'Terminates the SQL expression with a --'
128
+
129
+ option :ssti_test_expr, value: {
130
+ type: /\A\d+\s*[\*\/\+\-]\s*\d+\z/,
131
+ usage: '{X*Y | X/Z | X+Y | X-Y}'
132
+ },
133
+ desc: 'Optional numeric test to use' do |expr|
134
+ @ssti_test_expr = Vulns::SSTI::TestExpression.parse(expr)
135
+ end
136
+
137
+ option :open_redirect_url, value: {
138
+ type: String,
139
+ usage: 'URL'
140
+ },
141
+ desc: 'Optional test URL to try to redirect to'
142
+
143
+ description 'Scans URL(s) for web vulnerabilities'
144
+
145
+ man_page 'ronin-vulns-scan.1'
146
+
147
+ #
148
+ # Keyword arguments which will be passed to {URLScanner.scan} or
149
+ # {URLScanner.test} via the `lfi:` keyword.
150
+ #
151
+ # @return [Hash{Symbol => Object}]
152
+ #
153
+ def lfi_kwargs
154
+ kwargs = {}
155
+
156
+ kwargs[:os] = options[:lfi_os] if options[:lfi_os]
157
+ kwargs[:depth] = options[:lfi_depth] if options[:lfi_depth]
158
+
159
+ if options[:lfi_filter_bypass]
160
+ kwargs[:filter_bypass] = options[:lfi_filter_bypass]
161
+ end
162
+
163
+ return kwargs
164
+ end
165
+
166
+ #
167
+ # Keyword arguments which will be passed to {URLScanner.scan} or
168
+ # {URLScanner.test} via the `rfi:` keyword.
169
+ #
170
+ # @return [Hash{Symbol => Object}]
171
+ #
172
+ def rfi_kwargs
173
+ kwargs = {}
174
+
175
+ if options[:rfi_filter_bypass]
176
+ kwargs[:filter_bypass] = options[:rfi_filter_bypass]
177
+ end
178
+
179
+ if options[:rfi_script_lang]
180
+ kwargs[:script_lang] = options[:rfi_script_lang]
181
+ end
182
+
183
+ if options[:rfi_test_script_url]
184
+ kwargs[:test_script_url] = options[:rfi_test_script_url]
185
+ end
186
+
187
+ return kwargs
188
+ end
189
+
190
+ #
191
+ # Keyword arguments which will be passed to {URLScanner.scan} or
192
+ # {URLScanner.test} via the `sqli:` keyword.
193
+ #
194
+ # @return [Hash{Symbol => Object}]
195
+ #
196
+ def sqli_kwargs
197
+ kwargs = {}
198
+
199
+ if options[:sqli_escape_quote]
200
+ kwargs[:escape_quote] = options[:sqli_escape_quote]
201
+ end
202
+
203
+ if options[:sqli_escape_parens]
204
+ kwargs[:escape_parens] = options[:sqli_escape_parens]
205
+ end
206
+
207
+ if options[:sqli_terminate]
208
+ kwargs[:terminate] = options[:sqli_terminate]
209
+ end
210
+
211
+ return kwargs
212
+ end
213
+
214
+ #
215
+ # Keyword arguments which will be passed to {URLScanner.scan} or
216
+ # {URLScanner.test} via the `ssti:` keyword.
217
+ #
218
+ # @return [Hash{Symbol => Object}]
219
+ #
220
+ def ssti_kwargs
221
+ kwargs = {}
222
+
223
+ kwargs[:test_expr] = @ssti_test_expr if @ssti_test_expr
224
+
225
+ return kwargs
226
+ end
227
+
228
+ #
229
+ # Keyword arguments which will be passed to {URLScanner.scan} or
230
+ # {URLScanner.test} via the `open_redirect:` keyword.
231
+ #
232
+ # @return [Hash{Symbol => Object}]
233
+ #
234
+ def open_redirect_kwargs
235
+ kwargs = {}
236
+
237
+ if options[:open_redirect_url]
238
+ kwargs[:test_url] = options[:open_redirect_url]
239
+ end
240
+
241
+ return kwargs
242
+ end
243
+
244
+ #
245
+ # Keyword arguments which will be passed to {URLScanner.scan} or
246
+ # {URLScanner.test} via the `reflected_xss:` keyword.
247
+ #
248
+ # @return [Hash{Symbol => Object}]
249
+ #
250
+ def reflected_xss_kwargs
251
+ {}
252
+ end
253
+
254
+ #
255
+ # Keyword arguments for `Vulns::URLScanner.scan` and
256
+ # `Vulns::URLScanner.test`.
257
+ #
258
+ # @return [Hash{Symbol => Object}]
259
+ #
260
+ def scan_kwargs
261
+ kwargs = super()
262
+
263
+ kwargs[:lfi] = lfi_kwargs
264
+ kwargs[:rfi] = rfi_kwargs
265
+ kwargs[:sqli] = sqli_kwargs
266
+ kwargs[:ssti] = ssti_kwargs
267
+ kwargs[:open_redirect] = open_redirect_kwargs
268
+ kwargs[:reflected_xss] = reflected_xss_kwargs
269
+
270
+ return kwargs
271
+ end
272
+
273
+ #
274
+ # Scans a URL for all web vulnerabiltiies.
275
+ #
276
+ # @param [String] url
277
+ # The URL to scan.
278
+ #
279
+ # @yield [vuln]
280
+ # The given block will be passed each discovered web vulnerability.
281
+ #
282
+ # @yieldparam [Vulns::LFI,
283
+ # Vulns::RFI,
284
+ # Vulns::SQLI,
285
+ # Vulns::SSTI,
286
+ # Vulns::OpenRedirect,
287
+ # Vulns::ReflectedXSS] vuln
288
+ # A LFI vulnerability discovered on the URL.
289
+ #
290
+ def scan_url(url,&block)
291
+ Vulns::URLScanner.scan(url,**scan_kwargs,&block)
292
+ end
293
+
294
+ #
295
+ # Tests a URL for any web vulnerabiltiies.
296
+ #
297
+ # @param [String] url
298
+ # The URL to test.
299
+ #
300
+ # @return [Vulns::LFI,
301
+ # Vulns::RFI,
302
+ # Vulns::SQLI,
303
+ # Vulns::SSTI,
304
+ # Vulns::OpenRedirect,
305
+ # Vulns::ReflectedXSS, nil]
306
+ # The first web vulnerability discovered on the URL.
307
+ #
308
+ def test_url(url,&block)
309
+ Vulns::URLScanner.test(url,**scan_kwargs)
310
+ end
311
+
312
+ end
313
+ end
314
+ end
315
+ end
316
+ end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-vulns - A Ruby library for blind vulnerability testing.
4
+ #
5
+ # Copyright (c) 2007-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-vulns is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-vulns is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-vulns. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/vulns/cli/web_vuln_command'
22
+ require 'ronin/vulns/sqli'
23
+
24
+ module Ronin
25
+ module Vulns
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Scans URL(s) for SQL injection (SQLi) vulnerabilities.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-vulns sqli [options] {URL ... | --input FILE}
34
+ #
35
+ # ## Options
36
+ #
37
+ # --first Only find the first vulnerability for each URL
38
+ # -A, --all Find all vulnerabilities for each URL
39
+ # -H, --header "Name: value" Sets an additional header
40
+ # -C, --cookie COOKIE Sets the raw Cookie header
41
+ # -c, --cookie-param NAME=VALUE Sets an additional cookie param
42
+ # -R, --referer URL Sets the Referer header
43
+ # -F, --form-param NAME=VALUE Sets an additional form param
44
+ # --test-query-param NAME Tests the URL query param name
45
+ # --test-all-query-params Test all URL query param names
46
+ # --test-header-name NAME Tests the HTTP Header name
47
+ # --test-cookie-param NAME Tests the HTTP Cookie name
48
+ # --test-all-cookie-params Test all Cookie param names
49
+ # --test-form-param NAME Tests the form param name
50
+ # -i, --input FILE Reads URLs from the list file
51
+ # -Q, --escape-quote Escapes quotation marks
52
+ # -P, --escape-parens Escapes parenthesis
53
+ # -T, --terminate Terminates the SQL expression with a --
54
+ # -h, --help Print help information
55
+ #
56
+ # ## Arguments
57
+ #
58
+ # [URL ...] The URL(s) to scan
59
+ #
60
+ class Sqli < WebVulnCommand
61
+
62
+ usage '[options] {URL ... | --input FILE}'
63
+
64
+ option :escape_quote, short: '-Q',
65
+ desc: 'Escapes quotation marks'
66
+
67
+ option :escape_parens, short: '-P',
68
+ desc: 'Escapes parenthesis'
69
+
70
+ option :terminate, short: '-T',
71
+ desc: 'Terminates the SQL expression with a --'
72
+
73
+ description 'Scans URL(s) for SQL injection (SQLi) vulnerabilities'
74
+
75
+ man_page 'ronin-vulns-sqli.1'
76
+
77
+ #
78
+ # Keyword arguments for `Vulns::SQLI.scan` and `Vulns::SQLI.test`.
79
+ #
80
+ # @return [Hash{Symbol => Object}]
81
+ #
82
+ def scan_kwargs
83
+ kwargs = super()
84
+
85
+ if options[:escape_quote]
86
+ kwargs[:escape_quote] = options[:escape_quote]
87
+ end
88
+
89
+ if options[:escape_parens]
90
+ kwargs[:escape_parens] = options[:escape_parens]
91
+ end
92
+
93
+ if options[:terminate]
94
+ kwargs[:terminate] = options[:terminate]
95
+ end
96
+
97
+ return kwargs
98
+ end
99
+
100
+ #
101
+ # Scans a URL for SQLi vulnerabiltiies.
102
+ #
103
+ # @param [String] url
104
+ # The URL to scan.
105
+ #
106
+ # @yield [vuln]
107
+ # The given block will be passed each discovered SQLi vulnerability.
108
+ #
109
+ # @yieldparam [Vulns::SQLI] vuln
110
+ # A SQLi vulnerability discovered on the URL.
111
+ #
112
+ def scan_url(url,&block)
113
+ Vulns::SQLI.scan(url,**scan_kwargs,&block)
114
+ end
115
+
116
+ #
117
+ # Tests a URL for SQLi vulnerabiltiies.
118
+ #
119
+ # @param [String] url
120
+ # The URL to test.
121
+ #
122
+ # @return [Vulns::SQLI, nil]
123
+ # The first SQLi vulnerability discovered on the URL.
124
+ #
125
+ def test_url(url,&block)
126
+ Vulns::SQLI.test(url,**scan_kwargs)
127
+ end
128
+
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end