wpscan 3.0.8 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/app/controllers.rb +1 -0
- data/app/controllers/aliases.rb +12 -0
- data/app/controllers/core.rb +3 -5
- data/app/controllers/enumeration.rb +2 -28
- data/app/controllers/enumeration/enum_methods.rb +12 -2
- data/app/controllers/wp_version.rb +4 -0
- data/app/finders/main_theme/css_style.rb +2 -2
- data/app/finders/main_theme/urls_in_homepage.rb +3 -3
- data/app/finders/plugin_version.rb +1 -8
- data/app/finders/plugins.rb +13 -4
- data/app/finders/plugins/body_pattern.rb +27 -0
- data/app/finders/plugins/comment.rb +31 -0
- data/app/finders/plugins/config_parser.rb +31 -0
- data/app/finders/plugins/header_pattern.rb +41 -0
- data/app/finders/plugins/javascript_var.rb +29 -0
- data/app/finders/plugins/known_locations.rb +5 -5
- data/app/finders/plugins/query_parameter.rb +25 -0
- data/app/finders/plugins/urls_in_homepage.rb +4 -8
- data/app/finders/plugins/xpath.rb +29 -0
- data/app/finders/theme_version.rb +1 -1
- data/app/finders/theme_version/woo_framework_meta_generator.rb +2 -2
- data/app/finders/themes/known_locations.rb +5 -5
- data/app/finders/themes/urls_in_homepage.rb +2 -2
- data/app/finders/users/login_error_messages.rb +1 -4
- data/app/finders/users/wp_json_api.rb +2 -2
- data/app/finders/wp_items/urls_in_homepage.rb +1 -1
- data/app/finders/wp_version.rb +21 -18
- data/app/models/plugin.rb +4 -4
- data/app/models/theme.rb +6 -6
- data/app/models/timthumb.rb +1 -3
- data/app/models/wp_item.rb +15 -15
- data/app/views/json/enumeration/plugins.erb +1 -1
- data/app/views/json/enumeration/themes.erb +1 -1
- data/app/views/json/wp_item.erb +1 -1
- data/bin/wpscan +2 -1
- data/lib/wpscan/db.rb +14 -10
- data/lib/wpscan/db/dynamic_finders/base.rb +41 -0
- data/lib/wpscan/db/dynamic_finders/plugin.rb +111 -0
- data/lib/wpscan/db/dynamic_finders/theme.rb +16 -0
- data/lib/wpscan/db/dynamic_finders/wordpress.rb +75 -0
- data/lib/wpscan/db/updater.rb +2 -2
- data/lib/wpscan/finders.rb +13 -1
- data/lib/wpscan/finders/dynamic_finder/finder.rb +66 -0
- data/lib/wpscan/finders/dynamic_finder/version/body_pattern.rb +28 -0
- data/lib/wpscan/finders/dynamic_finder/version/comment.rb +16 -0
- data/lib/wpscan/finders/dynamic_finder/version/config_parser.rb +52 -0
- data/lib/wpscan/finders/dynamic_finder/version/finder.rb +29 -0
- data/lib/wpscan/finders/dynamic_finder/version/header_pattern.rb +28 -0
- data/lib/wpscan/finders/dynamic_finder/version/javascript_var.rb +56 -0
- data/lib/wpscan/finders/dynamic_finder/version/query_parameter.rb +62 -0
- data/lib/wpscan/finders/dynamic_finder/version/xpath.rb +34 -0
- data/lib/wpscan/finders/dynamic_finder/wp_item_version.rb +42 -0
- data/lib/wpscan/finders/dynamic_finder/wp_items/finder.rb +96 -0
- data/lib/wpscan/finders/dynamic_finder/wp_version.rb +60 -0
- data/lib/wpscan/helper.rb +11 -0
- data/lib/wpscan/target/platform/wordpress/custom_directories.rb +16 -1
- data/lib/wpscan/version.rb +1 -1
- metadata +32 -24
- data/app/finders/plugin_version/layer_slider/translation_file.rb +0 -40
- data/app/finders/plugin_version/revslider/release_log.rb +0 -35
- data/app/finders/plugin_version/shareaholic/meta_tag.rb +0 -27
- data/app/finders/plugin_version/sitepress_multilingual_cms/meta_generator.rb +0 -27
- data/app/finders/plugin_version/sitepress_multilingual_cms/version_parameter.rb +0 -31
- data/app/finders/plugin_version/w3_total_cache/headers.rb +0 -28
- data/app/finders/plugins/comments.rb +0 -31
- data/app/finders/plugins/headers.rb +0 -36
- data/app/finders/wp_version/homepage_stylesheet_numbers.rb +0 -59
- data/app/finders/wp_version/install_stylesheet_numbers.rb +0 -16
- data/app/finders/wp_version/meta_generator.rb +0 -27
- data/app/finders/wp_version/opml_generator.rb +0 -23
- data/app/finders/wp_version/sitemap_generator.rb +0 -23
- data/app/finders/wp_version/upgrade_stylesheet_numbers.rb +0 -13
- data/lib/wpscan/db/dynamic_finders.rb +0 -55
- data/lib/wpscan/finders/finder/plugin_version/comments.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 247fd91f253010fbefa767737b15d9abce9abdc5
|
4
|
+
data.tar.gz: bf4527c1501a3b641a4a242043baf8d302e0e5e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f7ae471f65c4abab39653e95153a10c5893f7995f64b403bb9e4bac6748e93394daa4db9e4e2175293165dee60813a168af7f8043cbd249232a1b6abec00cfd
|
7
|
+
data.tar.gz: 86c27e7770b2674f286fcf55d49fe6b0cb2540d0a24a790e80c268b9901ab00cfd0d0e793ae294aebda586f414212a5077a1f58b489b272413c672833118dcab
|
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
WPScan Public Source License
|
2
2
|
|
3
|
-
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-
|
3
|
+
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2018 WPScan Team.
|
4
4
|
|
5
5
|
Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
|
6
6
|
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
## WPScan Public Source License
|
11
11
|
|
12
|
-
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-
|
12
|
+
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2018 WPScan Team.
|
13
13
|
|
14
14
|
Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
|
15
15
|
|
data/app/controllers.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Controller
|
3
|
+
# Controller to add the aliases in the CLI
|
4
|
+
class Aliases < CMSScanner::Controller::Base
|
5
|
+
def cli_options
|
6
|
+
[
|
7
|
+
OptAlias.new(['--stealthy'], alias_for: '--random-user-agent --detection-mode passive')
|
8
|
+
]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/app/controllers/core.rb
CHANGED
@@ -46,14 +46,12 @@ module WPScan
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def before_scan
|
49
|
-
output('banner')
|
49
|
+
output('banner') unless parsed_options[:banner] == false
|
50
50
|
|
51
51
|
update_db if update_db_required?
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
setup_cache
|
53
|
+
check_target_availability
|
55
54
|
load_server_module
|
56
|
-
|
57
55
|
check_wordpress_state
|
58
56
|
end
|
59
57
|
|
@@ -6,34 +6,8 @@ module WPScan
|
|
6
6
|
# Enumeration Controller
|
7
7
|
class Enumeration < CMSScanner::Controller::Base
|
8
8
|
def before_scan
|
9
|
-
|
10
|
-
DB::
|
11
|
-
%w[Comments].each do |klass|
|
12
|
-
next unless config[klass] && config[klass]['version']
|
13
|
-
|
14
|
-
constant_name = name.tr('-', '_').camelize
|
15
|
-
|
16
|
-
unless Finders::PluginVersion.constants.include?(constant_name.to_sym)
|
17
|
-
Finders::PluginVersion.const_set(constant_name, Module.new)
|
18
|
-
end
|
19
|
-
|
20
|
-
mod = WPScan::Finders::PluginVersion.const_get(constant_name)
|
21
|
-
|
22
|
-
raise "#{mod} has already a #{klass} class" if mod.constants.include?(klass.to_sym)
|
23
|
-
|
24
|
-
case klass
|
25
|
-
when 'Comments' then create_plugins_comments_finders(mod, config[klass])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def create_plugins_comments_finders(mod, config)
|
32
|
-
mod.const_set(
|
33
|
-
:Comments, Class.new(Finders::Finder::PluginVersion::Comments) do
|
34
|
-
const_set(:PATTERN, config['pattern'])
|
35
|
-
end
|
36
|
-
)
|
9
|
+
DB::DynamicFinders::Plugin.create_versions_finders
|
10
|
+
DB::DynamicFinders::Theme.create_versions_finders
|
37
11
|
end
|
38
12
|
|
39
13
|
def run
|
@@ -52,7 +52,12 @@ module WPScan
|
|
52
52
|
output('@info', msg: enum_message('plugins')) if user_interaction?
|
53
53
|
# Enumerate the plugins & find their versions to avoid doing that when #version
|
54
54
|
# is called in the view
|
55
|
-
plugins = target.plugins(opts)
|
55
|
+
plugins = target.plugins(opts)
|
56
|
+
|
57
|
+
output('@info', msg: 'Checking Plugin Versions') if user_interaction? && !plugins.empty?
|
58
|
+
|
59
|
+
plugins.each(&:version)
|
60
|
+
|
56
61
|
plugins.select!(&:vulnerable?) if parsed_options[:enumerate][:vulnerable_plugins]
|
57
62
|
|
58
63
|
output('plugins', plugins: plugins)
|
@@ -90,7 +95,12 @@ module WPScan
|
|
90
95
|
output('@info', msg: enum_message('themes')) if user_interaction?
|
91
96
|
# Enumerate the themes & find their versions to avoid doing that when #version
|
92
97
|
# is called in the view
|
93
|
-
themes = target.themes(opts)
|
98
|
+
themes = target.themes(opts)
|
99
|
+
|
100
|
+
output('@info', msg: 'Checking Theme Versions') if user_interaction? && !themes.empty?
|
101
|
+
|
102
|
+
themes.each(&:version)
|
103
|
+
|
94
104
|
themes.select!(&:vulnerable?) if parsed_options[:enumerate][:vulnerable_themes]
|
95
105
|
|
96
106
|
output('themes', themes: themes)
|
@@ -5,9 +5,9 @@ module WPScan
|
|
5
5
|
class CssStyle < CMSScanner::Finders::Finder
|
6
6
|
include Finders::WpItems::URLsInHomepage
|
7
7
|
|
8
|
-
def create_theme(
|
8
|
+
def create_theme(slug, style_url, opts)
|
9
9
|
WPScan::Theme.new(
|
10
|
-
|
10
|
+
slug,
|
11
11
|
target,
|
12
12
|
opts.merge(found_by: found_by, confidence: 70, style_url: style_url)
|
13
13
|
)
|
@@ -11,10 +11,10 @@ module WPScan
|
|
11
11
|
def passive(opts = {})
|
12
12
|
found = []
|
13
13
|
|
14
|
-
|
14
|
+
slugs = items_from_links('themes', false) + items_from_codes('themes', false)
|
15
15
|
|
16
|
-
|
17
|
-
found << WPScan::Theme.new(
|
16
|
+
slugs.each_with_object(Hash.new(0)) { |slug, counts| counts[slug] += 1 }.each do |slug, occurences|
|
17
|
+
found << WPScan::Theme.new(slug, target, opts.merge(found_by: found_by, confidence: 2 * occurences))
|
18
18
|
end
|
19
19
|
|
20
20
|
found
|
@@ -1,11 +1,4 @@
|
|
1
1
|
require_relative 'plugin_version/readme'
|
2
|
-
# Plugins Specific
|
3
|
-
require_relative 'plugin_version/layer_slider/translation_file'
|
4
|
-
require_relative 'plugin_version/revslider/release_log'
|
5
|
-
require_relative 'plugin_version/sitepress_multilingual_cms/version_parameter'
|
6
|
-
require_relative 'plugin_version/sitepress_multilingual_cms/meta_generator'
|
7
|
-
require_relative 'plugin_version/w3_total_cache/headers'
|
8
|
-
require_relative 'plugin_version/shareaholic/meta_tag'
|
9
2
|
|
10
3
|
module WPScan
|
11
4
|
module Finders
|
@@ -25,7 +18,7 @@ module WPScan
|
|
25
18
|
#
|
26
19
|
# @param [ WPScan::Plugin ] plugin
|
27
20
|
def load_specific_finders(plugin)
|
28
|
-
module_name = plugin.
|
21
|
+
module_name = plugin.classify
|
29
22
|
|
30
23
|
return unless Finders::PluginVersion.constants.include?(module_name)
|
31
24
|
|
data/app/finders/plugins.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require_relative 'plugins/urls_in_homepage'
|
2
|
-
require_relative 'plugins/headers'
|
3
|
-
require_relative 'plugins/comments'
|
4
2
|
require_relative 'plugins/known_locations'
|
3
|
+
# From the DynamicFinders
|
4
|
+
require_relative 'plugins/comment'
|
5
|
+
require_relative 'plugins/xpath'
|
6
|
+
require_relative 'plugins/header_pattern'
|
7
|
+
require_relative 'plugins/body_pattern'
|
8
|
+
require_relative 'plugins/javascript_var'
|
9
|
+
require_relative 'plugins/query_parameter'
|
10
|
+
require_relative 'plugins/config_parser' # Not loaded below as not implemented
|
5
11
|
|
6
12
|
module WPScan
|
7
13
|
module Finders
|
@@ -14,8 +20,11 @@ module WPScan
|
|
14
20
|
def initialize(target)
|
15
21
|
finders <<
|
16
22
|
Plugins::UrlsInHomepage.new(target) <<
|
17
|
-
Plugins::
|
18
|
-
Plugins::
|
23
|
+
Plugins::HeaderPattern.new(target) <<
|
24
|
+
Plugins::Comment.new(target) <<
|
25
|
+
Plugins::Xpath.new(target) <<
|
26
|
+
Plugins::BodyPattern.new(target) <<
|
27
|
+
Plugins::JavascriptVar.new(target) <<
|
19
28
|
Plugins::KnownLocations.new(target)
|
20
29
|
end
|
21
30
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from Dynamic Finder 'BodyPattern'
|
5
|
+
class BodyPattern < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 30
|
7
|
+
|
8
|
+
# @param [ Hash ] opts The options from the #passive, #aggressive methods
|
9
|
+
# @param [ Typhoeus::Response ] response
|
10
|
+
# @param [ String ] slug
|
11
|
+
# @param [ String ] klass
|
12
|
+
# @param [ Hash ] config The related dynamic finder config hash
|
13
|
+
#
|
14
|
+
# @return [ Plugin ] The detected plugin in the response, related to the config
|
15
|
+
def process_response(opts, response, slug, klass, config)
|
16
|
+
return unless response.body =~ config['pattern']
|
17
|
+
|
18
|
+
Plugin.new(
|
19
|
+
slug,
|
20
|
+
target,
|
21
|
+
opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE)
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from the Dynamic Finder 'Comment'
|
5
|
+
class Comment < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 30
|
7
|
+
|
8
|
+
# @param [ Hash ] opts The options from the #passive, #aggressive methods
|
9
|
+
# @param [ Typhoeus::Response ] response
|
10
|
+
# @param [ String ] slug
|
11
|
+
# @param [ String ] klass
|
12
|
+
# @param [ Hash ] config The related dynamic finder config hash
|
13
|
+
#
|
14
|
+
# @return [ Plugin ] The detected plugin in the response, related to the config
|
15
|
+
def process_response(opts, response, slug, klass, config)
|
16
|
+
response.html.xpath(config['xpath'] || '//comment()').each do |node|
|
17
|
+
comment = node.text.to_s.strip
|
18
|
+
|
19
|
+
next unless comment =~ config['pattern']
|
20
|
+
|
21
|
+
return Plugin.new(
|
22
|
+
slug,
|
23
|
+
target,
|
24
|
+
opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from Dynamic Finder 'ConfigParser'
|
5
|
+
class ConfigParser < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 40
|
7
|
+
|
8
|
+
# @param [ Hash ] opts The options from the #passive, #aggressive methods
|
9
|
+
# @param [ Typhoeus::Response ] response
|
10
|
+
# @param [ String ] slug
|
11
|
+
# @param [ String ] klass
|
12
|
+
# @param [ Hash ] config The related dynamic finder config hash
|
13
|
+
#
|
14
|
+
# @return [ Plugin ] The detected plugin in the response, related to the config
|
15
|
+
def _process_response(_opts, _response, slug, klass, config)
|
16
|
+
#
|
17
|
+
# TODO. Currently not implemented, and not even loaded by the Finders, as this
|
18
|
+
# finder only has an aggressive method, which has been disabled (globally)
|
19
|
+
# when checking for plugins
|
20
|
+
#
|
21
|
+
|
22
|
+
Plugin.new(
|
23
|
+
slug,
|
24
|
+
target,
|
25
|
+
opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from Dynamic Finder 'HeaderPattern'
|
5
|
+
class HeaderPattern < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 30
|
7
|
+
|
8
|
+
# @param [ Hash ] opts
|
9
|
+
#
|
10
|
+
# @return [ Array<Plugin> ]
|
11
|
+
def passive(opts = {})
|
12
|
+
found = []
|
13
|
+
headers = target.homepage_res.headers
|
14
|
+
|
15
|
+
return found if headers.empty?
|
16
|
+
|
17
|
+
DB::DynamicFinders::Plugin.passive_header_pattern_finder_configs.each do |slug, configs|
|
18
|
+
configs.each do |klass, config|
|
19
|
+
next unless headers[config['header']] && headers[config['header']].to_s =~ config['pattern']
|
20
|
+
|
21
|
+
found << Plugin.new(
|
22
|
+
slug,
|
23
|
+
target,
|
24
|
+
opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
found
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param [ Hash ] opts
|
33
|
+
#
|
34
|
+
# @return [ nil ]
|
35
|
+
def aggressive(_opts = {})
|
36
|
+
# None
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from the Dynamic Finder 'JavascriptVar'
|
5
|
+
class JavascriptVar < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 60
|
7
|
+
|
8
|
+
# @param [ Hash ] opts The options from the #passive, #aggressive methods
|
9
|
+
# @param [ Typhoeus::Response ] response
|
10
|
+
# @param [ String ] slug
|
11
|
+
# @param [ String ] klass
|
12
|
+
# @param [ Hash ] config The related dynamic finder config hash
|
13
|
+
#
|
14
|
+
# @return [ Plugin ] The detected plugin in the response, related to the config
|
15
|
+
def process_response(opts, response, slug, klass, config)
|
16
|
+
response.html.xpath(config['xpath'] || '//script[not(@src)]').each do |node|
|
17
|
+
next if config['pattern'] && !node.text.match(config['pattern'])
|
18
|
+
|
19
|
+
return Plugin.new(
|
20
|
+
slug,
|
21
|
+
target,
|
22
|
+
opts.merge(found_by: found_by(klass), confidence: config['confidence'] || DEFAULT_CONFIDENCE)
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -12,12 +12,12 @@ module WPScan
|
|
12
12
|
def aggressive(opts = {})
|
13
13
|
found = []
|
14
14
|
|
15
|
-
enumerate(target_urls(opts), opts) do |res,
|
15
|
+
enumerate(target_urls(opts), opts) do |res, slug|
|
16
16
|
# TODO: follow the location (from enumerate()) and remove the 301 here ?
|
17
17
|
# As a result, it might remove false positive due to redirection to the homepage
|
18
18
|
next unless [200, 401, 403, 301].include?(res.code)
|
19
19
|
|
20
|
-
found << WPScan::Plugin.new(
|
20
|
+
found << WPScan::Plugin.new(slug, target, opts.merge(found_by: found_by, confidence: 80))
|
21
21
|
end
|
22
22
|
|
23
23
|
found
|
@@ -28,12 +28,12 @@ module WPScan
|
|
28
28
|
#
|
29
29
|
# @return [ Hash ]
|
30
30
|
def target_urls(opts = {})
|
31
|
-
|
31
|
+
slugs = opts[:list] || DB::Plugins.vulnerable_slugs
|
32
32
|
urls = {}
|
33
33
|
plugins_url = target.plugins_url
|
34
34
|
|
35
|
-
|
36
|
-
urls["#{plugins_url}#{URI.encode(
|
35
|
+
slugs.each do |slug|
|
36
|
+
urls["#{plugins_url}#{URI.encode(slug)}/"] = slug
|
37
37
|
end
|
38
38
|
|
39
39
|
urls
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module WPScan
|
2
|
+
module Finders
|
3
|
+
module Plugins
|
4
|
+
# Plugins finder from Dynamic Finder 'QueryParameter'
|
5
|
+
class QueryParameter < WPScan::Finders::DynamicFinder::WpItems::Finder
|
6
|
+
DEFAULT_CONFIDENCE = 10
|
7
|
+
|
8
|
+
def passive(_opts = {})
|
9
|
+
# Handled by UrlsInHomePage, so no need to check this twice
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [ Hash ] opts The options from the #passive, #aggressive methods
|
13
|
+
# @param [ Typhoeus::Response ] response
|
14
|
+
# @param [ String ] slug
|
15
|
+
# @param [ String ] klass
|
16
|
+
# @param [ Hash ] config The related dynamic finder config hash
|
17
|
+
#
|
18
|
+
# @return [ Plugin ] The detected plugin in the response, related to the config
|
19
|
+
def process_response(opts, response, slug, klass, config)
|
20
|
+
# TODO: when a real case will be found
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|