arachni 1.2.1 → 1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/Gemfile +1 -1
- data/README.md +16 -5
- data/components/checks/active/ldap_injection/errors.txt +1 -0
- data/components/checks/active/source_code_disclosure.rb +1 -1
- data/components/checks/active/unvalidated_redirect.rb +6 -6
- data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
- data/components/checks/passive/grep/captcha.rb +14 -5
- data/components/checks/passive/grep/form_upload.rb +7 -3
- data/components/checks/passive/grep/hsts.rb +3 -3
- data/components/checks/passive/grep/html_objects.rb +2 -3
- data/components/checks/passive/grep/http_only_cookies.rb +2 -3
- data/components/checks/passive/grep/insecure_cookies.rb +1 -1
- data/components/checks/passive/grep/password_autocomplete.rb +2 -2
- data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
- data/components/checks/passive/grep/x_frame_options.rb +2 -2
- data/components/checks/passive/http_put.rb +2 -3
- data/components/path_extractors/comments.rb +3 -3
- data/components/path_extractors/scripts.rb +10 -1
- data/components/plugins/defaults/autothrottle.rb +27 -18
- data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
- data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
- data/components/plugins/login_script.rb +9 -3
- data/components/plugins/proxy.rb +4 -3
- data/components/reporters/html.rb +11 -14
- data/components/reporters/html/default/issue.erb +13 -38
- data/components/reporters/html/default/issue/info.erb +1 -1
- data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
- data/components/reporters/stdout.rb +62 -71
- data/components/reporters/xml.rb +26 -40
- data/components/reporters/xml/schema.xsd +43 -89
- data/lib/arachni/browser.rb +52 -3
- data/lib/arachni/browser/javascript.rb +3 -3
- data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
- data/lib/arachni/browser_cluster.rb +61 -0
- data/lib/arachni/browser_cluster/job.rb +21 -1
- data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
- data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
- data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
- data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
- data/lib/arachni/browser_cluster/worker.rb +5 -0
- data/lib/arachni/check/auditor.rb +22 -12
- data/lib/arachni/data/framework.rb +13 -1
- data/lib/arachni/data/issues.rb +9 -25
- data/lib/arachni/element/base.rb +9 -3
- data/lib/arachni/element/capabilities/analyzable.rb +2 -6
- data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
- data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
- data/lib/arachni/element/capabilities/auditable.rb +0 -6
- data/lib/arachni/element/capabilities/dom_only.rb +61 -0
- data/lib/arachni/element/capabilities/with_dom.rb +3 -1
- data/lib/arachni/element/cookie.rb +35 -5
- data/lib/arachni/element/cookie/dom.rb +13 -4
- data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
- data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
- data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
- data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
- data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
- data/lib/arachni/element/form.rb +12 -1
- data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
- data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/form/dom.rb +9 -3
- data/lib/arachni/element/header.rb +14 -33
- data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
- data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
- data/lib/arachni/element/input/dom.rb +71 -0
- data/lib/arachni/element/json.rb +2 -0
- data/lib/arachni/element/link.rb +3 -0
- data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/link/dom.rb +16 -3
- data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
- data/lib/arachni/element/link_template.rb +3 -5
- data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
- data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
- data/lib/arachni/element/link_template/dom.rb +16 -3
- data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
- data/lib/arachni/element/server.rb +3 -5
- data/lib/arachni/element/ui_form.rb +106 -0
- data/lib/arachni/element/ui_form/dom.rb +107 -0
- data/lib/arachni/element/ui_input.rb +62 -0
- data/lib/arachni/element/xml.rb +2 -1
- data/lib/arachni/framework.rb +7 -5
- data/lib/arachni/framework/parts/audit.rb +0 -1
- data/lib/arachni/framework/parts/check.rb +1 -0
- data/lib/arachni/framework/parts/data.rb +4 -0
- data/lib/arachni/framework/parts/state.rb +0 -2
- data/lib/arachni/http/client.rb +17 -6
- data/lib/arachni/http/proxy_server.rb +52 -5
- data/lib/arachni/http/request.rb +1 -1
- data/lib/arachni/issue.rb +34 -179
- data/lib/arachni/issue/severity.rb +2 -0
- data/lib/arachni/option_groups/audit.rb +22 -2
- data/lib/arachni/option_groups/browser_cluster.rb +15 -0
- data/lib/arachni/page.rb +3 -2
- data/lib/arachni/parser.rb +24 -5
- data/lib/arachni/platform/manager.rb +1 -2
- data/lib/arachni/rpc/server/framework.rb +3 -4
- data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
- data/lib/arachni/session.rb +1 -1
- data/lib/arachni/trainer.rb +4 -7
- data/lib/arachni/watir/element.rb +12 -1
- data/lib/version +1 -1
- data/spec/arachni/browser/element_locator_spec.rb +43 -43
- data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
- data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
- data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
- data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
- data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
- data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
- data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
- data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
- data/spec/arachni/browser/javascript_spec.rb +73 -63
- data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
- data/spec/arachni/browser_cluster/job_spec.rb +68 -48
- data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
- data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
- data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
- data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
- data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
- data/spec/arachni/browser_cluster_spec.rb +64 -39
- data/spec/arachni/browser_spec.rb +692 -527
- data/spec/arachni/check/auditor_spec.rb +177 -147
- data/spec/arachni/check/base_spec.rb +33 -33
- data/spec/arachni/check/manager_spec.rb +15 -15
- data/spec/arachni/component/base_spec.rb +8 -8
- data/spec/arachni/component/manager_spec.rb +100 -99
- data/spec/arachni/component/options/address_spec.rb +3 -3
- data/spec/arachni/component/options/base_spec.rb +7 -7
- data/spec/arachni/component/options/bool_spec.rb +9 -9
- data/spec/arachni/component/options/float_spec.rb +6 -6
- data/spec/arachni/component/options/int_spec.rb +5 -5
- data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
- data/spec/arachni/component/options/object_spec.rb +2 -2
- data/spec/arachni/component/options/path_spec.rb +3 -3
- data/spec/arachni/component/options/port_spec.rb +5 -5
- data/spec/arachni/component/options/string_spec.rb +3 -3
- data/spec/arachni/component/options/url_spec.rb +4 -4
- data/spec/arachni/component/utilities_spec.rb +2 -2
- data/spec/arachni/data/framework/rpc_spec.rb +10 -9
- data/spec/arachni/data/framework_spec.rb +65 -46
- data/spec/arachni/data/issues_spec.rb +39 -77
- data/spec/arachni/data/plugins_spec.rb +11 -11
- data/spec/arachni/data/session_spec.rb +6 -6
- data/spec/arachni/data_spec.rb +8 -8
- data/spec/arachni/element/body_spec.rb +10 -10
- data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
- data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
- data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
- data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
- data/spec/arachni/element/cookie/dom_spec.rb +37 -18
- data/spec/arachni/element/cookie_spec.rb +206 -139
- data/spec/arachni/element/form/dom_spec.rb +36 -19
- data/spec/arachni/element/form_spec.rb +210 -187
- data/spec/arachni/element/generic_dom_spec.rb +14 -14
- data/spec/arachni/element/header_spec.rb +35 -17
- data/spec/arachni/element/json_spec.rb +53 -31
- data/spec/arachni/element/link/dom_spec.rb +46 -28
- data/spec/arachni/element/link_spec.rb +58 -40
- data/spec/arachni/element/link_template/dom_spec.rb +47 -29
- data/spec/arachni/element/link_template_spec.rb +79 -61
- data/spec/arachni/element/path_spec.rb +1 -1
- data/spec/arachni/element/server_spec.rb +33 -32
- data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
- data/spec/arachni/element/ui_form_spec.rb +242 -0
- data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
- data/spec/arachni/element/ui_input_spec.rb +136 -0
- data/spec/arachni/element/xml_spec.rb +42 -24
- data/spec/arachni/element_filter_spec.rb +49 -48
- data/spec/arachni/error_spec.rb +3 -3
- data/spec/arachni/framework/parts/audit_spec.rb +64 -63
- data/spec/arachni/framework/parts/browser_spec.rb +16 -16
- data/spec/arachni/framework/parts/check_spec.rb +3 -3
- data/spec/arachni/framework/parts/data_spec.rb +48 -48
- data/spec/arachni/framework/parts/platform_spec.rb +3 -3
- data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
- data/spec/arachni/framework/parts/report_spec.rb +7 -7
- data/spec/arachni/framework/parts/scope_spec.rb +16 -16
- data/spec/arachni/framework/parts/state_spec.rb +68 -69
- data/spec/arachni/framework_spec.rb +39 -31
- data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
- data/spec/arachni/http/client_spec.rb +219 -208
- data/spec/arachni/http/cookie_jar_spec.rb +72 -72
- data/spec/arachni/http/headers_spec.rb +14 -14
- data/spec/arachni/http/proxy_server_spec.rb +43 -42
- data/spec/arachni/http/request_spec.rb +105 -103
- data/spec/arachni/http/response/scope_spec.rb +24 -24
- data/spec/arachni/http/response_spec.rb +50 -49
- data/spec/arachni/issue/severity_spec.rb +10 -9
- data/spec/arachni/issue_spec.rb +71 -369
- data/spec/arachni/option_groups/audit_spec.rb +114 -114
- data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
- data/spec/arachni/option_groups/datastore_spec.rb +6 -6
- data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
- data/spec/arachni/option_groups/http_spec.rb +11 -11
- data/spec/arachni/option_groups/input_spec.rb +31 -27
- data/spec/arachni/option_groups/output_spec.rb +2 -2
- data/spec/arachni/option_groups/paths_spec.rb +17 -17
- data/spec/arachni/option_groups/rpc_spec.rb +2 -2
- data/spec/arachni/option_groups/scope_spec.rb +40 -40
- data/spec/arachni/option_groups/session_spec.rb +6 -5
- data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
- data/spec/arachni/options_spec.rb +46 -45
- data/spec/arachni/page/dom/transition_spec.rb +74 -72
- data/spec/arachni/page/dom_spec.rb +35 -35
- data/spec/arachni/page/scope_spec.rb +15 -15
- data/spec/arachni/page_spec.rb +217 -217
- data/spec/arachni/parser_spec.rb +106 -104
- data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
- data/spec/arachni/platform/list_spec.rb +33 -33
- data/spec/arachni/platform/manager_spec.rb +67 -64
- data/spec/arachni/plugin/base_spec.rb +10 -10
- data/spec/arachni/plugin/manager_spec.rb +38 -37
- data/spec/arachni/report_spec.rb +43 -40
- data/spec/arachni/reporter/base_spec.rb +15 -15
- data/spec/arachni/reporter/manager_spec.rb +4 -4
- data/spec/arachni/reporter/options_spec.rb +6 -6
- data/spec/arachni/rpc/client/base_spec.rb +6 -6
- data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
- data/spec/arachni/rpc/client/instance_spec.rb +6 -6
- data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
- data/spec/arachni/rpc/server/base_spec.rb +5 -5
- data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
- data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
- data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
- data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
- data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
- data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
- data/spec/arachni/rpc/server/framework_spec.rb +90 -85
- data/spec/arachni/rpc/server/instance_spec.rb +126 -107
- data/spec/arachni/rpc/server/output_spec.rb +1 -1
- data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
- data/spec/arachni/ruby/array_spec.rb +42 -42
- data/spec/arachni/ruby/hash_spec.rb +20 -18
- data/spec/arachni/ruby/io_spec.rb +2 -2
- data/spec/arachni/ruby/object_spec.rb +1 -1
- data/spec/arachni/ruby/set_spec.rb +3 -3
- data/spec/arachni/ruby/string_spec.rb +30 -30
- data/spec/arachni/ruby/webrick_spec.rb +2 -2
- data/spec/arachni/scope_spec.rb +1 -1
- data/spec/arachni/session_spec.rb +67 -64
- data/spec/arachni/snapshot_spec.rb +15 -15
- data/spec/arachni/state/audit_spec.rb +11 -11
- data/spec/arachni/state/element_filter_spec.rb +6 -6
- data/spec/arachni/state/framework/rpc_spec.rb +12 -12
- data/spec/arachni/state/framework_spec.rb +125 -121
- data/spec/arachni/state/http_spec.rb +7 -7
- data/spec/arachni/state/options_spec.rb +7 -7
- data/spec/arachni/state/plugins_spec.rb +8 -8
- data/spec/arachni/state_spec.rb +10 -10
- data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
- data/spec/arachni/support/buffer/base_spec.rb +39 -39
- data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
- data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
- data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
- data/spec/arachni/support/cache/preference_spec.rb +4 -4
- data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
- data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
- data/spec/arachni/support/database/hash_spec.rb +44 -43
- data/spec/arachni/support/database/queue_spec.rb +27 -27
- data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
- data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
- data/spec/arachni/support/mixins/observable_spec.rb +6 -6
- data/spec/arachni/support/signature_spec.rb +19 -19
- data/spec/arachni/trainer_spec.rb +39 -39
- data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
- data/spec/arachni/uri/scope_spec.rb +66 -66
- data/spec/arachni/uri_spec.rb +107 -105
- data/spec/arachni/utilities_spec.rb +40 -40
- data/spec/components/checks/active/csrf_spec.rb +8 -8
- data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
- data/spec/components/checks/active/sql_injection_spec.rb +16 -16
- data/spec/components/checks/active/trainer_spec.rb +4 -4
- data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
- data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
- data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
- data/spec/components/checks/active/xss_dom_spec.rb +46 -24
- data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
- data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
- data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
- data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
- data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
- data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
- data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
- data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
- data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
- data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
- data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
- data/spec/components/checks/passive/webdav_spec.rb +1 -1
- data/spec/components/checks/passive/xst_spec.rb +1 -1
- data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
- data/spec/components/path_extractors/comments_spec.rb +5 -1
- data/spec/components/path_extractors/scripts_spec.rb +5 -2
- data/spec/components/plugins/autologin_spec.rb +22 -22
- data/spec/components/plugins/autothrottle_spec.rb +6 -5
- data/spec/components/plugins/content_types_spec.rb +4 -4
- data/spec/components/plugins/cookie_collector_spec.rb +5 -5
- data/spec/components/plugins/exec_spec.rb +12 -12
- data/spec/components/plugins/form_dicattack_spec.rb +3 -3
- data/spec/components/plugins/headers_collector_spec.rb +8 -8
- data/spec/components/plugins/healthmap_spec.rb +3 -3
- data/spec/components/plugins/http_dicattack_spec.rb +3 -3
- data/spec/components/plugins/login_script_spec.rb +79 -22
- data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
- data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
- data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
- data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
- data/spec/components/plugins/script_spec.rb +1 -1
- data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
- data/spec/components/plugins/vector_collector_spec.rb +2 -2
- data/spec/components/plugins/vector_feed_spec.rb +40 -40
- data/spec/components/plugins/waf_detector_spec.rb +6 -6
- data/spec/components/reporters/json_spec.rb +4 -4
- data/spec/components/reporters/marshal_spec.rb +2 -2
- data/spec/components/reporters/yaml_spec.rb +3 -2
- data/spec/external/wavsep/active/sqli_spec.rb +1 -3
- data/spec/spec_helper.rb +4 -0
- data/spec/support/factories/element/ui_form.rb +14 -0
- data/spec/support/factories/element/ui_input.rb +13 -0
- data/spec/support/factories/issue.rb +0 -13
- data/spec/support/fixtures/report.afr +0 -0
- data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
- data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
- data/spec/support/helpers/framework.rb +1 -1
- data/spec/support/helpers/pages.rb +2 -2
- data/spec/support/servers/arachni/browser.rb +139 -0
- data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
- data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
- data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
- data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
- data/spec/support/servers/checks/active/trainer_check.rb +7 -7
- data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
- data/spec/support/servers/checks/active/xss_dom.rb +50 -0
- data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
- data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
- data/spec/support/shared/check.rb +10 -12
- data/spec/support/shared/component/options/base.rb +24 -24
- data/spec/support/shared/element/base.rb +25 -25
- data/spec/support/shared/element/capabilities/auditable.rb +116 -140
- data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
- data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
- data/spec/support/shared/element/capabilities/mutable.rb +122 -111
- data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
- data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
- data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
- data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
- data/spec/support/shared/element/capabilities/with_node.rb +4 -6
- data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
- data/spec/support/shared/element/capabilities/with_source.rb +6 -8
- data/spec/support/shared/element/dom.rb +144 -0
- data/spec/support/shared/element/dom/auditable.rb +42 -0
- data/spec/support/shared/element/dom/inputtable.rb +5 -0
- data/spec/support/shared/element/dom/mutable.rb +3 -0
- data/spec/support/shared/element/dom/submittable.rb +119 -0
- data/spec/support/shared/external/wavsep.rb +3 -3
- data/spec/support/shared/fingerprinter.rb +2 -2
- data/spec/support/shared/framework.rb +1 -1
- data/spec/support/shared/http/message.rb +9 -9
- data/spec/support/shared/option_group.rb +17 -17
- data/spec/support/shared/path_extractor.rb +1 -1
- data/spec/support/shared/plugin.rb +2 -2
- data/spec/support/shared/support/cache.rb +57 -57
- data/spec/support/shared/support/lookup.rb +25 -25
- data/ui/cli/framework.rb +22 -11
- data/ui/cli/framework/option_parser.rb +15 -0
- data/ui/cli/option_parser.rb +8 -1
- data/ui/cli/output.rb +2 -1
- metadata +54 -20
- data/components/checks/active/xss_dom_inputs.rb +0 -236
- data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
- data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
- data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
data/lib/arachni/element/form.rb
CHANGED
@@ -21,6 +21,8 @@ class Form < Base
|
|
21
21
|
Dir.glob( lib ).each { |f| require f }
|
22
22
|
|
23
23
|
# Generic element capabilities.
|
24
|
+
include Arachni::Element::Capabilities::WithNode
|
25
|
+
include Arachni::Element::Capabilities::Inputtable
|
24
26
|
include Arachni::Element::Capabilities::Analyzable
|
25
27
|
include Arachni::Element::Capabilities::Refreshable
|
26
28
|
|
@@ -403,7 +405,16 @@ class Form < Base
|
|
403
405
|
#
|
404
406
|
# @return [String]
|
405
407
|
def decode( string )
|
406
|
-
|
408
|
+
string = string.to_s
|
409
|
+
|
410
|
+
# Fast, but could throw error.
|
411
|
+
begin
|
412
|
+
::URI.decode_www_form_component string
|
413
|
+
|
414
|
+
# Slower, but reliable.
|
415
|
+
rescue ArgumentError
|
416
|
+
URI.decode( string.gsub( '+', ' ' ) )
|
417
|
+
end
|
407
418
|
end
|
408
419
|
|
409
420
|
end
|
@@ -92,7 +92,8 @@ module Mutable
|
|
92
92
|
inputs.keys.each do |input|
|
93
93
|
next if field_type_for( input ) != :select
|
94
94
|
|
95
|
-
|
95
|
+
escape = "'#{input.split( "'" ).join( "', \"'\", '" )}', ''"
|
96
|
+
node.xpath( "select[@name=concat(#{escape})]" ).css('option').each do |option|
|
96
97
|
try_input do
|
97
98
|
elem = self.dup
|
98
99
|
elem.mutation_with_original_values
|
@@ -6,6 +6,8 @@
|
|
6
6
|
web site for more information on licensing and terms of use.
|
7
7
|
=end
|
8
8
|
|
9
|
+
require_relative '../dom'
|
10
|
+
|
9
11
|
module Arachni::Element
|
10
12
|
class Form
|
11
13
|
|
@@ -13,9 +15,13 @@ class Form
|
|
13
15
|
# functionality.
|
14
16
|
#
|
15
17
|
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
16
|
-
class DOM <
|
18
|
+
class DOM < DOM
|
17
19
|
include Arachni::Element::Capabilities::WithNode
|
18
|
-
|
20
|
+
|
21
|
+
include Arachni::Element::DOM::Capabilities::Mutable
|
22
|
+
include Arachni::Element::DOM::Capabilities::Inputtable
|
23
|
+
include Arachni::Element::DOM::Capabilities::Submittable
|
24
|
+
include Arachni::Element::DOM::Capabilities::Auditable
|
19
25
|
|
20
26
|
def initialize( options )
|
21
27
|
super
|
@@ -29,7 +35,7 @@ class DOM < Base
|
|
29
35
|
|
30
36
|
# Submits the form using the configured {#inputs}.
|
31
37
|
def trigger
|
32
|
-
browser.fire_event element, :submit, inputs: inputs.dup
|
38
|
+
[ browser.fire_event( element, :submit, inputs: inputs.dup ) ]
|
33
39
|
end
|
34
40
|
|
35
41
|
def valid_input_name?( name )
|
@@ -14,9 +14,21 @@ module Arachni::Element
|
|
14
14
|
#
|
15
15
|
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
16
16
|
class Header < Base
|
17
|
-
include Capabilities::Analyzable
|
18
17
|
|
19
|
-
|
18
|
+
# Load and include all form-specific capability overrides.
|
19
|
+
lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
|
20
|
+
Dir.glob( lib ).each { |f| require f }
|
21
|
+
|
22
|
+
# Generic element capabilities.
|
23
|
+
include Arachni::Element::Capabilities::Auditable
|
24
|
+
include Arachni::Element::Capabilities::Submittable
|
25
|
+
include Arachni::Element::Capabilities::Inputtable
|
26
|
+
include Arachni::Element::Capabilities::Analyzable
|
27
|
+
|
28
|
+
# Header-specific overrides.
|
29
|
+
include Capabilities::Mutable
|
30
|
+
include Capabilities::Inputtable
|
31
|
+
|
20
32
|
ENCODE_CHARACTERS = ["\n", "\r"]
|
21
33
|
ENCODE_CHARACTERS_LIST = ENCODE_CHARACTERS.join
|
22
34
|
|
@@ -32,37 +44,6 @@ class Header < Base
|
|
32
44
|
@inputs.dup
|
33
45
|
end
|
34
46
|
|
35
|
-
# Overrides {Capabilities::Mutable#each_mutation} to handle header-specific
|
36
|
-
# limitations.
|
37
|
-
#
|
38
|
-
# @param (see Capabilities::Mutable#each_mutation)
|
39
|
-
# @return (see Capabilities::Mutable#each_mutation)
|
40
|
-
# @yield (see Capabilities::Mutable#each_mutation)
|
41
|
-
# @yieldparam (see Capabilities::Mutable#each_mutation)
|
42
|
-
#
|
43
|
-
# @see Capabilities::Mutable#each_mutation
|
44
|
-
def each_mutation( payload, options = {}, &block )
|
45
|
-
parameter_names = options.delete( :parameter_names )
|
46
|
-
super( payload, options, &block )
|
47
|
-
|
48
|
-
return if !parameter_names
|
49
|
-
|
50
|
-
if !valid_input_name_data?( payload )
|
51
|
-
print_debug_level_2 'Payload not supported as input name by' <<
|
52
|
-
" #{audit_id}: #{payload.inspect}"
|
53
|
-
return
|
54
|
-
end
|
55
|
-
|
56
|
-
elem = self.dup
|
57
|
-
elem.affected_input_name = FUZZ_NAME
|
58
|
-
elem.inputs = { payload => FUZZ_NAME_VALUE }
|
59
|
-
yield elem
|
60
|
-
end
|
61
|
-
|
62
|
-
def valid_input_data?( data )
|
63
|
-
!INVALID_INPUT_DATA.find { |c| data.include? c }
|
64
|
-
end
|
65
|
-
|
66
47
|
# @return [String]
|
67
48
|
# Header name.
|
68
49
|
def name
|
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
|
3
|
+
|
4
|
+
This file is part of the Arachni Framework project and is subject to
|
5
|
+
redistribution and commercial restrictions. Please see the Arachni Framework
|
6
|
+
web site for more information on licensing and terms of use.
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Arachni::Element
|
10
|
+
class Header
|
11
|
+
module Capabilities
|
12
|
+
|
13
|
+
# Extends {Arachni::Element::Capabilities::Inputtable} with {Header}-specific
|
14
|
+
# functionality.
|
15
|
+
#
|
16
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
17
|
+
module Inputtable
|
18
|
+
include Arachni::Element::Capabilities::Inputtable
|
19
|
+
|
20
|
+
INVALID_INPUT_DATA = [ "\0" ]
|
21
|
+
|
22
|
+
def valid_input_data?( data )
|
23
|
+
!INVALID_INPUT_DATA.find { |c| data.include? c }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
|
3
|
+
|
4
|
+
This file is part of the Arachni Framework project and is subject to
|
5
|
+
redistribution and commercial restrictions. Please see the Arachni Framework
|
6
|
+
web site for more information on licensing and terms of use.
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Arachni::Element
|
10
|
+
class Header
|
11
|
+
module Capabilities
|
12
|
+
|
13
|
+
# Extends {Arachni::Element::Capabilities::Mutable} with {Header}-specific
|
14
|
+
# functionality.
|
15
|
+
#
|
16
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
17
|
+
module Mutable
|
18
|
+
include Arachni::Element::Capabilities::Mutable
|
19
|
+
|
20
|
+
# Overrides {Capabilities::Mutable#each_mutation} to handle header-specific
|
21
|
+
# limitations.
|
22
|
+
#
|
23
|
+
# @param (see Capabilities::Mutable#each_mutation)
|
24
|
+
# @return (see Capabilities::Mutable#each_mutation)
|
25
|
+
# @yield (see Capabilities::Mutable#each_mutation)
|
26
|
+
# @yieldparam (see Capabilities::Mutable#each_mutation)
|
27
|
+
#
|
28
|
+
# @see Capabilities::Mutable#each_mutation
|
29
|
+
def each_mutation( payload, options = {}, &block )
|
30
|
+
parameter_names = options.delete( :parameter_names )
|
31
|
+
super( payload, options, &block )
|
32
|
+
|
33
|
+
return if !parameter_names
|
34
|
+
|
35
|
+
if !valid_input_name_data?( payload )
|
36
|
+
print_debug_level_2 'Payload not supported as input name by' <<
|
37
|
+
" #{audit_id}: #{payload.inspect}"
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
elem = self.dup
|
42
|
+
elem.affected_input_name = FUZZ_NAME
|
43
|
+
elem.inputs = { payload => FUZZ_NAME_VALUE }
|
44
|
+
yield elem
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
|
3
|
+
|
4
|
+
This file is part of the Arachni Framework project and is subject to
|
5
|
+
redistribution and commercial restrictions. Please see the Arachni Framework
|
6
|
+
web site for more information on licensing and terms of use.
|
7
|
+
=end
|
8
|
+
|
9
|
+
require_relative '../dom'
|
10
|
+
|
11
|
+
module Arachni::Element
|
12
|
+
class UIInput
|
13
|
+
|
14
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
15
|
+
class DOM < DOM
|
16
|
+
include Arachni::Element::Capabilities::WithNode
|
17
|
+
|
18
|
+
include Arachni::Element::DOM::Capabilities::Mutable
|
19
|
+
include Arachni::Element::DOM::Capabilities::Inputtable
|
20
|
+
include Arachni::Element::DOM::Capabilities::Submittable
|
21
|
+
include Arachni::Element::DOM::Capabilities::Auditable
|
22
|
+
|
23
|
+
def initialize( options )
|
24
|
+
super
|
25
|
+
|
26
|
+
self.method = options[:method] || self.parent.method
|
27
|
+
|
28
|
+
if options[:inputs]
|
29
|
+
@valid_input_name = options[:inputs].keys.first.to_s
|
30
|
+
self.inputs = options[:inputs]
|
31
|
+
else
|
32
|
+
@valid_input_name = (locator.attributes['name'] || locator.attributes['id']).to_s
|
33
|
+
self.inputs = {
|
34
|
+
@valid_input_name => locator.attributes['value']
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
@default_inputs = self.inputs.dup.freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
# Submits the form using the configured {#inputs}.
|
42
|
+
def trigger
|
43
|
+
[ browser.fire_event( element, @method, value: value ) ]
|
44
|
+
end
|
45
|
+
|
46
|
+
def name
|
47
|
+
inputs.keys.first
|
48
|
+
end
|
49
|
+
|
50
|
+
def value
|
51
|
+
inputs.values.first
|
52
|
+
end
|
53
|
+
|
54
|
+
def valid_input_name?( name )
|
55
|
+
@valid_input_name == name.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def type
|
59
|
+
self.class.type
|
60
|
+
end
|
61
|
+
def self.type
|
62
|
+
:ui_input_dom
|
63
|
+
end
|
64
|
+
|
65
|
+
def initialization_options
|
66
|
+
super.merge( inputs: inputs.dup, method: @method )
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/arachni/element/json.rb
CHANGED
@@ -21,6 +21,8 @@ class JSON < Base
|
|
21
21
|
Dir.glob( lib ).each { |f| require f }
|
22
22
|
|
23
23
|
# Generic element capabilities.
|
24
|
+
include Arachni::Element::Capabilities::Auditable
|
25
|
+
include Arachni::Element::Capabilities::Submittable
|
24
26
|
include Arachni::Element::Capabilities::Analyzable
|
25
27
|
include Arachni::Element::Capabilities::WithSource
|
26
28
|
|
data/lib/arachni/element/link.rb
CHANGED
@@ -21,6 +21,9 @@ class Link < Base
|
|
21
21
|
Dir.glob( lib ).each { |f| require f }
|
22
22
|
|
23
23
|
# Generic element capabilities.
|
24
|
+
include Arachni::Element::Capabilities::WithNode
|
25
|
+
include Arachni::Element::Capabilities::Mutable
|
26
|
+
include Arachni::Element::Capabilities::Inputtable
|
24
27
|
include Arachni::Element::Capabilities::Analyzable
|
25
28
|
include Arachni::Element::Capabilities::Refreshable
|
26
29
|
|
@@ -6,15 +6,28 @@
|
|
6
6
|
web site for more information on licensing and terms of use.
|
7
7
|
=end
|
8
8
|
|
9
|
+
require_relative '../dom'
|
10
|
+
|
9
11
|
module Arachni::Element
|
10
12
|
class Link
|
11
13
|
|
12
14
|
# Provides access to DOM operations for {Link links}.
|
13
15
|
#
|
14
16
|
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
15
|
-
class DOM <
|
17
|
+
class DOM < DOM
|
18
|
+
|
19
|
+
# Load and include all link-specific capability overrides.
|
20
|
+
lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
|
21
|
+
Dir.glob( lib ).each { |f| require f }
|
22
|
+
|
23
|
+
# Generic element capabilities.
|
16
24
|
include Arachni::Element::Capabilities::WithNode
|
17
|
-
include Arachni::Element::Capabilities::
|
25
|
+
include Arachni::Element::DOM::Capabilities::Mutable
|
26
|
+
include Arachni::Element::DOM::Capabilities::Inputtable
|
27
|
+
include Arachni::Element::DOM::Capabilities::Auditable
|
28
|
+
|
29
|
+
# Link-specific overrides.
|
30
|
+
include Capabilities::Submittable
|
18
31
|
|
19
32
|
# @return [String, nil]
|
20
33
|
# URL fragment.
|
@@ -46,7 +59,7 @@ class DOM < Base
|
|
46
59
|
|
47
60
|
# Loads the page with the {#inputs} in the {#fragment}.
|
48
61
|
def trigger
|
49
|
-
browser.goto to_s, take_snapshot: false, update_transitions: false
|
62
|
+
[ browser.goto( to_s, take_snapshot: false, update_transitions: false ) ]
|
50
63
|
end
|
51
64
|
|
52
65
|
def valid_input_name?( name )
|
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
|
3
|
+
|
4
|
+
This file is part of the Arachni Framework project and is subject to
|
5
|
+
redistribution and commercial restrictions. Please see the Arachni Framework
|
6
|
+
web site for more information on licensing and terms of use.
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Arachni::Element
|
10
|
+
class Link::DOM
|
11
|
+
module Capabilities
|
12
|
+
|
13
|
+
# Extends {Arachni::Element::DOM::Capabilities::Submittable} with {Link}-specific
|
14
|
+
# functionality.
|
15
|
+
#
|
16
|
+
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
17
|
+
module Submittable
|
18
|
+
include Arachni::Element::DOM::Capabilities::Submittable
|
19
|
+
|
20
|
+
def prepare_browser( browser, options )
|
21
|
+
@browser = browser
|
22
|
+
browser.javascript.custom_code = options[:custom_code]
|
23
|
+
browser.javascript.taint = options[:taint]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -22,6 +22,9 @@ class LinkTemplate < Base
|
|
22
22
|
Dir.glob( lib ).each { |f| require f }
|
23
23
|
|
24
24
|
# Generic element capabilities.
|
25
|
+
include Arachni::Element::Capabilities::WithNode
|
26
|
+
include Arachni::Element::Capabilities::Mutable
|
27
|
+
include Arachni::Element::Capabilities::Submittable
|
25
28
|
include Arachni::Element::Capabilities::Analyzable
|
26
29
|
|
27
30
|
# LinkTemplate-specific overrides.
|
@@ -29,11 +32,6 @@ class LinkTemplate < Base
|
|
29
32
|
include Capabilities::Inputtable
|
30
33
|
include Capabilities::Auditable
|
31
34
|
|
32
|
-
INVALID_INPUT_DATA = [
|
33
|
-
# Protocol URLs require a // which we can't preserve.
|
34
|
-
'://'
|
35
|
-
]
|
36
|
-
|
37
35
|
# @return [Regexp]
|
38
36
|
# Regular expressions with named captures, serving as templates used to
|
39
37
|
# identify and manipulate inputs in {#action}.
|
@@ -6,15 +6,28 @@
|
|
6
6
|
web site for more information on licensing and terms of use.
|
7
7
|
=end
|
8
8
|
|
9
|
+
require_relative '../dom'
|
10
|
+
|
9
11
|
module Arachni::Element
|
10
12
|
class LinkTemplate
|
11
13
|
|
12
14
|
# Provides access to DOM operations for {LinkTemplate link templates}.
|
13
15
|
#
|
14
16
|
# @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
|
15
|
-
class DOM <
|
17
|
+
class DOM < DOM
|
18
|
+
|
19
|
+
# Load and include all link-specific capability overrides.
|
20
|
+
lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
|
21
|
+
Dir.glob( lib ).each { |f| require f }
|
22
|
+
|
23
|
+
# Generic element capabilities.
|
16
24
|
include Arachni::Element::Capabilities::WithNode
|
17
|
-
include Arachni::Element::Capabilities::
|
25
|
+
include Arachni::Element::DOM::Capabilities::Mutable
|
26
|
+
include Arachni::Element::DOM::Capabilities::Inputtable
|
27
|
+
include Arachni::Element::DOM::Capabilities::Auditable
|
28
|
+
|
29
|
+
# LinkTtemplate-specific overrides.
|
30
|
+
include Capabilities::Submittable
|
18
31
|
|
19
32
|
# @return [String, nil]
|
20
33
|
# URL fragment.
|
@@ -37,7 +50,7 @@ class DOM < Base
|
|
37
50
|
|
38
51
|
# Loads {#to_s}.
|
39
52
|
def trigger
|
40
|
-
browser.goto to_s, take_snapshot: false, update_transitions: false
|
53
|
+
[ browser.goto( to_s, take_snapshot: false, update_transitions: false ) ]
|
41
54
|
end
|
42
55
|
|
43
56
|
# @param [String] name
|