Class: WPScan::Finders::Users::AuthorPosts

Inherits:
CMSScanner::Finders::Finder
  • Object
show all
Defined in:
app/finders/users/author_posts.rb

Overview

Author Posts

Instance Method Summary collapse

Instance Method Details

#passive(opts = {}) ⇒ Array<User>

Parameters:

  • opts (Hash) (defaults to: {})

Returns:

  • (Array<User>)


11
12
13
14
15
16
17
18
19
20
21
# File 'app/finders/users/author_posts.rb', line 11

def passive(opts = {})
  found_by_msg = 'Author Posts - %s (Passive Detection)'

  usernames(opts).reduce([]) do |a, e|
    a << Model::User.new(
      e[0],
      found_by: format(found_by_msg, e[1]),
      confidence: e[2]
    )
  end
end

#potential_usernames(res) ⇒ Array<Array>

Parameters:

Returns:

  • (Array<Array>)


45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/finders/users/author_posts.rb', line 45

def potential_usernames(res)
  usernames = []

  target.in_scope_uris(res, '//a/@href[contains(., "author")]') do |uri, node|
    if uri.path =~ %r{/author/([^/\b]+)/?\z}i
      usernames << [Regexp.last_match[1], 'Author Pattern', 100]
    elsif /author=[0-9]+/.match?(uri.query)
      usernames << [node.text.to_s.strip, 'Display Name', 30]
    end
  end

  usernames.uniq
end

#usernames(_opts = {}) ⇒ Array<Array>

Returns ].

Parameters:

  • opts (Hash)

Returns:

  • (Array<Array>)

    ]



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'app/finders/users/author_posts.rb', line 26

def usernames(_opts = {})
  found = potential_usernames(target.homepage_res)

  return found unless found.empty?

  target.homepage_res.html.css('header.entry-header a').each do |post_url_node|
    url = post_url_node['href']

    next if url.nil? || url.empty?

    found += potential_usernames(Browser.get(url))
  end

  found.compact.uniq
end