wpscan 3.4.5 → 3.5.0

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.
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 -%>