wpscan 3.5.0 → 3.5.1
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.
- checksums.yaml +4 -4
- data/app/controllers/core.rb +12 -9
- data/app/controllers/custom_directories.rb +2 -2
- data/app/controllers/enumeration.rb +1 -1
- data/app/controllers/enumeration/enum_methods.rb +18 -18
- data/app/controllers/main_theme.rb +2 -2
- data/app/controllers/password_attack.rb +7 -7
- data/app/controllers/wp_version.rb +2 -2
- data/app/finders/interesting_findings/emergency_pwd_reset_script.rb +1 -1
- data/app/finders/interesting_findings/mu_plugins.rb +2 -2
- data/app/finders/users/author_id_brute_forcing.rb +7 -2
- data/app/finders/users/author_posts.rb +1 -1
- data/app/models/timthumb.rb +1 -1
- data/lib/wpscan.rb +1 -0
- data/lib/wpscan/browser.rb +0 -5
- data/lib/wpscan/db/updater.rb +3 -3
- data/lib/wpscan/parsed_cli.rb +7 -0
- data/lib/wpscan/target/platform/wordpress.rb +29 -1
- data/lib/wpscan/target/platform/wordpress/custom_directories.rb +2 -2
- data/lib/wpscan/version.rb +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4413068dee1847959f5b7af58b99c89ebef29818b654f3dd85a2f381d6972813
|
4
|
+
data.tar.gz: 42ee69a95fec668215c4979ef516305b68d06c04f07dbeb2b991d33044f6e676
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e4ef3233047f35cafa1bd25de163e1f77f5f17c17bde45be5a5582fa8ba3d51705e4b96a0f53041472e85fe82c26ca340b911a29427b95e7abf9ca04b118d08
|
7
|
+
data.tar.gz: 5969b2f008d030f3528ad776f3791fba42d6a118105e28cbc5973faef64cd723a85f9085cf5460703e2fd36519b9fa4471746e934d930c9401f516b5131a7377
|
data/app/controllers/core.rb
CHANGED
@@ -27,38 +27,41 @@ module WPScan
|
|
27
27
|
# @return [ Boolean ]
|
28
28
|
def update_db_required?
|
29
29
|
if local_db.missing_files?
|
30
|
-
raise Error::MissingDatabaseFile if
|
30
|
+
raise Error::MissingDatabaseFile if ParsedCli.update == false
|
31
31
|
|
32
32
|
return true
|
33
33
|
end
|
34
34
|
|
35
|
-
return
|
35
|
+
return ParsedCli.update unless ParsedCli.update.nil?
|
36
36
|
|
37
37
|
return false unless user_interaction? && local_db.outdated?
|
38
38
|
|
39
39
|
output('@notice', msg: 'It seems like you have not updated the database for some time.')
|
40
40
|
print '[?] Do you want to update now? [Y]es [N]o, default: [N]'
|
41
41
|
|
42
|
-
|
42
|
+
/^y/i.match?(Readline.readline) ? true : false
|
43
43
|
end
|
44
44
|
|
45
45
|
def update_db
|
46
46
|
output('db_update_started')
|
47
|
-
output('db_update_finished', updated: local_db.update, verbose:
|
47
|
+
output('db_update_finished', updated: local_db.update, verbose: ParsedCli.verbose)
|
48
48
|
|
49
|
-
exit(0) unless
|
49
|
+
exit(0) unless ParsedCli.url
|
50
50
|
end
|
51
51
|
|
52
52
|
def before_scan
|
53
53
|
@last_update = local_db.last_update
|
54
54
|
|
55
|
-
maybe_output_banner_help_and_version # From
|
55
|
+
maybe_output_banner_help_and_version # From CMSScanner
|
56
56
|
|
57
57
|
update_db if update_db_required?
|
58
58
|
setup_cache
|
59
59
|
check_target_availability
|
60
60
|
load_server_module
|
61
61
|
check_wordpress_state
|
62
|
+
rescue Error::NotWordPress => e
|
63
|
+
target.maybe_add_cookies
|
64
|
+
raise e unless target.wordpress?(ParsedCli.detection_mode)
|
62
65
|
end
|
63
66
|
|
64
67
|
# Raises errors if the target is hosted on wordpress.com or is not running WordPress
|
@@ -66,14 +69,14 @@ module WPScan
|
|
66
69
|
def check_wordpress_state
|
67
70
|
raise Error::WordPressHosted if target.wordpress_hosted?
|
68
71
|
|
69
|
-
if
|
72
|
+
if %r{/wp-admin/install.php$}i.match?(Addressable::URI.parse(target.homepage_url).path)
|
70
73
|
|
71
74
|
output('not_fully_configured', url: target.homepage_url)
|
72
75
|
|
73
76
|
exit(WPScan::ExitCode::VULNERABLE)
|
74
77
|
end
|
75
78
|
|
76
|
-
raise Error::NotWordPress unless target.wordpress?(
|
79
|
+
raise Error::NotWordPress unless target.wordpress?(ParsedCli.detection_mode) || ParsedCli.force
|
77
80
|
end
|
78
81
|
|
79
82
|
# Loads the related server module in the target
|
@@ -85,7 +88,7 @@ module WPScan
|
|
85
88
|
server = target.server || :Apache # Tries to auto detect the server
|
86
89
|
|
87
90
|
# Force a specific server module to be loaded if supplied
|
88
|
-
case
|
91
|
+
case ParsedCli.server
|
89
92
|
when :apache
|
90
93
|
server = :Apache
|
91
94
|
when :iis
|
@@ -13,8 +13,8 @@ module WPScan
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def before_scan
|
16
|
-
target.content_dir =
|
17
|
-
target.plugins_dir =
|
16
|
+
target.content_dir = ParsedCli.wp_content_dir if ParsedCli.wp_content_dir
|
17
|
+
target.plugins_dir = ParsedCli.wp_plugins_dir if ParsedCli.wp_plugins_dir
|
18
18
|
|
19
19
|
return if target.content_dir
|
20
20
|
|
@@ -7,13 +7,13 @@ module WPScan
|
|
7
7
|
# @param [ String ] type (plugins or themes)
|
8
8
|
# @param [ Symbol ] detection_mode
|
9
9
|
#
|
10
|
-
# @return [ String ] The related enumration message depending on the
|
10
|
+
# @return [ String ] The related enumration message depending on the ParsedCli and type supplied
|
11
11
|
def enum_message(type, detection_mode)
|
12
12
|
return unless %w[plugins themes].include?(type)
|
13
13
|
|
14
|
-
details = if
|
14
|
+
details = if ParsedCli.enumerate[:"vulnerable_#{type}"]
|
15
15
|
'Vulnerable'
|
16
|
-
elsif
|
16
|
+
elsif ParsedCli.enumerate[:"all_#{type}"]
|
17
17
|
'All'
|
18
18
|
else
|
19
19
|
'Most Popular'
|
@@ -39,15 +39,15 @@ module WPScan
|
|
39
39
|
#
|
40
40
|
# @return [ Hash ]
|
41
41
|
def default_opts(type)
|
42
|
-
mode =
|
42
|
+
mode = ParsedCli.options[:"#{type}_detection"] || ParsedCli.detection_mode
|
43
43
|
|
44
44
|
{
|
45
45
|
mode: mode,
|
46
|
-
exclude_content:
|
46
|
+
exclude_content: ParsedCli.exclude_content_based,
|
47
47
|
show_progression: user_interaction?,
|
48
48
|
version_detection: {
|
49
|
-
mode:
|
50
|
-
confidence_threshold:
|
49
|
+
mode: ParsedCli.options[:"#{type}_version_detection"] || mode,
|
50
|
+
confidence_threshold: ParsedCli.options[:"#{type}_version_all"] ? 0 : 100
|
51
51
|
}
|
52
52
|
}
|
53
53
|
end
|
@@ -61,7 +61,7 @@ module WPScan
|
|
61
61
|
|
62
62
|
def enum_plugins
|
63
63
|
opts = default_opts('plugins').merge(
|
64
|
-
list: plugins_list_from_opts(
|
64
|
+
list: plugins_list_from_opts(ParsedCli.options),
|
65
65
|
sort: true
|
66
66
|
)
|
67
67
|
|
@@ -77,7 +77,7 @@ module WPScan
|
|
77
77
|
|
78
78
|
plugins.each(&:version)
|
79
79
|
|
80
|
-
plugins.select!(&:vulnerable?) if
|
80
|
+
plugins.select!(&:vulnerable?) if ParsedCli.enumerate[:vulnerable_plugins]
|
81
81
|
|
82
82
|
output('plugins', plugins: plugins)
|
83
83
|
end
|
@@ -107,7 +107,7 @@ module WPScan
|
|
107
107
|
|
108
108
|
def enum_themes
|
109
109
|
opts = default_opts('themes').merge(
|
110
|
-
list: themes_list_from_opts(
|
110
|
+
list: themes_list_from_opts(ParsedCli.options),
|
111
111
|
sort: true
|
112
112
|
)
|
113
113
|
|
@@ -123,7 +123,7 @@ module WPScan
|
|
123
123
|
|
124
124
|
themes.each(&:version)
|
125
125
|
|
126
|
-
themes.select!(&:vulnerable?) if
|
126
|
+
themes.select!(&:vulnerable?) if ParsedCli.enumerate[:vulnerable_themes]
|
127
127
|
|
128
128
|
output('themes', themes: themes)
|
129
129
|
end
|
@@ -145,28 +145,28 @@ module WPScan
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def enum_timthumbs
|
148
|
-
opts = default_opts('timthumbs').merge(list:
|
148
|
+
opts = default_opts('timthumbs').merge(list: ParsedCli.timthumbs_list)
|
149
149
|
|
150
150
|
output('@info', msg: "Enumerating Timthumbs #{enum_detection_message(opts[:mode])}") if user_interaction?
|
151
151
|
output('timthumbs', timthumbs: target.timthumbs(opts))
|
152
152
|
end
|
153
153
|
|
154
154
|
def enum_config_backups
|
155
|
-
opts = default_opts('config_backups').merge(list:
|
155
|
+
opts = default_opts('config_backups').merge(list: ParsedCli.config_backups_list)
|
156
156
|
|
157
157
|
output('@info', msg: "Enumerating Config Backups #{enum_detection_message(opts[:mode])}") if user_interaction?
|
158
158
|
output('config_backups', config_backups: target.config_backups(opts))
|
159
159
|
end
|
160
160
|
|
161
161
|
def enum_db_exports
|
162
|
-
opts = default_opts('db_exports').merge(list:
|
162
|
+
opts = default_opts('db_exports').merge(list: ParsedCli.db_exports_list)
|
163
163
|
|
164
164
|
output('@info', msg: "Enumerating DB Exports #{enum_detection_message(opts[:mode])}") if user_interaction?
|
165
165
|
output('db_exports', db_exports: target.db_exports(opts))
|
166
166
|
end
|
167
167
|
|
168
168
|
def enum_medias
|
169
|
-
opts = default_opts('medias').merge(range:
|
169
|
+
opts = default_opts('medias').merge(range: ParsedCli.enumerate[:medias])
|
170
170
|
|
171
171
|
if user_interaction?
|
172
172
|
output('@info',
|
@@ -181,13 +181,13 @@ module WPScan
|
|
181
181
|
#
|
182
182
|
# @return [ Boolean ] Wether or not to enumerate the users
|
183
183
|
def enum_users?(opts)
|
184
|
-
opts[:users] || (
|
184
|
+
opts[:users] || (ParsedCli.passwords && !ParsedCli.username && !ParsedCli.usernames)
|
185
185
|
end
|
186
186
|
|
187
187
|
def enum_users
|
188
188
|
opts = default_opts('users').merge(
|
189
189
|
range: enum_users_range,
|
190
|
-
list:
|
190
|
+
list: ParsedCli.users_list
|
191
191
|
)
|
192
192
|
|
193
193
|
output('@info', msg: "Enumerating Users #{enum_detection_message(opts[:mode])}") if user_interaction?
|
@@ -198,7 +198,7 @@ module WPScan
|
|
198
198
|
# If the --enumerate is used, the default value is handled by the Option
|
199
199
|
# However, when using --passwords alone, the default has to be set by the code below
|
200
200
|
def enum_users_range
|
201
|
-
|
201
|
+
ParsedCli.enumerate[:users] || cli_enum_choices[0].choices[:u].validate(nil)
|
202
202
|
end
|
203
203
|
end
|
204
204
|
end
|
@@ -18,9 +18,9 @@ module WPScan
|
|
18
18
|
output(
|
19
19
|
'theme',
|
20
20
|
theme: target.main_theme(
|
21
|
-
mode:
|
21
|
+
mode: ParsedCli.main_theme_detection || ParsedCli.detection_mode
|
22
22
|
),
|
23
|
-
verbose:
|
23
|
+
verbose: ParsedCli.verbose
|
24
24
|
)
|
25
25
|
end
|
26
26
|
end
|
@@ -24,7 +24,7 @@ module WPScan
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def run
|
27
|
-
return unless
|
27
|
+
return unless ParsedCli.passwords
|
28
28
|
|
29
29
|
if user_interaction?
|
30
30
|
output('@info',
|
@@ -33,13 +33,13 @@ module WPScan
|
|
33
33
|
|
34
34
|
attack_opts = {
|
35
35
|
show_progression: user_interaction?,
|
36
|
-
multicall_max_passwords:
|
36
|
+
multicall_max_passwords: ParsedCli.multicall_max_passwords
|
37
37
|
}
|
38
38
|
|
39
39
|
begin
|
40
40
|
found = []
|
41
41
|
|
42
|
-
attacker.attack(users, passwords(
|
42
|
+
attacker.attack(users, passwords(ParsedCli.passwords), attack_opts) do |user|
|
43
43
|
found << user
|
44
44
|
|
45
45
|
attacker.progress_bar.log("[SUCCESS] - #{user.username} / #{user.password}")
|
@@ -61,9 +61,9 @@ module WPScan
|
|
61
61
|
|
62
62
|
# @return [ CMSScanner::Finders::Finder ]
|
63
63
|
def attacker_from_cli_options
|
64
|
-
return unless
|
64
|
+
return unless ParsedCli.password_attack
|
65
65
|
|
66
|
-
case
|
66
|
+
case ParsedCli.password_attack
|
67
67
|
when :wp_login
|
68
68
|
WPScan::Finders::Passwords::WpLogin.new(target)
|
69
69
|
when :xmlrpc
|
@@ -94,9 +94,9 @@ module WPScan
|
|
94
94
|
|
95
95
|
# @return [ Array<Users> ] The users to brute force
|
96
96
|
def users
|
97
|
-
return target.users unless
|
97
|
+
return target.users unless ParsedCli.usernames
|
98
98
|
|
99
|
-
|
99
|
+
ParsedCli.usernames.reduce([]) do |acc, elem|
|
100
100
|
acc << Model::User.new(elem.chomp)
|
101
101
|
end
|
102
102
|
end
|
@@ -24,8 +24,8 @@ module WPScan
|
|
24
24
|
output(
|
25
25
|
'version',
|
26
26
|
version: target.wp_version(
|
27
|
-
mode:
|
28
|
-
confidence_threshold:
|
27
|
+
mode: ParsedCli.wp_version_detection || ParsedCli.detection_mode,
|
28
|
+
confidence_threshold: ParsedCli.wp_version_all ? 0 : 100,
|
29
29
|
show_progression: user_interaction?
|
30
30
|
)
|
31
31
|
)
|
@@ -14,7 +14,7 @@ module WPScan
|
|
14
14
|
|
15
15
|
Model::EmergencyPwdResetScript.new(
|
16
16
|
target.url(path),
|
17
|
-
confidence:
|
17
|
+
confidence: /password/i.match?(res.body) ? 100 : 40,
|
18
18
|
found_by: DIRECT_ACCESS,
|
19
19
|
references: {
|
20
20
|
url: 'https://codex.wordpress.org/Resetting_Your_Password#Using_the_Emergency_Password_Reset_Script'
|
@@ -14,6 +14,8 @@ module WPScan
|
|
14
14
|
|
15
15
|
url = target.url('wp-content/mu-plugins/')
|
16
16
|
|
17
|
+
target.mu_plugins = true
|
18
|
+
|
17
19
|
return Model::MuPlugins.new(
|
18
20
|
url,
|
19
21
|
confidence: 70,
|
@@ -33,8 +35,6 @@ module WPScan
|
|
33
35
|
return unless [200, 401, 403].include?(res.code)
|
34
36
|
return if target.homepage_or_404?(res)
|
35
37
|
|
36
|
-
# TODO: add the check for --exclude-content once implemented ?
|
37
|
-
|
38
38
|
target.mu_plugins = true
|
39
39
|
|
40
40
|
Model::MuPlugins.new(
|
@@ -7,6 +7,11 @@ module WPScan
|
|
7
7
|
class AuthorIdBruteForcing < CMSScanner::Finders::Finder
|
8
8
|
include CMSScanner::Finders::Finder::Enumerator
|
9
9
|
|
10
|
+
# @return [ Array<Integer> ]
|
11
|
+
def valid_response_codes
|
12
|
+
@valid_response_codes ||= [200, 301, 302]
|
13
|
+
end
|
14
|
+
|
10
15
|
# @param [ Hash ] opts
|
11
16
|
# @option opts [ Range ] :range Mandatory
|
12
17
|
#
|
@@ -15,7 +20,7 @@ module WPScan
|
|
15
20
|
found = []
|
16
21
|
found_by_msg = 'Author Id Brute Forcing - %s (Aggressive Detection)'
|
17
22
|
|
18
|
-
enumerate(target_urls(opts), opts) do |res, id|
|
23
|
+
enumerate(target_urls(opts), opts.merge(check_full_response: true)) do |res, id|
|
19
24
|
username, found_by, confidence = potential_username(res)
|
20
25
|
|
21
26
|
next unless username
|
@@ -49,7 +54,7 @@ module WPScan
|
|
49
54
|
super(opts.merge(title: ' Brute Forcing Author IDs -'))
|
50
55
|
end
|
51
56
|
|
52
|
-
def
|
57
|
+
def full_request_params
|
53
58
|
{ followlocation: true }
|
54
59
|
end
|
55
60
|
|
@@ -50,7 +50,7 @@ module WPScan
|
|
50
50
|
|
51
51
|
if uri.path =~ %r{/author/([^/\b]+)/?\z}i
|
52
52
|
usernames << [Regexp.last_match[1], 'Author Pattern', 100]
|
53
|
-
elsif
|
53
|
+
elsif /author=[0-9]+/.match?(uri.query)
|
54
54
|
usernames << [node.text.to_s.strip, 'Display Name', 30]
|
55
55
|
end
|
56
56
|
end
|
data/app/models/timthumb.rb
CHANGED
@@ -63,7 +63,7 @@ module WPScan
|
|
63
63
|
def webshot_enabled?
|
64
64
|
res = Browser.get(url, params: { webshot: 1, src: "http://#{default_allowed_domains.sample}" })
|
65
65
|
|
66
|
-
|
66
|
+
/WEBSHOT_ENABLED == true/.match?(res.body) ? false : true
|
67
67
|
end
|
68
68
|
|
69
69
|
# @return [ Array<String> ] The default allowed domains (between the 2.0 and 2.8.13)
|
data/lib/wpscan.rb
CHANGED
data/lib/wpscan/browser.rb
CHANGED
@@ -5,11 +5,6 @@ module WPScan
|
|
5
5
|
class Browser < CMSScanner::Browser
|
6
6
|
extend Actions
|
7
7
|
|
8
|
-
# @return [ String ] The path to the user agents list
|
9
|
-
def user_agents_list
|
10
|
-
@user_agents_list ||= DB_DIR.join('user-agents.txt').to_s
|
11
|
-
end
|
12
|
-
|
13
8
|
# @return [ String ]
|
14
9
|
def default_user_agent
|
15
10
|
"WPScan v#{VERSION} (https://wpscan.org/)"
|
data/lib/wpscan/db/updater.rb
CHANGED
@@ -8,11 +8,11 @@ module WPScan
|
|
8
8
|
# /!\ Might want to also update the Enumeration#cli_options when some filenames are changed here
|
9
9
|
FILES = %w[
|
10
10
|
plugins.json themes.json wordpresses.json
|
11
|
-
timthumbs-v3.txt
|
12
|
-
|
11
|
+
timthumbs-v3.txt config_backups.txt db_exports.txt
|
12
|
+
dynamic_finders.yml wp_fingerprints.json LICENSE
|
13
13
|
].freeze
|
14
14
|
|
15
|
-
OLD_FILES = %w[wordpress.db dynamic_finders_01.yml].freeze
|
15
|
+
OLD_FILES = %w[wordpress.db user-agents.txt dynamic_finders_01.yml].freeze
|
16
16
|
|
17
17
|
attr_reader :repo_directory
|
18
18
|
|
@@ -45,13 +45,41 @@ module WPScan
|
|
45
45
|
false
|
46
46
|
end
|
47
47
|
|
48
|
+
COOKIE_PATTERNS = {
|
49
|
+
'vjs' => /createCookie\('vjs','(?<c_value>\d+)',\d+\);/i
|
50
|
+
}.freeze
|
51
|
+
|
52
|
+
# Sometimes there is a mechanism in place on the blog, which requires a specific
|
53
|
+
# cookie and value to be added to requests. Lets try to detect and add them
|
54
|
+
def maybe_add_cookies
|
55
|
+
COOKIE_PATTERNS.each do |cookie_key, pattern|
|
56
|
+
next unless homepage_res.body =~ pattern
|
57
|
+
|
58
|
+
browser = Browser.instance
|
59
|
+
|
60
|
+
cookie_string = "#{cookie_key}=#{Regexp.last_match[:c_value]}"
|
61
|
+
|
62
|
+
cookie_string += "; #{browser.cookie_string}" if browser.cookie_string
|
63
|
+
|
64
|
+
browser.cookie_string = cookie_string
|
65
|
+
|
66
|
+
# Force recheck of the homepage when retying wordpress?
|
67
|
+
# No need to clear the cache, as the request (which will contain the cookies)
|
68
|
+
# will be different
|
69
|
+
@homepage_res = nil
|
70
|
+
@homepage_url = nil
|
71
|
+
|
72
|
+
break
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
48
76
|
# @return [ String ]
|
49
77
|
def registration_url
|
50
78
|
multisite? ? url('wp-signup.php') : url('wp-login.php?action=register')
|
51
79
|
end
|
52
80
|
|
53
81
|
def wordpress_hosted?
|
54
|
-
|
82
|
+
/\.wordpress\.com$/i.match?(uri.host) ? true : false
|
55
83
|
end
|
56
84
|
|
57
85
|
# @param [ String ] username
|
@@ -112,9 +112,9 @@ module WPScan
|
|
112
112
|
def url(path = nil)
|
113
113
|
return @uri.to_s unless path
|
114
114
|
|
115
|
-
if
|
115
|
+
if %r{wp\-content/plugins}i.match?(path)
|
116
116
|
path = +path.gsub('wp-content/plugins', plugins_dir)
|
117
|
-
elsif
|
117
|
+
elsif /wp\-content/i.match?(path)
|
118
118
|
path = +path.gsub('wp-content', content_dir)
|
119
119
|
elsif path[0] != '/' && sub_dir
|
120
120
|
path = "#{sub_dir}/#{path}"
|
data/lib/wpscan/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wpscan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.5.
|
4
|
+
version: 3.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- WPScanTeam
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cms_scanner
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.44.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.44.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.67.1
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.67.1
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: simplecov
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -342,6 +342,7 @@ files:
|
|
342
342
|
- lib/wpscan/finders/dynamic_finder/wp_version.rb
|
343
343
|
- lib/wpscan/finders/finder/wp_version/smart_url_checker.rb
|
344
344
|
- lib/wpscan/helper.rb
|
345
|
+
- lib/wpscan/parsed_cli.rb
|
345
346
|
- lib/wpscan/references.rb
|
346
347
|
- lib/wpscan/target.rb
|
347
348
|
- lib/wpscan/target/platform/wordpress.rb
|
@@ -361,7 +362,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
361
362
|
requirements:
|
362
363
|
- - ">="
|
363
364
|
- !ruby/object:Gem::Version
|
364
|
-
version: '2.
|
365
|
+
version: '2.4'
|
365
366
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
366
367
|
requirements:
|
367
368
|
- - ">="
|