cms_scanner 0.0.37.2 → 0.0.37.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c91f0a93071bda6ebe8fb050b712acabf9940cd
4
- data.tar.gz: 9a1e129b685442a8369a095bcd60af4551dd23aa
3
+ metadata.gz: 611e0d1894e5db176095c3b09feefa68077b2260
4
+ data.tar.gz: 8428392f787410217a9d421bcdc02ecc6abcdb36
5
5
  SHA512:
6
- metadata.gz: 751dbcbfd6f266d6858dd1884f2251c6f56cedf60c935e0d6465a34025e65dbcca67b089747ebd17db11ca087327bb05bc85397876d0695dc9fa7683d6eb6823
7
- data.tar.gz: bea0bd67b730e5d5a650d976fffa65c00e5aaeaaca3c7e5be0b445555c13a855624c86ce55fb97a4beb45bd4d5c464d7415b82394e8f5aa7d8f0447f9a3d0746
6
+ metadata.gz: 9c908a4747c6b4c3f2c388d091b151de36db62f0267504a22d2c2826d34e7364e5f90f835d214c4e22b8d9170662a93aa5dfba0c7a55bb0919c4069b570cb588
7
+ data.tar.gz: d45977ecf51a409ce89ad85ff1305539bf44f4e4a2a4296566850d39016c5de4338769dae986a35e9b2ebe85c228d71007fe150cba88ad6bf8fb56a04dbce082
@@ -38,15 +38,22 @@ module CMSScanner
38
38
  fail ProxyAuthRequiredError
39
39
  end
40
40
 
41
- redirection = target.redirection
42
- fail HTTPRedirectError, redirection if redirection && !parsed_options[:ignore_main_redirect]
41
+ # Checks for redirects
42
+ # An out of scope redirect will raise an HTTPRedirectError
43
+ effective_url = target.homepage_res.effective_url
44
+
45
+ return if target.in_scope?(effective_url)
46
+
47
+ fail HTTPRedirectError, effective_url unless parsed_options[:ignore_main_redirect]
48
+
49
+ target.homepage_res = res
43
50
  end
44
51
 
45
52
  def run
46
53
  @start_time = Time.now
47
54
  @start_memory = memory_usage
48
55
 
49
- output('started', url: target.url)
56
+ output('started', url: target.url, effective_url: target.homepage_url)
50
57
  end
51
58
 
52
59
  def after_scan
@@ -5,7 +5,7 @@ module CMSScanner
5
5
  class Headers < Finder
6
6
  # @return [ InterestingFinding ]
7
7
  def passive(_opts = {})
8
- r = NS::Headers.new(target.url, confidence: 100, found_by: found_by)
8
+ r = NS::Headers.new(target.homepage_url, confidence: 100, found_by: found_by)
9
9
 
10
10
  r.interesting_entries.empty? ? nil : r
11
11
  end
@@ -15,7 +15,7 @@ module CMSScanner
15
15
 
16
16
  # @return [ XMLRPC ]
17
17
  def passive_headers(_opts = {})
18
- url = NS::Browser.get(target.url).headers['X-Pingback']
18
+ url = target.homepage_res.headers['X-Pingback']
19
19
 
20
20
  return unless target.in_scope?(url)
21
21
  potential_urls << url
@@ -25,7 +25,7 @@ module CMSScanner
25
25
 
26
26
  # @return [ XMLRPC ]
27
27
  def passive_body(_opts = {})
28
- NS::Browser.get(target.url).html.css('link[rel="pingback"]').each do |tag|
28
+ target.homepage_res.html.css('link[rel="pingback"]').each do |tag|
29
29
  url = tag.attribute('href').to_s
30
30
 
31
31
  next unless target.in_scope?(url)
@@ -1,3 +1,6 @@
1
1
  <%= info_icon %> URL: <%= @url %>
2
+ <% if @url != @effective_url -%>
3
+ <%= info_icon %> Effective URL: <%= @effective_url %>
4
+ <% end -%>
2
5
  <%= info_icon %> Started: <%= @start_time.asctime %>
3
6
 
@@ -1,3 +1,4 @@
1
1
  "start_time": <%= @start_time.to_i %>,
2
2
  "start_memory": <%= @start_memory.to_i %>,
3
- "target_url": <%= @url.to_s.to_json %>,
3
+ "target_url": <%= @url.to_s.to_json %>,
4
+ "effective_url": <%= @effective_url.to_s.to_json %>,
data/cms_scanner.gemspec CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.add_dependency 'typhoeus', '~> 0.8.0'
35
35
  s.add_dependency 'nokogiri', '~> 1.6.7.0'
36
36
  s.add_dependency 'yajl-ruby', '~> 1.2.1' # Better JSON parser regarding memory usage
37
- s.add_dependency 'addressable', '~> 2.3.8'
37
+ s.add_dependency 'addressable', '~> 2.4.0'
38
38
  s.add_dependency 'activesupport', '~> 4.2.0'
39
39
  s.add_dependency 'public_suffix', '~> 1.5.0'
40
40
  s.add_dependency 'ruby-progressbar', '~> 1.7.5'
@@ -1,3 +1,4 @@
1
+ require 'cms_scanner/mocked_progress_bar'
1
2
  require 'cms_scanner/finders/finder/smart_url_checker'
2
3
  require 'cms_scanner/finders/finder/enumerator'
3
4
  require 'cms_scanner/finders/finder/fingerprinter'
@@ -9,7 +10,7 @@ module CMSScanner
9
10
  # Constants for common found_by
10
11
  DIRECT_ACCESS = 'Direct Access (Aggressive Detection)'
11
12
 
12
- attr_accessor :target
13
+ attr_accessor :target, :progress_bar
13
14
 
14
15
  def initialize(target)
15
16
  @target = target
@@ -29,10 +30,13 @@ module CMSScanner
29
30
  end
30
31
 
31
32
  # @param [ Hash ] opts See https://github.com/jfelchner/ruby-progressbar/wiki/Options
33
+ # @option opts [ Boolean ] :show_progression
32
34
  #
33
- # @return [ ProgressBar::Base ]
34
- def progress_bar(opts = {})
35
- ProgressBar.create({ format: '%t %a <%B> (%c / %C) %P%% %e' }.merge(opts))
35
+ # @return [ ProgressBar::Base, CMSScanner::MockedProgressBar ]
36
+ def create_progress_bar(opts = {})
37
+ klass = opts[:show_progression] ? ProgressBar : MockedProgressBar
38
+
39
+ @progress_bar = klass.create({ format: '%t %a <%B> (%c / %C) %P%% %e' }.merge(opts))
36
40
  end
37
41
 
38
42
  # @return [ Browser ]
@@ -10,13 +10,13 @@ module CMSScanner
10
10
  #
11
11
  # @yield [ Typhoeus::Response, String ]
12
12
  def enumerate(target_urls, opts = {})
13
- bar = progress_bar(total: target_urls.size) if opts[:show_progression]
13
+ create_progress_bar(opts.merge(total: target_urls.size)) # if opts[:show_progression]
14
14
 
15
15
  target_urls.each do |url, id|
16
16
  request = browser.forge_request(url, request_params)
17
17
 
18
18
  request.on_complete do |res|
19
- bar.progress += 1 if opts[:show_progression]
19
+ progress_bar.increment
20
20
 
21
21
  next if target.homepage_or_404?(res)
22
22
  next if opts[:exclude_content] && res.body.match(opts[:exclude_content])
@@ -23,14 +23,14 @@ module CMSScanner
23
23
  # @yield [ Mixed, String, String ] version/s, url, hash The version associated to the
24
24
  # fingerprint of the url
25
25
  def fingerprint(fingerprints, opts = {})
26
- bar = progress_bar(total: fingerprints.size) if opts[:show_progression]
26
+ create_progress_bar(opts.merge(total: fingerprints.size)) # if opts[:show_progression]
27
27
 
28
28
  fingerprints.each do |path, f|
29
29
  url = target.url(path.dup)
30
30
  request = browser.forge_request(url, request_params)
31
31
 
32
32
  request.on_complete do |res|
33
- bar.progress += 1 if opts[:show_progression]
33
+ progress_bar.increment
34
34
 
35
35
  md5sum = hexdigest(res.body)
36
36
 
@@ -24,7 +24,7 @@ module CMSScanner
24
24
  #
25
25
  # @return [ Array<String> ]
26
26
  def passive_urls(_opts = {})
27
- target.in_scope_urls(NS::Browser.get(target.url), passive_urls_xpath)
27
+ target.in_scope_urls(target.homepage_res, passive_urls_xpath)
28
28
  end
29
29
 
30
30
  # @return [ String ]
@@ -0,0 +1,38 @@
1
+ module CMSScanner
2
+ # ProgressBar to be used in formatter w/o user_interaction such as
3
+ # JSON etc, to still be able to have a log of messages to output.
4
+ # The object must implement the methods in ruby-progressbar
5
+ # and used in CMSScanner, See https://github.com/jfelchner/ruby-progressbar
6
+ class MockedProgressBar
7
+ attr_reader :increment, :finish
8
+
9
+ def self.create(opts = {})
10
+ new(opts)
11
+ end
12
+
13
+ def initialize(_opts = {})
14
+ end
15
+
16
+ # @return [ Integer ]
17
+ def total
18
+ 0
19
+ end
20
+
21
+ def total=(_total)
22
+ end
23
+
24
+ # @return [ Array<String> ]
25
+ def logs
26
+ @logs ||= []
27
+ end
28
+
29
+ # @param [ String, nil ] message
30
+ #
31
+ # @return [ Mixed ]
32
+ def log(message = nil)
33
+ return logs unless message
34
+
35
+ logs << message
36
+ end
37
+ end
38
+ end
@@ -1,4 +1,4 @@
1
1
  # Version
2
2
  module CMSScanner
3
- VERSION = '0.0.37.2'
3
+ VERSION = '0.0.37.3'
4
4
  end
@@ -36,6 +36,22 @@ module CMSScanner
36
36
  @uri.join(URI.encode(path)).to_s
37
37
  end
38
38
 
39
+ attr_writer :homepage_res
40
+
41
+ # @return [ Typhoeus::Response ]
42
+ #
43
+ # As webmock does not support redirects mocking, coverage is ignored
44
+ # :nocov:
45
+ def homepage_res
46
+ @homepage_res ||= NS::Browser.get_and_follow_location(url)
47
+ end
48
+ # :nocov:
49
+
50
+ # @return [ String ]
51
+ def homepage_url
52
+ @homepage_url ||= homepage_res.effective_url
53
+ end
54
+
39
55
  # Checks if the remote website is up.
40
56
  #
41
57
  # @param [ String ] path
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cms_scanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.37.2
4
+ version: 0.0.37.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - WPScanTeam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-04 00:00:00.000000000 Z
11
+ date: 2015-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.3.8
61
+ version: 2.4.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.3.8
68
+ version: 2.4.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -294,6 +294,7 @@ files:
294
294
  - lib/cms_scanner/formatter.rb
295
295
  - lib/cms_scanner/formatter/buffer.rb
296
296
  - lib/cms_scanner/helper.rb
297
+ - lib/cms_scanner/mocked_progress_bar.rb
297
298
  - lib/cms_scanner/numeric.rb
298
299
  - lib/cms_scanner/public_suffix/domain.rb
299
300
  - lib/cms_scanner/references.rb