Module: CMSScanner::Target::Platform::WordPress

Includes:
PHP
Defined in:
lib/cms_scanner/target/platform/wordpress.rb,
lib/cms_scanner/target/platform/wordpress/custom_directories.rb

Overview

wp-content & plugins directory implementation

Constant Summary collapse

WORDPRESS_PATTERN =
%r{/(?:(?:wp-content/(?:themes|plugins|plugins))|wp-includes)/}i

Constants included from PHP

PHP::DEBUG_LOG_PATTERN, PHP::FPD_PATTERN

Instance Method Summary collapse

Methods included from PHP

#debug_log?, #full_path_disclosure?, #full_path_disclosure_entries

Instance Method Details

#content_dir ⇒ String

Returns The wp-content directory.

Returns:

  • (String) —

    The wp-content directory



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 15

def content_dir
  unless @content_dir
    page        = Nokogiri::HTML(Browser.get(url).body)
    escaped_url = Regexp.escape(url).gsub(/https?/i, 'https?')
    pattern     = %r{#{escaped_url}(.+?)\/(?:themes|plugins|uploads)\/}i

    page.css('link,script,style,img').each do |tag|
      %w(href src).each do |attribute|
        attr_value = tag.attribute(attribute).to_s

        next if attr_value.nil? || attr_value.empty?
        next unless in_scope?(attr_value) && attr_value.match(pattern)

        return @content_dir = Regexp.last_match[1]
      end
    end
  end
  @content_dir
end

#content_dir=(dir) ⇒ Object



6
7
8
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 6

def content_dir=(dir)
  @content_dir = dir.chomp('/')
end

#content_uri ⇒ Addressable::URI

Returns:

  • (Addressable::URI)


36
37
38
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 36

def content_uri
  uri.join("#{content_dir}/")
end

#content_url ⇒ String

Returns:

  • (String)


41
42
43
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 41

def content_url
  content_uri.to_s
end

#plugins_dir ⇒ String

Returns:

  • (String)


46
47
48
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 46

def plugins_dir
  @plugins_dir ||= "#{content_dir}/plugins"
end

#plugins_dir=(dir) ⇒ Object



10
11
12
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 10

def plugins_dir=(dir)
  @plugins_dir = dir.chomp('/')
end

#plugins_uri ⇒ Addressable::URI

Returns:

  • (Addressable::URI)


51
52
53
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 51

def plugins_uri
  uri.join("#{plugins_dir}/")
end

#plugins_url ⇒ String

Returns:

  • (String)


56
57
58
# File 'lib/cms_scanner/target/platform/wordpress/custom_directories.rb', line 56

def plugins_url
  plugins_uri.to_s
end

#wordpress? ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/cms_scanner/target/platform/wordpress.rb', line 14

def wordpress?
  page = Nokogiri::HTML(Browser.get(url).body)

  page.css('script, link').each do |tag|
    tag_url = tag.attribute('href').to_s

    next unless in_scope?(tag_url)

    tag_uri = Addressable::URI.parse(tag_url)

    return true if tag_uri.path =~ WORDPRESS_PATTERN
  end
  false
end

#wordpress_hosted? ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/cms_scanner/target/platform/wordpress.rb', line 29

def wordpress_hosted?
  uri.host =~ /wordpress.com$/i ? true : false
end