wpscan 3.4.5 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +21 -14
  3. data/app/app.rb +2 -0
  4. data/app/controllers.rb +2 -0
  5. data/app/controllers/aliases.rb +2 -0
  6. data/app/controllers/core.rb +6 -4
  7. data/app/controllers/custom_directories.rb +3 -1
  8. data/app/controllers/enumeration.rb +6 -0
  9. data/app/controllers/enumeration/cli_options.rb +2 -0
  10. data/app/controllers/enumeration/enum_methods.rb +2 -0
  11. data/app/controllers/main_theme.rb +2 -0
  12. data/app/controllers/password_attack.rb +6 -4
  13. data/app/controllers/wp_version.rb +2 -0
  14. data/app/finders.rb +2 -0
  15. data/app/finders/config_backups.rb +2 -0
  16. data/app/finders/config_backups/known_filenames.rb +4 -3
  17. data/app/finders/db_exports.rb +2 -0
  18. data/app/finders/db_exports/known_locations.rb +15 -3
  19. data/app/finders/interesting_findings.rb +2 -0
  20. data/app/finders/interesting_findings/backup_db.rb +5 -4
  21. data/app/finders/interesting_findings/debug_log.rb +3 -1
  22. data/app/finders/interesting_findings/duplicator_installer_log.rb +6 -5
  23. data/app/finders/interesting_findings/emergency_pwd_reset_script.rb +6 -4
  24. data/app/finders/interesting_findings/full_path_disclosure.rb +3 -1
  25. data/app/finders/interesting_findings/mu_plugins.rb +4 -2
  26. data/app/finders/interesting_findings/multisite.rb +3 -1
  27. data/app/finders/interesting_findings/readme.rb +8 -6
  28. data/app/finders/interesting_findings/registration.rb +3 -1
  29. data/app/finders/interesting_findings/tmm_db_migrate.rb +4 -2
  30. data/app/finders/interesting_findings/upload_directory_listing.rb +3 -1
  31. data/app/finders/interesting_findings/upload_sql_dump.rb +8 -10
  32. data/app/finders/interesting_findings/wp_cron.rb +3 -1
  33. data/app/finders/main_theme.rb +2 -0
  34. data/app/finders/main_theme/css_style.rb +3 -1
  35. data/app/finders/main_theme/urls_in_homepage.rb +3 -1
  36. data/app/finders/main_theme/woo_framework_meta_generator.rb +3 -1
  37. data/app/finders/medias.rb +2 -0
  38. data/app/finders/medias/attachment_brute_forcing.rb +3 -1
  39. data/app/finders/passwords.rb +2 -0
  40. data/app/finders/passwords/wp_login.rb +4 -1
  41. data/app/finders/passwords/xml_rpc.rb +2 -0
  42. data/app/finders/passwords/xml_rpc_multicall.rb +4 -2
  43. data/app/finders/plugin_version.rb +4 -2
  44. data/app/finders/plugin_version/readme.rb +9 -5
  45. data/app/finders/plugins.rb +2 -0
  46. data/app/finders/plugins/body_pattern.rb +3 -1
  47. data/app/finders/plugins/comment.rb +3 -1
  48. data/app/finders/plugins/config_parser.rb +3 -1
  49. data/app/finders/plugins/header_pattern.rb +3 -1
  50. data/app/finders/plugins/javascript_var.rb +3 -1
  51. data/app/finders/plugins/known_locations.rb +10 -8
  52. data/app/finders/plugins/query_parameter.rb +2 -0
  53. data/app/finders/plugins/urls_in_homepage.rb +3 -1
  54. data/app/finders/plugins/xpath.rb +3 -1
  55. data/app/finders/theme_version.rb +4 -2
  56. data/app/finders/theme_version/style.rb +3 -1
  57. data/app/finders/theme_version/woo_framework_meta_generator.rb +3 -1
  58. data/app/finders/themes.rb +2 -0
  59. data/app/finders/themes/known_locations.rb +12 -10
  60. data/app/finders/themes/urls_in_homepage.rb +3 -1
  61. data/app/finders/timthumb_version.rb +3 -1
  62. data/app/finders/timthumb_version/bad_request.rb +3 -1
  63. data/app/finders/timthumbs.rb +2 -0
  64. data/app/finders/timthumbs/known_locations.rb +12 -3
  65. data/app/finders/users.rb +2 -0
  66. data/app/finders/users/author_id_brute_forcing.rb +3 -1
  67. data/app/finders/users/author_posts.rb +3 -1
  68. data/app/finders/users/login_error_messages.rb +3 -1
  69. data/app/finders/users/oembed_api.rb +6 -4
  70. data/app/finders/users/rss_generator.rb +7 -5
  71. data/app/finders/users/wp_json_api.rb +16 -6
  72. data/app/finders/users/yoast_seo_author_sitemap.rb +6 -4
  73. data/app/finders/wp_items.rb +2 -0
  74. data/app/finders/wp_items/urls_in_homepage.rb +2 -0
  75. data/app/finders/wp_version.rb +2 -0
  76. data/app/finders/wp_version/atom_generator.rb +2 -0
  77. data/app/finders/wp_version/rdf_generator.rb +2 -0
  78. data/app/finders/wp_version/readme.rb +4 -2
  79. data/app/finders/wp_version/rss_generator.rb +2 -0
  80. data/app/finders/wp_version/unique_fingerprinting.rb +3 -1
  81. data/app/models.rb +8 -0
  82. data/app/models/config_backup.rb +6 -2
  83. data/app/models/db_export.rb +6 -2
  84. data/app/models/interesting_finding.rb +36 -32
  85. data/app/models/media.rb +6 -2
  86. data/app/models/plugin.rb +25 -17
  87. data/app/models/theme.rb +83 -75
  88. data/app/models/timthumb.rb +58 -54
  89. data/app/models/wp_item.rb +140 -128
  90. data/app/models/wp_version.rb +47 -44
  91. data/app/models/xml_rpc.rb +18 -14
  92. data/app/views/cli/wp_item.erb +0 -3
  93. data/app/views/json/wp_item.erb +0 -1
  94. data/bin/wpscan +1 -0
  95. data/lib/wpscan.rb +2 -0
  96. data/lib/wpscan/browser.rb +2 -0
  97. data/lib/wpscan/controller.rb +2 -0
  98. data/lib/wpscan/controllers.rb +2 -0
  99. data/lib/wpscan/db.rb +2 -0
  100. data/lib/wpscan/db/dynamic_finders/base.rb +2 -0
  101. data/lib/wpscan/db/dynamic_finders/plugin.rb +4 -5
  102. data/lib/wpscan/db/dynamic_finders/theme.rb +2 -0
  103. data/lib/wpscan/db/dynamic_finders/wordpress.rb +2 -0
  104. data/lib/wpscan/db/fingerprints.rb +2 -0
  105. data/lib/wpscan/db/plugin.rb +2 -0
  106. data/lib/wpscan/db/plugins.rb +2 -0
  107. data/lib/wpscan/db/theme.rb +2 -0
  108. data/lib/wpscan/db/themes.rb +2 -0
  109. data/lib/wpscan/db/updater.rb +4 -2
  110. data/lib/wpscan/db/wp_item.rb +2 -0
  111. data/lib/wpscan/db/wp_items.rb +2 -0
  112. data/lib/wpscan/db/wp_version.rb +2 -0
  113. data/lib/wpscan/errors.rb +7 -1
  114. data/lib/wpscan/errors/http.rb +27 -23
  115. data/lib/wpscan/errors/update.rb +8 -4
  116. data/lib/wpscan/errors/wordpress.rb +24 -14
  117. data/lib/wpscan/errors/xmlrpc.rb +8 -4
  118. data/lib/wpscan/finders.rb +2 -0
  119. data/lib/wpscan/finders/dynamic_finder/finder.rb +2 -0
  120. data/lib/wpscan/finders/dynamic_finder/version/body_pattern.rb +2 -0
  121. data/lib/wpscan/finders/dynamic_finder/version/comment.rb +2 -0
  122. data/lib/wpscan/finders/dynamic_finder/version/config_parser.rb +2 -0
  123. data/lib/wpscan/finders/dynamic_finder/version/finder.rb +4 -2
  124. data/lib/wpscan/finders/dynamic_finder/version/header_pattern.rb +2 -0
  125. data/lib/wpscan/finders/dynamic_finder/version/javascript_var.rb +2 -0
  126. data/lib/wpscan/finders/dynamic_finder/version/query_parameter.rb +2 -0
  127. data/lib/wpscan/finders/dynamic_finder/version/xpath.rb +2 -0
  128. data/lib/wpscan/finders/dynamic_finder/wp_item_version.rb +2 -0
  129. data/lib/wpscan/finders/dynamic_finder/wp_items/finder.rb +4 -2
  130. data/lib/wpscan/finders/dynamic_finder/wp_version.rb +4 -2
  131. data/lib/wpscan/finders/finder/wp_version/smart_url_checker.rb +4 -2
  132. data/lib/wpscan/helper.rb +2 -0
  133. data/lib/wpscan/references.rb +2 -0
  134. data/lib/wpscan/target.rb +12 -1
  135. data/lib/wpscan/target/platform/wordpress.rb +15 -1
  136. data/lib/wpscan/target/platform/wordpress/custom_directories.rb +23 -3
  137. data/lib/wpscan/version.rb +3 -1
  138. data/lib/wpscan/vulnerability.rb +2 -0
  139. data/lib/wpscan/vulnerable.rb +2 -0
  140. metadata +35 -8
@@ -1,158 +1,170 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WPScan
2
- # WpItem (superclass of Plugin & Theme)
3
- class WpItem
4
- include Vulnerable
5
- include Finders::Finding
6
- include CMSScanner::Target::Platform::PHP
7
- include CMSScanner::Target::Server::Generic
8
-
9
- READMES = %w[readme.txt README.txt README.md readme.md Readme.txt].freeze
10
- CHANGELOGS = %w[changelog.txt CHANGELOG.md changelog.md].freeze
11
-
12
- attr_reader :uri, :slug, :detection_opts, :version_detection_opts, :blog, :db_data
13
-
14
- delegate :homepage_res, :xpath_pattern_from_page, :in_scope_urls, to: :blog
15
-
16
- # @param [ String ] slug The plugin/theme slug
17
- # @param [ Target ] blog The targeted blog
18
- # @param [ Hash ] opts
19
- # @option opts [ Symbol ] :mode The detection mode to use
20
- # @option opts [ Hash ] :version_detection The options to use when looking for the version
21
- # @option opts [ String ] :url The URL of the item
22
- def initialize(slug, blog, opts = {})
23
- @slug = URI.decode(slug)
24
- @blog = blog
25
- @uri = Addressable::URI.parse(opts[:url]) if opts[:url]
26
-
27
- @detection_opts = { mode: opts[:mode] }
28
- @version_detection_opts = opts[:version_detection] || {}
29
-
30
- parse_finding_options(opts)
31
- end
4
+ module Model
5
+ # WpItem (superclass of Plugin & Theme)
6
+ class WpItem
7
+ include Vulnerable
8
+ include Finders::Finding
9
+ include CMSScanner::Target::Platform::PHP
10
+ include CMSScanner::Target::Server::Generic
11
+
12
+ READMES = %w[readme.txt README.txt README.md readme.md Readme.txt].freeze
13
+
14
+ attr_reader :uri, :slug, :detection_opts, :version_detection_opts, :blog, :path_from_blog, :db_data
15
+
16
+ delegate :homepage_res, :xpath_pattern_from_page, :in_scope_urls, :head_or_get_params, to: :blog
17
+
18
+ # @param [ String ] slug The plugin/theme slug
19
+ # @param [ Target ] blog The targeted blog
20
+ # @param [ Hash ] opts
21
+ # @option opts [ Symbol ] :mode The detection mode to use
22
+ # @option opts [ Hash ] :version_detection The options to use when looking for the version
23
+ # @option opts [ String ] :url The URL of the item
24
+ def initialize(slug, blog, opts = {})
25
+ @slug = URI.decode(slug)
26
+ @blog = blog
27
+ @uri = Addressable::URI.parse(opts[:url]) if opts[:url]
28
+
29
+ @detection_opts = { mode: opts[:mode] }
30
+ @version_detection_opts = opts[:version_detection] || {}
31
+
32
+ parse_finding_options(opts)
33
+ end
32
34
 
33
- # @return [ Array<Vulnerabily> ]
34
- def vulnerabilities
35
- return @vulnerabilities if @vulnerabilities
35
+ # @return [ Array<Vulnerabily> ]
36
+ def vulnerabilities
37
+ return @vulnerabilities if @vulnerabilities
36
38
 
37
- @vulnerabilities = []
39
+ @vulnerabilities = []
40
+
41
+ [*db_data['vulnerabilities']].each do |json_vuln|
42
+ vulnerability = Vulnerability.load_from_json(json_vuln)
43
+ @vulnerabilities << vulnerability if vulnerable_to?(vulnerability)
44
+ end
38
45
 
39
- [*db_data['vulnerabilities']].each do |json_vuln|
40
- vulnerability = Vulnerability.load_from_json(json_vuln)
41
- @vulnerabilities << vulnerability if vulnerable_to?(vulnerability)
46
+ @vulnerabilities
42
47
  end
43
48
 
44
- @vulnerabilities
45
- end
49
+ # Checks if the wp_item is vulnerable to a specific vulnerability
50
+ #
51
+ # @param [ Vulnerability ] vuln Vulnerability to check the item against
52
+ #
53
+ # @return [ Boolean ]
54
+ def vulnerable_to?(vuln)
55
+ return true unless version && vuln && vuln.fixed_in && !vuln.fixed_in.empty?
46
56
 
47
- # Checks if the wp_item is vulnerable to a specific vulnerability
48
- #
49
- # @param [ Vulnerability ] vuln Vulnerability to check the item against
50
- #
51
- # @return [ Boolean ]
52
- def vulnerable_to?(vuln)
53
- return true unless version && vuln && vuln.fixed_in && !vuln.fixed_in.empty?
57
+ version < vuln.fixed_in
58
+ end
54
59
 
55
- version < vuln.fixed_in
56
- end
60
+ # @return [ String ]
61
+ def latest_version
62
+ @latest_version ||= db_data['latest_version'] ? Model::Version.new(db_data['latest_version']) : nil
63
+ end
57
64
 
58
- # @return [ String ]
59
- def latest_version
60
- @latest_version ||= db_data['latest_version'] ? WPScan::Version.new(db_data['latest_version']) : nil
61
- end
65
+ # Not used anywhere ATM
66
+ # @return [ Boolean ]
67
+ def popular?
68
+ @popular ||= db_data['popular']
69
+ end
62
70
 
63
- # Not used anywhere ATM
64
- # @return [ Boolean ]
65
- def popular?
66
- @popular ||= db_data['popular']
67
- end
71
+ # @return [ String ]
72
+ def last_updated
73
+ @last_updated ||= db_data['last_updated']
74
+ end
68
75
 
69
- # @return [ String ]
70
- def last_updated
71
- @last_updated ||= db_data['last_updated']
72
- end
76
+ # @return [ Boolean ]
77
+ def outdated?
78
+ @outdated ||= if version && latest_version
79
+ version < latest_version
80
+ else
81
+ false
82
+ end
83
+ end
73
84
 
74
- # @return [ Boolean ]
75
- def outdated?
76
- @outdated ||= if version && latest_version
77
- version < latest_version
78
- else
79
- false
80
- end
81
- end
85
+ # URI.encode is preferered over Addressable::URI.encode as it will encode
86
+ # leading # character:
87
+ # URI.encode('#t#') => %23t%23
88
+ # Addressable::URI.encode('#t#') => #t%23
89
+ #
90
+ # @param [ String ] path Optional path to merge with the uri
91
+ #
92
+ # @return [ String ]
93
+ def url(path = nil)
94
+ return unless @uri
95
+ return @uri.to_s unless path
96
+
97
+ @uri.join(URI.encode(path)).to_s
98
+ end
82
99
 
83
- # URI.encode is preferered over Addressable::URI.encode as it will encode
84
- # leading # character:
85
- # URI.encode('#t#') => %23t%23
86
- # Addressable::URI.encode('#t#') => #t%23
87
- #
88
- # @param [ String ] path Optional path to merge with the uri
89
- #
90
- # @return [ String ]
91
- def url(path = nil)
92
- return unless @uri
93
- return @uri.to_s unless path
94
-
95
- @uri.join(URI.encode(path)).to_s
96
- end
100
+ # @return [ Boolean ]
101
+ def ==(other)
102
+ self.class == other.class && slug == other.slug
103
+ end
97
104
 
98
- # @return [ Boolean ]
99
- def ==(other)
100
- self.class == other.class && slug == other.slug
101
- end
105
+ def to_s
106
+ slug
107
+ end
102
108
 
103
- def to_s
104
- slug
105
- end
109
+ # @return [ Symbol ] The Class symbol associated to the item
110
+ def classify
111
+ @classify ||= classify_slug(slug)
112
+ end
106
113
 
107
- # @return [ Symbol ] The Class symbol associated to the item
108
- def classify
109
- @classify ||= classify_slug(slug)
110
- end
114
+ # @return [ String, False ] The readme url if found, false otherwise
115
+ def readme_url
116
+ return if detection_opts[:mode] == :passive
111
117
 
112
- # @return [ String ] The readme url if found
113
- def readme_url
114
- return if detection_opts[:mode] == :passive
118
+ return @readme_url unless @readme_url.nil?
115
119
 
116
- if @readme_url.nil?
117
120
  READMES.each do |path|
118
- return @readme_url = url(path) if Browser.get(url(path)).code == 200
119
- end
120
- end
121
+ t_url = url(path)
121
122
 
122
- @readme_url
123
- end
124
-
125
- # @return [ String, false ] The changelog urr if found
126
- def changelog_url
127
- return if detection_opts[:mode] == :passive
128
-
129
- if @changelog_url.nil?
130
- CHANGELOGS.each do |path|
131
- return @changelog_url = url(path) if Browser.get(url(path)).code == 200
123
+ return @readme_url = t_url if Browser.forge_request(t_url, blog.head_or_get_params).run.code == 200
132
124
  end
125
+
126
+ @readme_url = false
133
127
  end
134
128
 
135
- @changelog_url
136
- end
129
+ # @param [ String ] path
130
+ # @param [ Hash ] params The request params
131
+ #
132
+ # @return [ Boolean ]
133
+ def directory_listing?(path = nil, params = {})
134
+ return if detection_opts[:mode] == :passive
137
135
 
138
- # @param [ String ] path
139
- # @param [ Hash ] params The request params
140
- #
141
- # @return [ Boolean ]
142
- def directory_listing?(path = nil, params = {})
143
- return if detection_opts[:mode] == :passive
136
+ super(path, params)
137
+ end
144
138
 
145
- super(path, params)
146
- end
139
+ # @param [ String ] path
140
+ # @param [ Hash ] params The request params
141
+ #
142
+ # @return [ Boolean ]
143
+ def error_log?(path = 'error_log', params = {})
144
+ return if detection_opts[:mode] == :passive
147
145
 
148
- # @param [ String ] path
149
- # @param [ Hash ] params The request params
150
- #
151
- # @return [ Boolean ]
152
- def error_log?(path = 'error_log', params = {})
153
- return if detection_opts[:mode] == :passive
146
+ super(path, params)
147
+ end
154
148
 
155
- super(path, params)
149
+ # See CMSScanner::Target#head_and_get
150
+ #
151
+ # This is used by the error_log? above in the super()
152
+ # to have the correct path (ie readme.txt checked from the plugin/theme location
153
+ # and not from the blog root). Could also be used in finders
154
+ #
155
+ # @param [ String ] path
156
+ # @param [ Array<String> ] codes
157
+ # @param [ Hash ] params The requests params
158
+ # @option params [ Hash ] :head Request params for the HEAD
159
+ # @option params [ hash ] :get Request params for the GET
160
+ #
161
+ # @return [ Typhoeus::Response ]
162
+ def head_and_get(path, codes = [200], params = {})
163
+ final_path = +@path_from_blog
164
+ final_path << URI.encode(path) unless path.nil?
165
+
166
+ blog.head_and_get(final_path, codes, params)
167
+ end
156
168
  end
157
169
  end
158
170
  end
@@ -1,64 +1,67 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WPScan
2
- # WP Version
3
- class WpVersion < CMSScanner::Version
4
- include Vulnerable
4
+ module Model
5
+ # WP Version
6
+ class WpVersion < CMSScanner::Model::Version
7
+ include Vulnerable
5
8
 
6
- def initialize(number, opts = {})
7
- raise InvalidWordPressVersion unless WpVersion.valid?(number.to_s)
9
+ def initialize(number, opts = {})
10
+ raise Error::InvalidWordPressVersion unless WpVersion.valid?(number.to_s)
8
11
 
9
- super(number, opts)
10
- end
12
+ super(number, opts)
13
+ end
11
14
 
12
- # @param [ String ] number
13
- #
14
- # @return [ Boolean ] true if the number is a valid WP version, false otherwise
15
- def self.valid?(number)
16
- all.include?(number)
17
- end
15
+ # @param [ String ] number
16
+ #
17
+ # @return [ Boolean ] true if the number is a valid WP version, false otherwise
18
+ def self.valid?(number)
19
+ all.include?(number)
20
+ end
18
21
 
19
- # @return [ Array<String> ] All the version numbers
20
- def self.all
21
- return @all_numbers if @all_numbers
22
+ # @return [ Array<String> ] All the version numbers
23
+ def self.all
24
+ return @all_numbers if @all_numbers
22
25
 
23
- @all_numbers = []
26
+ @all_numbers = []
24
27
 
25
- DB::Fingerprints.wp_fingerprints.each_value do |fp|
26
- fp.each_value do |versions|
27
- versions.each do |version|
28
- @all_numbers << version unless @all_numbers.include?(version)
29
- end
28
+ DB::Fingerprints.wp_fingerprints.each_value do |fp|
29
+ @all_numbers << fp.values
30
30
  end
31
+
32
+ # @all_numbers.flatten.uniq.sort! {} doesn't produce the same result here.
33
+ @all_numbers.flatten!
34
+ @all_numbers.uniq!
35
+ @all_numbers.sort! { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }
31
36
  end
32
37
 
33
- @all_numbers.sort! { |a, b| Gem::Version.new(b) <=> Gem::Version.new(a) }
34
- end
38
+ # @return [ JSON ]
39
+ def db_data
40
+ @db_data ||= DB::Version.db_data(number)
41
+ end
35
42
 
36
- # @return [ JSON ]
37
- def db_data
38
- DB::Version.db_data(number)
39
- end
43
+ # @return [ Array<Vulnerability> ]
44
+ def vulnerabilities
45
+ return @vulnerabilities if @vulnerabilities
40
46
 
41
- # @return [ Array<Vulnerability> ]
42
- def vulnerabilities
43
- return @vulnerabilities if @vulnerabilities
47
+ @vulnerabilities = []
44
48
 
45
- @vulnerabilities = []
49
+ [*db_data['vulnerabilities']].each do |json_vuln|
50
+ @vulnerabilities << Vulnerability.load_from_json(json_vuln)
51
+ end
46
52
 
47
- [*db_data['vulnerabilities']].each do |json_vuln|
48
- @vulnerabilities << Vulnerability.load_from_json(json_vuln)
53
+ @vulnerabilities
49
54
  end
50
55
 
51
- @vulnerabilities
52
- end
53
-
54
- # @return [ String ]
55
- def release_date
56
- @release_date ||= db_data['release_date'] || 'Unknown'
57
- end
56
+ # @return [ String ]
57
+ def release_date
58
+ @release_date ||= db_data['release_date'] || 'Unknown'
59
+ end
58
60
 
59
- # @return [ String ]
60
- def status
61
- @status ||= db_data['status'] || 'Unknown'
61
+ # @return [ String ]
62
+ def status
63
+ @status ||= db_data['status'] || 'Unknown'
64
+ end
62
65
  end
63
66
  end
64
67
  end
@@ -1,19 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WPScan
2
- # Override of the CMSScanner::XMLRPC to include the references
3
- class XMLRPC < CMSScanner::XMLRPC
4
- include References # To be able to use the :wpvulndb reference if needed
4
+ module Model
5
+ # Override of the CMSScanner::XMLRPC to include the references
6
+ class XMLRPC < CMSScanner::Model::XMLRPC
7
+ include References # To be able to use the :wpvulndb reference if needed
5
8
 
6
- # @return [ Hash ]
7
- def references
8
- {
9
- url: ['http://codex.wordpress.org/XML-RPC_Pingback_API'],
10
- metasploit: [
11
- 'auxiliary/scanner/http/wordpress_ghost_scanner',
12
- 'auxiliary/dos/http/wordpress_xmlrpc_dos',
13
- 'auxiliary/scanner/http/wordpress_xmlrpc_login',
14
- 'auxiliary/scanner/http/wordpress_pingback_access'
15
- ]
16
- }
9
+ # @return [ Hash ]
10
+ def references
11
+ {
12
+ url: ['http://codex.wordpress.org/XML-RPC_Pingback_API'],
13
+ metasploit: [
14
+ 'auxiliary/scanner/http/wordpress_ghost_scanner',
15
+ 'auxiliary/dos/http/wordpress_xmlrpc_dos',
16
+ 'auxiliary/scanner/http/wordpress_xmlrpc_login',
17
+ 'auxiliary/scanner/http/wordpress_pingback_access'
18
+ ]
19
+ }
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -8,9 +8,6 @@
8
8
  <% if @wp_item.readme_url -%>
9
9
  | Readme: <%= @wp_item.readme_url %>
10
10
  <% end -%>
11
- <% if @wp_item.changelog_url -%>
12
- | Changelog: <%= @wp_item.changelog_url %>
13
- <% end -%>
14
11
  <% if @wp_item.latest_version && @wp_item.outdated? -%>
15
12
  | <%= warning_icon %> The version is out of date, the latest version is <%= @wp_item.latest_version %>
16
13
  <% end -%>