Class: Arachni::Checks::OriginSpoofAccessRestrictionBypass
- Inherits:
-
Arachni::Check::Base
- Object
- Arachni::Component::Base
- Arachni::Check::Base
- Arachni::Checks::OriginSpoofAccessRestrictionBypass
- Defined in:
- components/checks/passive/origin_spoof_access_restriction_bypass.rb
Overview
Constant Summary collapse
- HEADERS =
[ 'X-Forwarded-For', 'X-Originating-IP', 'X-Remote-IP', 'X-Remote-Addr' ]
- ADDRESS =
'127.0.0.1'
Constants included from Arachni::Check::Auditor
Arachni::Check::Auditor::DOM_ELEMENTS_WITH_INPUTS, Arachni::Check::Auditor::ELEMENTS_WITH_INPUTS, Arachni::Check::Auditor::FILE_SIGNATURES, Arachni::Check::Auditor::FILE_SIGNATURES_PER_PLATFORM, Arachni::Check::Auditor::Format, Arachni::Check::Auditor::SOURCE_CODE_SIGNATURES_PER_PLATFORM
Constants included from Arachni
BANNER, Arachni::Cookie, Form, Header, JSON, Link, LinkTemplate, NestedCookie, Severity, UIForm, UIInput, VERSION, WEBSITE, WIKI, XML
Instance Attribute Summary
Attributes included from Arachni::Check::Auditor
Class Method Summary collapse
Instance Method Summary collapse
Methods inherited from Arachni::Check::Base
#browser_cluster, #clean_up, elements, exempt_platforms, has_exempt_platforms?, has_platforms?, #initialize, platforms, #plugins, prefer, #preferred, preferred, #prepare, #session, supports_platforms?
Methods included from Arachni::Check::Auditor
#audit, #audit_differential, #audit_signature, #audit_timeout, #audited, #audited?, #buffered_audit, #each_candidate_dom_element, #each_candidate_element, has_timeout_candidates?, #http, #initialize, #log, #log_issue, #log_remote_file, #log_remote_file_if_exists, #match_and_log, #max_issues, #preferred, reset, #skip?, timeout_audit_run, #trace_taint, #with_browser, #with_browser_cluster
Methods inherited from Arachni::Component::Base
author, description, fullname, #shortname, shortname, shortname=, version
Methods included from Arachni::Component::Output
#depersonalize_output, #depersonalize_output?, #intercept_print_message
Methods included from UI::Output
#caller_location, #debug?, #debug_level, #debug_level_1?, #debug_level_2?, #debug_level_3?, #debug_level_4?, #debug_off, #debug_on, #disable_only_positives, #error_buffer, #error_log_fd, #error_logfile, #has_error_log?, #included, #log_error, #mute, #muted?, #only_positives, #only_positives?, #print_bad, #print_debug, #print_debug_backtrace, #print_debug_exception, #print_debug_level_1, #print_debug_level_2, #print_debug_level_3, #print_debug_level_4, #print_error, #print_error_backtrace, #print_exception, #print_info, #print_line, #print_ok, #print_status, #print_verbose, #reroute_to_file, #reroute_to_file?, reset_output_options, #set_error_logfile, #unmute, #verbose?, #verbose_off, #verbose_on
Methods included from Arachni::Component::Utilities
Methods included from Utilities
#available_port, available_port_mutex, #bytes_to_kilobytes, #bytes_to_megabytes, #caller_name, #caller_path, #cookie_decode, #cookie_encode, #cookies_from_file, #cookies_from_parser, #cookies_from_response, #exception_jail, #exclude_path?, #follow_protocol?, #form_decode, #form_encode, #forms_from_parser, #forms_from_response, #full_and_absolute_url?, #generate_token, #get_path, #hms_to_seconds, #html_decode, #html_encode, #include_path?, #links_from_parser, #links_from_response, #normalize_url, #page_from_response, #page_from_url, #parse_set_cookie, #path_in_domain?, #path_too_deep?, #port_available?, #rand_port, #random_seed, #redundant_path?, #regexp_array_match, #remove_constants, #request_parse_body, #seconds_to_hms, #skip_page?, #skip_path?, #skip_resource?, #skip_response?, #to_absolute, #uri_decode, #uri_encode, #uri_parse, #uri_parse_query, #uri_parser, #uri_rewrite
Methods included from Arachni
URI, collect_young_objects, #get_long_win32_filename, jruby?, null_device, profile?, windows?
Constructor Details
This class inherits a constructor from Arachni::Check::Base
Class Method Details
.http_options ⇒ Object
22 23 24 25 26 |
# File 'components/checks/passive/origin_spoof_access_restriction_bypass.rb', line 22 def self. @http_options ||= { headers: HEADERS.inject({}) { |h, header| h.merge( header => ADDRESS ) } } end |
.info ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'components/checks/passive/origin_spoof_access_restriction_bypass.rb', line 45 def self.info { name: 'Origin Spoof Access Restriction Bypass', description: %q{Retries denied requests with a spoofed origin header to trick the web application into thinking that the request originated from localhost and checks whether the restrictions was bypassed.}, elements: [ Element::Server ], author: 'Tasos "Zapotek" Laskos <[email protected]>', version: '0.1', issue: { name: %q{Access restriction bypass via origin spoof}, description: %q{ Origin headers are utilised by proxies and/or load balancers to track the originating IP address of the client. As the request progresses through a proxy, the origin header is added to the existing headers, and the value of the client's IP is then set within this header. Occasionally, poorly implemented access restrictions are based off of the originating IP address alone. For example, any public IP address may be forced to authenticate, while an internal IP address may not. Because this header can also be set by the client, it allows cyber-criminals to spoof their IP address and potentially gain access to restricted pages. Arachni discovered a resource that it did not have permission to access, but been granted access after spoofing the address of localhost (127.0.0.1), thus bypassing any requirement to authenticate. }, tags: %w(access restriction server bypass), severity: Severity::HIGH, remedy_guidance: %q{ Remediation actions may be vastly different depending on the framework being used, and how the application has been coded. However, the origin header should never be used to validate a client's access as it is trivial to change. } } } end |
Instance Method Details
#check_and_log(response) ⇒ Object
34 35 36 37 38 39 40 41 42 43 |
# File 'components/checks/passive/origin_spoof_access_restriction_bypass.rb', line 34 def check_and_log( response ) return if response.code != 200 log( vector: Element::Server.new( response.url ), response: response, proof: response.status_line ) print_ok "Request was accepted: #{response.url}" end |
#run ⇒ Object
28 29 30 31 32 |
# File 'components/checks/passive/origin_spoof_access_restriction_bypass.rb', line 28 def run return if ![401, 403].include?( page.code ) http.get( page.url, self.class., &method(:check_and_log) ) end |