Code Factoring
This commit is contained in:
@@ -49,13 +49,9 @@ class WpItem
|
|||||||
# however can also be found in their specific plugin dir.
|
# however can also be found in their specific plugin dir.
|
||||||
# http://www.exploit-db.com/ghdb/3714/
|
# http://www.exploit-db.com/ghdb/3714/
|
||||||
#
|
#
|
||||||
# Only the first 700 bytes are checked to avoid the download
|
|
||||||
# of the whole file which can be very huge (like 2 Go)
|
|
||||||
#
|
|
||||||
# @return [ Boolean ]
|
# @return [ Boolean ]
|
||||||
def has_error_log?
|
def has_error_log?
|
||||||
response_body = Browser.get(error_log_url, headers: {'range' => 'bytes=0-700'}).body
|
WebSite.has_log?(error_log_url, %r{PHP Fatal error}i)
|
||||||
response_body[%r{PHP Fatal error}i] ? true : false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# @return [ String ] The url to the error_log file
|
# @return [ String ] The url to the error_log file
|
||||||
|
|||||||
@@ -117,9 +117,21 @@ class WebSite
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Gets a robots.txt URL
|
# Gets a robots.txt URL
|
||||||
|
#
|
||||||
|
# @return [ String ]
|
||||||
def robots_url
|
def robots_url
|
||||||
robots = @uri.clone
|
@uri.merge('robots.txt').to_s
|
||||||
robots.path = '/robots.txt'
|
end
|
||||||
robots.to_s
|
|
||||||
|
# Only the first 700 bytes are checked to avoid the download
|
||||||
|
# of the whole file which can be very huge (like 2 Go)
|
||||||
|
#
|
||||||
|
# @param [ String ] log_url
|
||||||
|
# @param [ RegEx ] pattern
|
||||||
|
#
|
||||||
|
# @return [ Boolean ]
|
||||||
|
def self.has_log?(log_url, pattern)
|
||||||
|
log_body = Browser.get(log_url, headers: {'range' => 'bytes=0-700'}).body
|
||||||
|
log_body[pattern] ? true : false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -90,6 +90,12 @@ class WpTarget < WebSite
|
|||||||
end
|
end
|
||||||
# :nocov:
|
# :nocov:
|
||||||
|
|
||||||
|
# The version is not yet considerated
|
||||||
|
#
|
||||||
|
# @param [ String ] name
|
||||||
|
# @param [ String ] version
|
||||||
|
#
|
||||||
|
# @return [ Boolean ]
|
||||||
def has_plugin?(name, version = nil)
|
def has_plugin?(name, version = nil)
|
||||||
WpPlugin.new(
|
WpPlugin.new(
|
||||||
@uri,
|
@uri,
|
||||||
@@ -100,12 +106,12 @@ class WpTarget < WebSite
|
|||||||
).exists?
|
).exists?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [ Boolean ]
|
||||||
def has_debug_log?
|
def has_debug_log?
|
||||||
# We only get the first 700 bytes of the file to avoid loading huge file (like 2Go)
|
WebSite.has_log?(debug_log_url, %r{\[[^\]]+\] PHP (?:Warning|Error|Notice):})
|
||||||
response_body = Browser.get(debug_log_url(), headers: {'range' => 'bytes=0-700'}).body
|
|
||||||
response_body[%r{\[[^\]]+\] PHP (?:Warning|Error|Notice):}] ? true : false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [ String ]
|
||||||
def debug_log_url
|
def debug_log_url
|
||||||
@uri.merge("#{wp_content_dir()}/debug.log").to_s
|
@uri.merge("#{wp_content_dir()}/debug.log").to_s
|
||||||
end
|
end
|
||||||
@@ -113,10 +119,13 @@ class WpTarget < WebSite
|
|||||||
# Script for replacing strings in wordpress databases
|
# Script for replacing strings in wordpress databases
|
||||||
# reveals databse credentials after hitting submit
|
# reveals databse credentials after hitting submit
|
||||||
# http://interconnectit.com/124/search-and-replace-for-wordpress-databases/
|
# http://interconnectit.com/124/search-and-replace-for-wordpress-databases/
|
||||||
|
#
|
||||||
|
# @return [ String ]
|
||||||
def search_replace_db_2_url
|
def search_replace_db_2_url
|
||||||
@uri.merge('searchreplacedb2.php').to_s
|
@uri.merge('searchreplacedb2.php').to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [ Boolean ]
|
||||||
def search_replace_db_2_exists?
|
def search_replace_db_2_exists?
|
||||||
resp = Browser.get(search_replace_db_2_url)
|
resp = Browser.get(search_replace_db_2_url)
|
||||||
resp.code == 200 && resp.body[%r{by interconnect}i]
|
resp.code == 200 && resp.body[%r{by interconnect}i]
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
describe 'WebSite' do
|
describe 'WebSite' do
|
||||||
let(:fixtures_dir) { SPEC_FIXTURES_WPSCAN_WEB_SITE_DIR }
|
let(:fixtures_dir) { SPEC_FIXTURES_WPSCAN_WEB_SITE_DIR }
|
||||||
subject(:web_site) { WebSite.new('http://example.localhost/') }
|
subject(:web_site) { WebSite.new('http://example.localhost/') }
|
||||||
@@ -251,4 +253,34 @@ describe 'WebSite' do
|
|||||||
web_site.has_robots?.should be_false
|
web_site.has_robots?.should be_false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '::has_log?' do
|
||||||
|
let(:log_url) { web_site.uri.merge('log.txt').to_s }
|
||||||
|
let(:pattern) { %r{PHP Fatal error} }
|
||||||
|
|
||||||
|
after do
|
||||||
|
stub_request_to_fixture(url: log_url, fixture: fixtures_dir + "/has_log/#{@file}")
|
||||||
|
WebSite.has_log?(log_url, pattern).should == @expected
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the pattern does not match' do
|
||||||
|
it 'returns false' do
|
||||||
|
@file = 'no_match.txt'
|
||||||
|
@expected = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the pattern matches' do
|
||||||
|
it 'returns true' do
|
||||||
|
@file = 'matches.txt'
|
||||||
|
@expected = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This doesn't work in rspec, WebMock or Typhoeus returns the whole file
|
||||||
|
#it 'only checks the first 700 bytes' do
|
||||||
|
# @file = 'matches_after_700_bytes.txt'
|
||||||
|
# @expected = false
|
||||||
|
#end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
2
spec/samples/wpscan/web_site/has_log/matches.txt
Normal file
2
spec/samples/wpscan/web_site/has_log/matches.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[13-Jan-2009 01:53:25] PHP Fatal error: Class 'Log' not found in /home/****/public_html/wp-content/plugins/fbconnect/Log/null.php on line 19
|
||||||
|
[13-Jan-2009 01:55:58] PHP Fatal error: Class 'Log' not found in /home/****/public_html/wp-content/plugins/fbconnect/Log/file.php on line 20
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
[13-Jan-2009 01:53:25] PHP Fatal error: Class 'Log' not found in /home/****/public_html/wp-content/plugins/fbconnect/Log/null.php on line 19
|
||||||
3
spec/samples/wpscan/web_site/has_log/no_match.txt
Normal file
3
spec/samples/wpscan/web_site/has_log/no_match.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||||||
|
ccccccccccccccccccccccccccccccccc
|
||||||
Reference in New Issue
Block a user