Path: blob/master/spec/app/finders/db_exports/known_locations_spec.rb
1483 views
# frozen_string_literal: true12describe WPScan::Finders::DbExports::KnownLocations do3subject(:finder) { described_class.new(target) }4let(:target) { WPScan::Target.new(url) }5let(:url) { 'http://ex.lo/aa/' }6let(:fixtures) { FINDERS_FIXTURES.join('db_exports') }7let(:opts) { { list: WPScan::DB_DIR.join('db_exports.txt').to_s } }89describe '#potential_urls' do10before do11allow(target).to receive(:sub_dir).and_return(false)12end1314it 'replaces {domain_name} by its values' do15expect(finder.potential_urls(opts).keys).to eql %w[16http://ex.lo/aa/ex.sql17http://ex.lo/aa/wordpress.sql18http://ex.lo/aa/backup/ex.zip19http://ex.lo/aa/backup/mysql.sql20http://ex.lo/aa/backups/ex.sql.gz21http://ex.lo/aa/backups/db_backup.sql22]23end2425%w[dev poc www].each do |sub_domain|26context "when #{sub_domain} sub-domain" do27let(:url) { "https://#{sub_domain}.domain.tld" }2829it 'replaces {domain_name} by its correct values' do30expect(finder.potential_urls(opts).keys).to include "#{url}/domain.sql", "#{url}/#{sub_domain}.domain.sql"31end32end33end3435context 'when multi-level tlds' do36let(:url) { 'https://something.com.tr' }3738it 'replaces {domain_name} by its correct value' do39expect(finder.potential_urls(opts).keys).to include 'https://something.com.tr/something.sql'40end41end4243context 'when multi-level tlds and sub-domain' do44let(:url) { 'https://dev.something.com.tr' }4546it 'replaces {domain_name} by its correct values' do47expect(finder.potential_urls(opts).keys).to include(48'https://dev.something.com.tr/something.sql',49'https://dev.something.com.tr/dev.something.sql'50)51end52end5354context 'when some weird stuff' do55let(:url) { 'https://098f6bcd4621d373cade4e832627b4f6.aa-bb-ccc-dd.domain-test.com' }5657it 'replaces {domain_name} by its correct values' do58expect(finder.potential_urls(opts).keys).to include(59"#{url}/domain-test.sql",60"#{url}/098f6bcd4621d373cade4e832627b4f6.aa-bb-ccc-dd.domain-test.sql"61)62end63end6465context 'when a non standard URL' do66let(:url) { 'http://dc-2' }6768it 'replaces {domain_name} by its correct value' do69expect(finder.potential_urls(opts).keys).to include "#{url}/dc-2.sql"70end71end7273context 'when an IP address' do74let(:url) { 'http://192.168.1.12' }7576it 'replaces {domain_name} by the IP address' do77expect(finder.potential_urls(opts).keys).to include "#{url}/192.168.1.12.sql"78end79end80end8182describe '#aggressive' do83before do84allow(target).to receive(:sub_dir).and_return(false)85expect(target).to receive(:head_or_get_params).and_return(method: :head)8687finder.potential_urls(opts).each_key do |url|88stub_request(:head, url).to_return(status: 404)89end90end9192context 'when all files are 404s' do93it 'returns an empty array' do94expect(finder.aggressive(opts)).to eql []95end96end9798context 'when a zip returns a 200' do99xit100end101102context 'when some files exist' do103let(:found_files) { %w[ex.sql backups/db_backup.sql] }104let(:db_export) { File.read(fixtures.join('dump.sql')) }105106before do107found_files.each do |file|108stub_request(:head, "#{url}#{file}").to_return(status: 200)109110stub_request(:get, "#{url}#{file}")111.with(headers: { 'Range' => 'bytes=0-3000' })112.to_return(body: db_export)113end114115expect(target).to receive(:homepage_or_404?).twice.and_return(false)116end117118context 'when matching the pattern' do119it 'returns the expected Array<DbExport>' do120expected = []121122found_files.each do |file|123url = "#{target.url}#{file}"124expected << WPScan::Model::DbExport.new(125url,126confidence: 100,127found_by: described_class::DIRECT_ACCESS128)129end130131expect(finder.aggressive(opts)).to eql expected132end133end134135context 'when not matching the pattern' do136let(:db_export) { '' }137138it 'returns an empty array' do139expect(finder.aggressive(opts)).to eql []140end141end142end143end144end145146147