arachni 1.4 → 1.6.0
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 +5 -5
- data/CHANGELOG.md +195 -0
- data/Gemfile +4 -4
- data/LICENSE.md +1 -1
- data/README.md +7 -3
- data/Rakefile +1 -43
- data/arachni.gemspec +35 -30
- data/bin/arachni +1 -1
- data/bin/arachni_console +1 -1
- data/bin/arachni_multi +6 -1
- data/bin/arachni_reporter +1 -1
- data/bin/arachni_reproduce +12 -0
- data/bin/arachni_rest_server +1 -1
- data/bin/arachni_restore +1 -1
- data/bin/arachni_rpc +6 -1
- data/bin/arachni_rpcd +1 -1
- data/bin/arachni_rpcd_monitor +6 -1
- data/bin/arachni_script +1 -1
- data/components/checks/active/code_injection.rb +1 -1
- data/components/checks/active/code_injection_php_input_wrapper.rb +1 -1
- data/components/checks/active/code_injection_timing.rb +1 -1
- data/components/checks/active/csrf.rb +20 -75
- data/components/checks/active/file_inclusion.rb +1 -1
- data/components/checks/active/ldap_injection.rb +1 -1
- data/components/checks/active/no_sql_injection.rb +1 -1
- data/components/checks/active/no_sql_injection_differential.rb +3 -3
- data/components/checks/active/os_cmd_injection.rb +1 -1
- data/components/checks/active/os_cmd_injection_timing.rb +1 -1
- data/components/checks/active/path_traversal.rb +3 -3
- data/components/checks/active/response_splitting.rb +1 -1
- data/components/checks/active/rfi.rb +1 -1
- data/components/checks/active/session_fixation.rb +1 -1
- data/components/checks/active/source_code_disclosure.rb +1 -1
- data/components/checks/active/sql_injection/regexps/hsqldb.yaml +1 -0
- data/components/checks/active/sql_injection/substrings/hsqldb +1 -0
- data/components/checks/active/sql_injection/substrings/java +4 -0
- data/components/checks/active/sql_injection/substrings/oracle +0 -1
- data/components/checks/active/sql_injection/substrings/sqlite +1 -0
- data/components/checks/active/sql_injection.rb +1 -1
- data/components/checks/active/sql_injection_differential.rb +3 -3
- data/components/checks/active/sql_injection_timing.rb +1 -1
- data/components/checks/active/trainer.rb +1 -1
- data/components/checks/active/unvalidated_redirect.rb +34 -11
- data/components/checks/active/unvalidated_redirect_dom.rb +4 -4
- data/components/checks/active/xpath_injection.rb +1 -1
- data/components/checks/active/xss.rb +54 -29
- data/components/checks/active/xss_dom.rb +15 -11
- data/components/checks/active/xss_dom_script_context.rb +4 -6
- data/components/checks/active/xss_event.rb +46 -34
- data/components/checks/active/xss_path.rb +9 -6
- data/components/checks/active/xss_script_context.rb +100 -47
- data/components/checks/active/xss_tag.rb +41 -15
- data/components/checks/active/xxe.rb +1 -1
- data/components/checks/passive/allowed_methods.rb +1 -1
- data/components/checks/passive/backdoors.rb +1 -1
- data/components/checks/passive/backup_directories.rb +15 -3
- data/components/checks/passive/backup_files.rb +39 -6
- data/components/checks/passive/common_admin_interfaces/admin-panels.txt +1 -0
- data/components/checks/passive/common_admin_interfaces.rb +1 -1
- data/components/checks/passive/common_directories/directories.txt +1 -0
- data/components/checks/passive/common_directories.rb +1 -1
- data/components/checks/passive/common_files.rb +1 -1
- data/components/checks/passive/directory_listing.rb +1 -1
- data/components/checks/passive/grep/captcha.rb +8 -9
- data/components/checks/passive/grep/cookie_set_for_parent_domain.rb +1 -1
- data/components/checks/passive/grep/credit_card.rb +1 -1
- data/components/checks/passive/grep/cvs_svn_users.rb +1 -1
- data/components/checks/passive/grep/emails.rb +1 -1
- data/components/checks/passive/grep/form_upload.rb +3 -5
- data/components/checks/passive/grep/hsts.rb +1 -1
- data/components/checks/passive/grep/html_objects.rb +1 -1
- data/components/checks/passive/grep/http_only_cookies.rb +1 -1
- data/components/checks/passive/grep/insecure_cookies.rb +5 -5
- data/components/checks/passive/grep/insecure_cors_policy.rb +1 -1
- data/components/checks/passive/grep/mixed_resource.rb +4 -4
- data/components/checks/passive/grep/password_autocomplete.rb +1 -1
- data/components/checks/passive/grep/private_ip.rb +1 -1
- data/components/checks/passive/grep/ssn.rb +1 -1
- data/components/checks/passive/grep/unencrypted_password_forms.rb +3 -3
- data/components/checks/passive/grep/x_frame_options.rb +4 -4
- data/components/checks/passive/htaccess_limit.rb +1 -1
- data/components/checks/passive/http_put.rb +1 -1
- data/components/checks/passive/insecure_client_access_policy.rb +2 -2
- data/components/checks/passive/insecure_cross_domain_policy_access.rb +2 -2
- data/components/checks/passive/insecure_cross_domain_policy_headers.rb +2 -2
- data/components/checks/passive/interesting_responses.rb +1 -1
- data/components/checks/passive/localstart_asp.rb +1 -1
- data/components/checks/passive/origin_spoof_access_restriction_bypass.rb +1 -1
- data/components/checks/passive/webdav.rb +1 -1
- data/components/checks/passive/xst.rb +10 -12
- data/components/fingerprinters/frameworks/aspx_mvc.rb +1 -1
- data/components/fingerprinters/frameworks/cakephp.rb +1 -1
- data/components/fingerprinters/frameworks/cherrypy.rb +1 -1
- data/components/fingerprinters/frameworks/django.rb +1 -1
- data/components/fingerprinters/frameworks/jsf.rb +1 -1
- data/components/fingerprinters/frameworks/nette.rb +1 -1
- data/components/fingerprinters/frameworks/rack.rb +1 -1
- data/components/fingerprinters/frameworks/rails.rb +1 -1
- data/components/fingerprinters/frameworks/symfony.rb +1 -1
- data/components/fingerprinters/languages/asp.rb +1 -1
- data/components/fingerprinters/languages/aspx.rb +1 -1
- data/components/fingerprinters/languages/java.rb +1 -1
- data/components/fingerprinters/languages/php.rb +1 -1
- data/components/fingerprinters/languages/python.rb +1 -1
- data/components/fingerprinters/languages/ruby.rb +1 -1
- data/components/fingerprinters/os/bsd.rb +1 -1
- data/components/fingerprinters/os/linux.rb +1 -1
- data/components/fingerprinters/os/solaris.rb +1 -1
- data/components/fingerprinters/os/unix.rb +1 -1
- data/components/fingerprinters/os/windows.rb +1 -1
- data/components/fingerprinters/servers/apache.rb +1 -1
- data/components/fingerprinters/servers/gunicorn.rb +1 -1
- data/components/fingerprinters/servers/iis.rb +1 -1
- data/components/fingerprinters/servers/jetty.rb +1 -1
- data/components/fingerprinters/servers/nginx.rb +1 -1
- data/components/fingerprinters/servers/tomcat.rb +1 -1
- data/components/path_extractors/anchors.rb +3 -5
- data/components/path_extractors/areas.rb +3 -4
- data/components/path_extractors/comments.rb +4 -5
- data/components/path_extractors/data_url.rb +4 -5
- data/components/path_extractors/forms.rb +3 -4
- data/components/path_extractors/frames.rb +3 -5
- data/components/path_extractors/generic.rb +3 -1
- data/components/path_extractors/links.rb +3 -4
- data/components/path_extractors/meta_refresh.rb +11 -17
- data/components/path_extractors/scripts.rb +18 -15
- data/components/plugins/autologin.rb +3 -2
- data/components/plugins/beep_notify.rb +1 -1
- data/components/plugins/content_types.rb +1 -1
- data/components/plugins/cookie_collector.rb +1 -1
- data/components/plugins/debug/browser_cluster_job_monitor.rb +60 -0
- data/components/plugins/defaults/autothrottle.rb +1 -1
- data/components/plugins/defaults/healthmap.rb +3 -1
- data/components/plugins/defaults/meta/remedies/discovery.rb +1 -1
- data/components/plugins/defaults/meta/remedies/timing_attacks.rb +1 -1
- data/components/plugins/defaults/meta/uniformity.rb +1 -1
- data/components/plugins/email_notify.rb +26 -9
- data/components/plugins/exec.rb +1 -1
- data/components/plugins/form_dicattack.rb +3 -4
- data/components/plugins/headers_collector.rb +1 -1
- data/components/plugins/http_dicattack.rb +4 -5
- data/components/plugins/login_script.rb +2 -2
- data/components/plugins/metrics.rb +44 -18
- data/components/plugins/page_dump.rb +60 -0
- data/components/plugins/proxy/panel/verify_login_sequence.html.erb +1 -1
- data/components/plugins/proxy/template_scope.rb +6 -1
- data/components/plugins/proxy.rb +44 -31
- data/components/plugins/rate_limiter.rb +80 -0
- data/components/plugins/restrict_to_dom_state.rb +1 -1
- data/components/plugins/script.rb +1 -1
- data/components/plugins/uncommon_headers.rb +1 -1
- data/components/plugins/vector_collector.rb +1 -1
- data/components/plugins/vector_feed.rb +1 -1
- data/components/plugins/waf_detector.rb +3 -3
- data/components/plugins/webhook_notify.rb +99 -0
- data/components/reporters/ap.rb +1 -1
- data/components/reporters/html/default/configuration.erb +2 -0
- data/components/reporters/html/default.erb +3 -2
- data/components/reporters/html.rb +5 -8
- data/components/reporters/json.rb +1 -1
- data/components/reporters/marshal.rb +1 -1
- data/components/reporters/plugin_formatters/html/autologin.rb +1 -1
- data/components/reporters/plugin_formatters/html/content_types.rb +1 -1
- data/components/reporters/plugin_formatters/html/cookie_collector.rb +1 -1
- data/components/reporters/plugin_formatters/html/exec.rb +1 -1
- data/components/reporters/plugin_formatters/html/form_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/html/healthmap.rb +1 -1
- data/components/reporters/plugin_formatters/html/http_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/html/login_script.rb +1 -1
- data/components/reporters/plugin_formatters/html/metrics.rb +46 -1
- data/components/reporters/plugin_formatters/html/uncommon_headers.rb +1 -1
- data/components/reporters/plugin_formatters/html/uniformity.rb +1 -1
- data/components/reporters/plugin_formatters/html/vector_collector.rb +1 -1
- data/components/reporters/plugin_formatters/html/waf_detector.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/autologin.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/content_types.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/cookie_collector.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/exec.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/form_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/healthmap.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/http_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/login_script.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/metrics.rb +11 -1
- data/components/reporters/plugin_formatters/stdout/uncommon_headers.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/uniformity.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/vector_collector.rb +1 -1
- data/components/reporters/plugin_formatters/stdout/waf_detector.rb +1 -1
- data/components/reporters/plugin_formatters/xml/autologin.rb +1 -1
- data/components/reporters/plugin_formatters/xml/content_types.rb +10 -7
- data/components/reporters/plugin_formatters/xml/cookie_collector.rb +6 -3
- data/components/reporters/plugin_formatters/xml/exec.rb +1 -1
- data/components/reporters/plugin_formatters/xml/form_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/xml/healthmap.rb +1 -1
- data/components/reporters/plugin_formatters/xml/http_dicattack.rb +1 -1
- data/components/reporters/plugin_formatters/xml/login_script.rb +1 -1
- data/components/reporters/plugin_formatters/xml/metrics.rb +1 -1
- data/components/reporters/plugin_formatters/xml/uncommon_headers.rb +5 -2
- data/components/reporters/plugin_formatters/xml/uniformity.rb +1 -1
- data/components/reporters/plugin_formatters/xml/vector_collector.rb +8 -5
- data/components/reporters/plugin_formatters/xml/waf_detector.rb +1 -1
- data/components/reporters/stdout.rb +3 -2
- data/components/reporters/txt.rb +1 -1
- data/components/reporters/xml/schema.xsd +29 -13
- data/components/reporters/xml.rb +40 -23
- data/components/reporters/yaml.rb +1 -1
- data/config/write_paths.yml +4 -0
- data/lib/arachni/banner.rb +1 -1
- data/lib/arachni/browser/element_locator.rb +9 -5
- data/lib/arachni/browser/javascript/dom_monitor.rb +1 -1
- data/lib/arachni/browser/javascript/proxy/stub.rb +1 -1
- data/lib/arachni/browser/javascript/proxy.rb +1 -1
- data/lib/arachni/browser/javascript/scripts/dom_monitor.js +329 -72
- data/lib/arachni/browser/javascript/scripts/polyfills.js +0 -28
- data/lib/arachni/browser/javascript/scripts/taint_tracer.js +81 -25
- data/lib/arachni/browser/javascript/taint_tracer/frame/called_function.rb +1 -1
- data/lib/arachni/browser/javascript/taint_tracer/frame.rb +1 -1
- data/lib/arachni/browser/javascript/taint_tracer/sink/base.rb +1 -1
- data/lib/arachni/browser/javascript/taint_tracer/sink/data_flow.rb +1 -1
- data/lib/arachni/browser/javascript/taint_tracer/sink/execution_flow.rb +1 -1
- data/lib/arachni/browser/javascript/taint_tracer.rb +1 -1
- data/lib/arachni/browser/javascript.rb +111 -198
- data/lib/arachni/browser.rb +309 -382
- data/lib/arachni/browser_cluster/job/result.rb +1 -1
- data/lib/arachni/browser_cluster/job.rb +9 -2
- data/lib/arachni/browser_cluster/jobs/browser_provider.rb +8 -2
- data/lib/arachni/browser_cluster/jobs/dom_exploration/event_trigger/result.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/dom_exploration/event_trigger.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/dom_exploration/result.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/dom_exploration.rb +13 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger/result.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace/result.rb +1 -1
- data/lib/arachni/browser_cluster/jobs/taint_trace.rb +1 -1
- data/lib/arachni/browser_cluster/worker.rb +97 -87
- data/lib/arachni/browser_cluster.rb +79 -62
- data/lib/arachni/check/auditor.rb +161 -155
- data/lib/arachni/check/base.rb +1 -1
- data/lib/arachni/check/manager.rb +1 -1
- data/lib/arachni/check.rb +1 -1
- data/lib/arachni/component/base.rb +3 -1
- data/lib/arachni/component/manager.rb +1 -1
- data/lib/arachni/component/options/address.rb +1 -1
- data/lib/arachni/component/options/base.rb +1 -1
- data/lib/arachni/component/options/bool.rb +1 -1
- data/lib/arachni/component/options/float.rb +1 -1
- data/lib/arachni/component/options/int.rb +1 -1
- data/lib/arachni/component/options/multiple_choice.rb +1 -1
- data/lib/arachni/component/options/object.rb +1 -1
- data/lib/arachni/component/options/path.rb +1 -1
- data/lib/arachni/component/options/port.rb +1 -1
- data/lib/arachni/component/options/string.rb +1 -1
- data/lib/arachni/component/options/url.rb +1 -1
- data/lib/arachni/component/options.rb +1 -1
- data/lib/arachni/component/output.rb +8 -2
- data/lib/arachni/component/utilities.rb +1 -1
- data/lib/arachni/component.rb +1 -1
- data/lib/arachni/data/framework/rpc.rb +2 -2
- data/lib/arachni/data/framework.rb +3 -2
- data/lib/arachni/data/issues.rb +1 -1
- data/lib/arachni/data/plugins.rb +1 -1
- data/lib/arachni/data/session.rb +1 -1
- data/lib/arachni/data.rb +1 -1
- data/lib/arachni/element/base.rb +1 -1
- data/lib/arachni/element/body.rb +1 -1
- data/lib/arachni/element/capabilities/analyzable/differential.rb +142 -175
- data/lib/arachni/element/capabilities/analyzable/signature.rb +40 -18
- data/lib/arachni/element/capabilities/analyzable/timeout.rb +1 -1
- data/lib/arachni/element/capabilities/analyzable.rb +1 -1
- data/lib/arachni/element/capabilities/auditable/buffered.rb +92 -0
- data/lib/arachni/element/capabilities/auditable/line_buffered.rb +103 -0
- data/lib/arachni/element/capabilities/auditable.rb +2 -8
- data/lib/arachni/element/capabilities/dom_only.rb +1 -1
- data/lib/arachni/element/capabilities/inputtable.rb +6 -2
- data/lib/arachni/element/capabilities/mutable.rb +1 -1
- data/lib/arachni/element/capabilities/refreshable.rb +1 -1
- data/lib/arachni/element/capabilities/submittable.rb +1 -1
- data/lib/arachni/element/capabilities/with_auditor/output.rb +4 -3
- data/lib/arachni/element/capabilities/with_auditor.rb +1 -1
- data/lib/arachni/element/capabilities/with_dom.rb +1 -1
- data/lib/arachni/element/capabilities/with_node.rb +3 -3
- data/lib/arachni/element/capabilities/with_scope/scope.rb +1 -1
- data/lib/arachni/element/capabilities/with_scope.rb +1 -1
- data/lib/arachni/element/capabilities/with_source.rb +2 -2
- data/lib/arachni/element/cookie/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/cookie/capabilities/mutable.rb +1 -1
- data/lib/arachni/element/cookie/capabilities/with_dom.rb +1 -1
- data/lib/arachni/element/cookie/dom.rb +1 -1
- data/lib/arachni/element/cookie.rb +49 -24
- data/lib/arachni/element/dom/capabilities/auditable.rb +44 -3
- data/lib/arachni/element/dom/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/dom/capabilities/locatable.rb +1 -1
- data/lib/arachni/element/dom/capabilities/mutable.rb +7 -3
- data/lib/arachni/element/dom/capabilities/submittable.rb +51 -22
- data/lib/arachni/element/dom.rb +1 -1
- data/lib/arachni/element/form/capabilities/auditable.rb +1 -1
- data/lib/arachni/element/form/capabilities/mutable.rb +16 -11
- data/lib/arachni/element/form/capabilities/submittable.rb +1 -1
- data/lib/arachni/element/form/capabilities/with_dom.rb +1 -1
- data/lib/arachni/element/form/dom.rb +1 -1
- data/lib/arachni/element/form.rb +21 -32
- data/lib/arachni/element/generic_dom.rb +1 -1
- data/lib/arachni/element/header/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/header/capabilities/mutable.rb +1 -1
- data/lib/arachni/element/header.rb +3 -1
- data/lib/arachni/element/json/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/json/capabilities/mutable.rb +1 -1
- data/lib/arachni/element/json.rb +4 -8
- data/lib/arachni/element/link/capabilities/auditable.rb +1 -1
- data/lib/arachni/element/link/capabilities/submittable.rb +1 -1
- data/lib/arachni/element/link/capabilities/with_dom.rb +1 -1
- data/lib/arachni/element/link/dom/capabilities/submittable.rb +1 -1
- data/lib/arachni/element/link/dom.rb +1 -1
- data/lib/arachni/element/link.rb +11 -30
- data/lib/arachni/element/link_template/capabilities/auditable.rb +1 -1
- data/lib/arachni/element/link_template/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/link_template/capabilities/with_dom.rb +1 -1
- data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +1 -1
- data/lib/arachni/element/link_template/dom.rb +2 -2
- data/lib/arachni/element/link_template.rb +10 -19
- data/lib/arachni/element/nested_cookie/capabilities/submittable.rb +35 -0
- data/lib/arachni/element/nested_cookie.rb +370 -0
- data/lib/arachni/element/path.rb +1 -1
- data/lib/arachni/element/server.rb +11 -11
- data/lib/arachni/element/ui_form/dom.rb +1 -1
- data/lib/arachni/element/ui_form.rb +5 -6
- data/lib/arachni/element/ui_input/dom.rb +1 -1
- data/lib/arachni/element/ui_input.rb +4 -6
- data/lib/arachni/element/xml/capabilities/inputtable.rb +1 -1
- data/lib/arachni/element/xml/capabilities/mutable.rb +1 -1
- data/lib/arachni/element/xml.rb +3 -7
- data/lib/arachni/element_filter.rb +1 -1
- data/lib/arachni/error.rb +1 -1
- data/lib/arachni/ethon/easy.rb +1 -1
- data/lib/arachni/framework/parts/audit.rb +6 -1
- data/lib/arachni/framework/parts/browser.rb +14 -14
- data/lib/arachni/framework/parts/check.rb +1 -1
- data/lib/arachni/framework/parts/data.rb +1 -1
- data/lib/arachni/framework/parts/platform.rb +1 -1
- data/lib/arachni/framework/parts/plugin.rb +1 -1
- data/lib/arachni/framework/parts/report.rb +3 -3
- data/lib/arachni/framework/parts/scope.rb +1 -1
- data/lib/arachni/framework/parts/state.rb +1 -1
- data/lib/arachni/framework.rb +1 -1
- data/lib/arachni/http/client/dynamic_404_handler.rb +74 -16
- data/lib/arachni/http/client.rb +38 -11
- data/lib/arachni/http/cookie_jar.rb +13 -8
- data/lib/arachni/http/headers.rb +11 -5
- data/lib/arachni/http/message/scope.rb +1 -1
- data/lib/arachni/http/message.rb +10 -9
- data/lib/arachni/http/proxy_server/connection.rb +110 -82
- data/lib/arachni/http/proxy_server/ssl-interceptor-cacert.pem +18 -32
- data/lib/arachni/http/proxy_server/ssl-interceptor-cakey.pem +28 -49
- data/lib/arachni/http/proxy_server/ssl_interceptor.rb +8 -6
- data/lib/arachni/http/proxy_server/tunnel.rb +4 -4
- data/lib/arachni/http/proxy_server.rb +44 -11
- data/lib/arachni/http/request/scope.rb +1 -1
- data/lib/arachni/http/request.rb +239 -41
- data/lib/arachni/http/response/scope.rb +1 -1
- data/lib/arachni/http/response.rb +73 -10
- data/lib/arachni/http.rb +1 -1
- data/lib/arachni/issue/severity/base.rb +1 -1
- data/lib/arachni/issue/severity.rb +1 -1
- data/lib/arachni/issue.rb +42 -14
- data/lib/arachni/option_group.rb +1 -1
- data/lib/arachni/option_groups/audit.rb +11 -2
- data/lib/arachni/option_groups/browser_cluster.rb +32 -4
- data/lib/arachni/option_groups/datastore.rb +1 -1
- data/lib/arachni/option_groups/dispatcher.rb +1 -1
- data/lib/arachni/option_groups/http.rb +39 -10
- data/lib/arachni/option_groups/input.rb +1 -1
- data/lib/arachni/option_groups/output.rb +1 -1
- data/lib/arachni/option_groups/paths.rb +12 -1
- data/lib/arachni/option_groups/rpc.rb +1 -1
- data/lib/arachni/option_groups/scope.rb +58 -4
- data/lib/arachni/option_groups/session.rb +1 -1
- data/lib/arachni/option_groups/snapshot.rb +1 -1
- data/lib/arachni/option_groups.rb +1 -1
- data/lib/arachni/options.rb +23 -4
- data/lib/arachni/page/dom/transition.rb +5 -2
- data/lib/arachni/page/dom.rb +46 -54
- data/lib/arachni/page/scope.rb +1 -1
- data/lib/arachni/page.rb +10 -8
- data/lib/arachni/parser/document.rb +34 -0
- data/lib/arachni/parser/extractors/base.rb +48 -0
- data/lib/arachni/parser/nodes/base.rb +22 -0
- data/lib/arachni/parser/nodes/comment.rb +32 -0
- data/lib/arachni/parser/nodes/element/with_attributes/attributes.rb +31 -0
- data/lib/arachni/parser/nodes/element/with_attributes.rb +35 -0
- data/lib/arachni/parser/nodes/element.rb +48 -0
- data/lib/arachni/parser/nodes/text.rb +32 -0
- data/lib/arachni/parser/nodes/with_value.rb +29 -0
- data/lib/arachni/parser/sax.rb +76 -0
- data/lib/arachni/parser/with_children/search.rb +92 -0
- data/lib/arachni/parser/with_children.rb +35 -0
- data/lib/arachni/parser.rb +181 -78
- data/lib/arachni/platform/fingerprinter.rb +1 -1
- data/lib/arachni/platform/list.rb +1 -1
- data/lib/arachni/platform/manager.rb +2 -2
- data/lib/arachni/platform.rb +1 -1
- data/lib/arachni/plugin/base.rb +2 -2
- data/lib/arachni/plugin/formatter.rb +1 -1
- data/lib/arachni/plugin/manager.rb +8 -5
- data/lib/arachni/plugin.rb +1 -1
- data/lib/arachni/processes/dispatchers.rb +1 -1
- data/lib/arachni/processes/executables/base.rb +2 -1
- data/lib/arachni/processes/executables/browser.rb +0 -2
- data/lib/arachni/processes/helpers/dispatchers.rb +1 -1
- data/lib/arachni/processes/helpers/instances.rb +1 -1
- data/lib/arachni/processes/helpers/processes.rb +1 -1
- data/lib/arachni/processes/helpers.rb +1 -1
- data/lib/arachni/processes/instances.rb +1 -1
- data/lib/arachni/processes/manager.rb +18 -9
- data/lib/arachni/processes.rb +1 -1
- data/lib/arachni/report.rb +8 -1
- data/lib/arachni/reporter/base.rb +1 -1
- data/lib/arachni/reporter/formatter_manager.rb +1 -1
- data/lib/arachni/reporter/manager.rb +1 -1
- data/lib/arachni/reporter/options.rb +1 -10
- data/lib/arachni/reporter.rb +1 -1
- data/lib/arachni/rest/server/instance_helpers.rb +10 -1
- data/lib/arachni/rest/server.rb +13 -1
- data/lib/arachni/rpc/client/base.rb +1 -1
- data/lib/arachni/rpc/client/dispatcher.rb +1 -1
- data/lib/arachni/rpc/client/instance/framework.rb +1 -1
- data/lib/arachni/rpc/client/instance/service.rb +1 -1
- data/lib/arachni/rpc/client/instance.rb +1 -1
- data/lib/arachni/rpc/serializer.rb +1 -1
- data/lib/arachni/rpc/server/active_options.rb +1 -1
- data/lib/arachni/rpc/server/base.rb +1 -1
- data/lib/arachni/rpc/server/check/manager.rb +1 -1
- data/lib/arachni/rpc/server/dispatcher/node.rb +1 -1
- data/lib/arachni/rpc/server/dispatcher/service.rb +1 -1
- data/lib/arachni/rpc/server/dispatcher.rb +1 -1
- data/lib/arachni/rpc/server/framework/distributor.rb +1 -1
- data/lib/arachni/rpc/server/framework/master.rb +1 -1
- data/lib/arachni/rpc/server/framework/multi_instance.rb +1 -1
- data/lib/arachni/rpc/server/framework/slave.rb +1 -1
- data/lib/arachni/rpc/server/framework.rb +1 -1
- data/lib/arachni/rpc/server/instance.rb +1 -1
- data/lib/arachni/rpc/server/output.rb +1 -1
- data/lib/arachni/rpc/server/plugin/manager.rb +1 -1
- data/lib/arachni/ruby/array.rb +1 -1
- data/lib/arachni/ruby/hash.rb +1 -1
- data/lib/arachni/ruby/object.rb +1 -1
- data/lib/arachni/ruby/set.rb +1 -1
- data/lib/arachni/ruby/string.rb +9 -5
- data/lib/arachni/ruby/webrick/cookie.rb +1 -1
- data/lib/arachni/ruby/webrick/httprequest.rb +1 -1
- data/lib/arachni/ruby/webrick.rb +1 -1
- data/lib/arachni/ruby.rb +1 -1
- data/lib/arachni/scope.rb +1 -1
- data/lib/arachni/selenium/webdriver/element.rb +4 -4
- data/lib/arachni/selenium/webdriver/remote/typhoeus.rb +59 -0
- data/lib/arachni/session.rb +32 -13
- data/lib/arachni/snapshot.rb +2 -2
- data/lib/arachni/state/audit.rb +1 -1
- data/lib/arachni/state/element_filter.rb +1 -1
- data/lib/arachni/state/framework/rpc.rb +1 -1
- data/lib/arachni/state/framework.rb +1 -1
- data/lib/arachni/state/http.rb +2 -2
- data/lib/arachni/state/options.rb +1 -1
- data/lib/arachni/state/plugins.rb +1 -1
- data/lib/arachni/state.rb +1 -1
- data/lib/arachni/support/buffer/autoflush.rb +1 -1
- data/lib/arachni/support/buffer/base.rb +1 -1
- data/lib/arachni/support/buffer.rb +1 -1
- data/lib/arachni/support/cache/base.rb +1 -1
- data/lib/arachni/support/cache/least_cost_replacement.rb +1 -1
- data/lib/arachni/support/cache/least_recently_pushed.rb +1 -1
- data/lib/arachni/support/cache/least_recently_used.rb +1 -1
- data/lib/arachni/support/cache/preference.rb +1 -1
- data/lib/arachni/support/cache/random_replacement.rb +1 -1
- data/lib/arachni/support/cache.rb +1 -1
- data/lib/arachni/support/crypto/rsa_aes_cbc.rb +1 -1
- data/lib/arachni/support/crypto.rb +1 -1
- data/lib/arachni/support/database/base.rb +16 -10
- data/lib/arachni/support/database/hash.rb +1 -1
- data/lib/arachni/support/database/queue.rb +1 -1
- data/lib/arachni/support/database.rb +1 -1
- data/lib/arachni/support/glob.rb +1 -1
- data/lib/arachni/support/lookup/base.rb +1 -1
- data/lib/arachni/support/lookup/hash_set.rb +1 -1
- data/lib/arachni/support/lookup/moolb.rb +1 -1
- data/lib/arachni/support/lookup.rb +1 -1
- data/lib/arachni/support/mixins/observable.rb +1 -1
- data/lib/arachni/support/mixins/terminal.rb +1 -1
- data/lib/arachni/support/mixins.rb +1 -1
- data/lib/arachni/support/profiler.rb +52 -13
- data/lib/arachni/support/signature.rb +18 -6
- data/lib/arachni/support.rb +1 -1
- data/lib/arachni/trainer.rb +55 -39
- data/lib/arachni/ui/foo/output.rb +1 -1
- data/lib/arachni/uri/scope.rb +15 -13
- data/lib/arachni/uri.rb +129 -103
- data/lib/arachni/utilities.rb +10 -10
- data/lib/arachni/version.rb +1 -1
- data/lib/arachni.rb +1 -7
- data/lib/version +1 -1
- data/spec/arachni/browser/element_locator_spec.rb +42 -18
- data/spec/arachni/browser/javascript/dom_monitor_spec.rb +264 -109
- data/spec/arachni/browser/javascript/polyfills_spec.rb +0 -15
- data/spec/arachni/browser/javascript/proxy_spec.rb +0 -10
- data/spec/arachni/browser/javascript/taint_tracer_spec.rb +43 -118
- data/spec/arachni/browser/javascript_spec.rb +95 -60
- data/spec/arachni/browser_cluster/job_spec.rb +23 -8
- data/spec/arachni/browser_cluster/jobs/dom_exploration_spec.rb +6 -1
- data/spec/arachni/browser_cluster/worker_spec.rb +29 -87
- data/spec/arachni/browser_cluster_spec.rb +124 -43
- data/spec/arachni/browser_spec.rb +463 -421
- data/spec/arachni/check/auditor_spec.rb +162 -198
- data/spec/arachni/data/framework/rpc_spec.rb +1 -1
- data/spec/arachni/data/framework_spec.rb +1 -1
- data/spec/arachni/element/capabilities/analyzable/signature_spec.rb +46 -3
- data/spec/arachni/element/cookie/dom_spec.rb +1 -1
- data/spec/arachni/element/cookie_spec.rb +159 -64
- data/spec/arachni/element/form/dom_spec.rb +1 -1
- data/spec/arachni/element/form_spec.rb +101 -54
- data/spec/arachni/element/header_spec.rb +3 -1
- data/spec/arachni/element/json_spec.rb +2 -0
- data/spec/arachni/element/link/dom_spec.rb +2 -2
- data/spec/arachni/element/link_spec.rb +46 -15
- data/spec/arachni/element/link_template/dom_spec.rb +1 -1
- data/spec/arachni/element/link_template_spec.rb +36 -12
- data/spec/arachni/element/nested_cookie_spec.rb +687 -0
- data/spec/arachni/element/server_spec.rb +22 -5
- data/spec/arachni/element/ui_form/dom_spec.rb +1 -1
- data/spec/arachni/element/ui_form_spec.rb +2 -2
- data/spec/arachni/element/ui_input/dom_spec.rb +1 -1
- data/spec/arachni/element/ui_input_spec.rb +1 -1
- data/spec/arachni/element/xml_spec.rb +5 -3
- data/spec/arachni/framework/parts/audit_spec.rb +2 -14
- data/spec/arachni/framework/parts/data_spec.rb +0 -6
- data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +126 -0
- data/spec/arachni/http/client_spec.rb +96 -36
- data/spec/arachni/http/cookie_jar_spec.rb +2 -2
- data/spec/arachni/http/headers_spec.rb +59 -12
- data/spec/arachni/http/proxy_server_spec.rb +58 -25
- data/spec/arachni/http/request_spec.rb +382 -35
- data/spec/arachni/http/response_spec.rb +135 -7
- data/spec/arachni/issue_spec.rb +21 -2
- data/spec/arachni/option_groups/browser_cluster_spec.rb +17 -0
- data/spec/arachni/option_groups/http_spec.rb +21 -6
- data/spec/arachni/option_groups/paths_spec.rb +23 -1
- data/spec/arachni/option_groups/scope_spec.rb +27 -7
- data/spec/arachni/options_spec.rb +8 -1
- data/spec/arachni/page/dom_spec.rb +20 -6
- data/spec/arachni/page_spec.rb +8 -7
- data/spec/arachni/parser/document_spec.rb +49 -0
- data/spec/arachni/parser/nodes/comment_spec.rb +24 -0
- data/spec/arachni/parser/nodes/element/with_attributes/attributes_spec.rb +40 -0
- data/spec/arachni/parser/nodes/element/with_attributes_spec.rb +50 -0
- data/spec/arachni/parser/nodes/element_spec.rb +18 -0
- data/spec/arachni/parser/nodes/text_spec.rb +24 -0
- data/spec/arachni/parser/sax_spec.rb +88 -0
- data/spec/arachni/parser/with_children/search_spec.rb +146 -0
- data/spec/arachni/parser/with_children_spec.rb +37 -0
- data/spec/arachni/parser_spec.rb +211 -27
- data/spec/arachni/platform/list_spec.rb +1 -2
- data/spec/arachni/report_spec.rb +9 -2
- data/spec/arachni/reporter/options_spec.rb +0 -14
- data/spec/arachni/rest/server_spec.rb +91 -8
- data/spec/arachni/rpc/server/active_options_spec.rb +1 -1
- data/spec/arachni/rpc/server/framework/distributor_spec.rb +6 -6
- data/spec/arachni/ruby/string_spec.rb +6 -0
- data/spec/arachni/session_spec.rb +69 -8
- data/spec/arachni/snapshot_spec.rb +1 -1
- data/spec/arachni/state/framework_spec.rb +2 -2
- data/spec/arachni/support/signature_spec.rb +58 -0
- data/spec/arachni/trainer_spec.rb +102 -21
- data/spec/arachni/uri_spec.rb +11 -8
- data/spec/arachni/utilities_spec.rb +3 -3
- data/spec/components/checks/active/code_injection_spec.rb +12 -7
- data/spec/components/checks/active/code_injection_timing_spec.rb +4 -3
- data/spec/components/checks/active/csrf_spec.rb +1 -21
- data/spec/components/checks/active/file_inclusion_spec.rb +15 -10
- data/spec/components/checks/active/ldap_injection_spec.rb +5 -4
- data/spec/components/checks/active/no_sql_injection_differential_spec.rb +1 -1
- data/spec/components/checks/active/no_sql_injection_spec.rb +5 -4
- data/spec/components/checks/active/os_cmd_injection_spec.rb +6 -4
- data/spec/components/checks/active/os_cmd_injection_timing_spec.rb +4 -3
- data/spec/components/checks/active/path_traversal_spec.rb +18 -15
- data/spec/components/checks/active/response_splitting_spec.rb +5 -4
- data/spec/components/checks/active/rfi_spec.rb +9 -8
- data/spec/components/checks/active/source_code_disclosure_spec.rb +33 -10
- data/spec/components/checks/active/sql_injection_differential_spec.rb +1 -1
- data/spec/components/checks/active/sql_injection_spec.rb +61 -35
- data/spec/components/checks/active/sql_injection_timing_spec.rb +11 -8
- data/spec/components/checks/active/unvalidated_redirect_spec.rb +9 -8
- data/spec/components/checks/active/xpath_injection_spec.rb +5 -4
- data/spec/components/checks/active/xss_dom_script_context_spec.rb +6 -10
- data/spec/components/checks/active/xss_dom_spec.rb +2 -2
- data/spec/components/checks/active/xss_event_spec.rb +11 -3
- data/spec/components/checks/active/xss_script_context_spec.rb +8 -7
- data/spec/components/checks/active/xss_spec.rb +7 -6
- data/spec/components/checks/active/xss_tag_spec.rb +11 -3
- data/spec/components/checks/passive/backup_directories_spec.rb +3 -1
- data/spec/components/checks/passive/backup_files_spec.rb +4 -1
- data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +2 -2
- data/spec/components/checks/passive/grep/x_frame_options_spec.rb +6 -0
- data/spec/components/path_extractors/comments_spec.rb +3 -1
- data/spec/components/path_extractors/data_url_spec.rb +6 -2
- data/spec/components/path_extractors/links_spec.rb +1 -1
- data/spec/components/plugins/autologin_spec.rb +2 -2
- data/spec/components/plugins/webhook_notify_spec.rb +69 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/factories/http/response.rb +1 -1
- data/spec/support/factories/issue.rb +1 -2
- data/spec/support/factories/page/dom.rb +6 -0
- data/spec/support/factories/scan_report.rb +1 -0
- data/spec/support/factories/vector.rb +7 -3
- data/spec/support/fixtures/check_with_invalid_platforms/with_invalid_platforms.rb +1 -1
- data/spec/support/fixtures/checks/test.rb +4 -4
- data/spec/support/fixtures/checks/test2.rb +1 -1
- data/spec/support/fixtures/checks/test3.rb +1 -1
- data/spec/support/fixtures/cookies.txt +2 -2
- data/spec/support/fixtures/executables/node.rb +2 -3
- data/spec/support/fixtures/fingerprinters/test.rb +1 -1
- data/spec/support/fixtures/nested_cookies.txt +11 -0
- data/spec/support/fixtures/plugins/bad.rb +1 -1
- data/spec/support/fixtures/plugins/defaults/default.rb +1 -1
- data/spec/support/fixtures/plugins/distributable.rb +1 -1
- data/spec/support/fixtures/plugins/loop.rb +1 -1
- data/spec/support/fixtures/plugins/suspendable.rb +1 -1
- data/spec/support/fixtures/plugins/wait.rb +1 -1
- data/spec/support/fixtures/plugins/with_options.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p0.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p00.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p1.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p2.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p22.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p222.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p_nil.rb +1 -1
- data/spec/support/fixtures/plugins_with_priorities/p_nil2.rb +1 -1
- data/spec/support/fixtures/report.afr +0 -0
- data/spec/support/fixtures/reporters/base_spec/plugin_formatters/with_formatters/foobar.rb +1 -1
- data/spec/support/fixtures/reporters/base_spec/with_formatters.rb +1 -1
- data/spec/support/fixtures/reporters/base_spec/with_outfile.rb +1 -1
- data/spec/support/fixtures/reporters/base_spec/without_outfile.rb +1 -1
- data/spec/support/fixtures/reporters/manager_spec/afr.rb +1 -1
- data/spec/support/fixtures/reporters/manager_spec/error.rb +1 -1
- data/spec/support/fixtures/reporters/manager_spec/foo.rb +1 -1
- data/spec/support/fixtures/run_check/body.rb +1 -1
- data/spec/support/fixtures/run_check/cookies.rb +1 -1
- data/spec/support/fixtures/run_check/empty.rb +1 -1
- data/spec/support/fixtures/run_check/flch.rb +1 -1
- data/spec/support/fixtures/run_check/forms.rb +1 -1
- data/spec/support/fixtures/run_check/headers.rb +1 -1
- data/spec/support/fixtures/run_check/links.rb +1 -1
- data/spec/support/fixtures/run_check/nil.rb +1 -1
- data/spec/support/fixtures/run_check/path.rb +1 -1
- data/spec/support/fixtures/run_check/server.rb +1 -1
- data/spec/support/fixtures/signature_check/signature.rb +1 -1
- data/spec/support/fixtures/wait_check/wait.rb +1 -1
- data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +0 -3
- data/spec/support/helpers/framework.rb +1 -1
- data/spec/support/helpers/misc.rb +1 -1
- data/spec/support/helpers/paths.rb +1 -1
- data/spec/support/helpers/requires.rb +1 -1
- data/spec/support/helpers/resets.rb +1 -1
- data/spec/support/helpers/web_server.rb +1 -1
- data/spec/support/lib/factory.rb +1 -1
- data/spec/support/lib/web_server_client.rb +1 -1
- data/spec/support/lib/web_server_dispatcher.rb +1 -1
- data/spec/support/lib/web_server_manager.rb +4 -2
- data/spec/support/servers/arachni/browser/javascript/dom_monitor.rb +48 -0
- data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +15 -3
- data/spec/support/servers/arachni/browser.rb +275 -4
- data/spec/support/servers/arachni/check/auditor.rb +9 -0
- data/spec/support/servers/arachni/element/cookie.rb +34 -0
- data/spec/support/servers/arachni/element/form/form_dom.rb +1 -0
- data/spec/support/servers/arachni/element/form.rb +36 -2
- data/spec/support/servers/arachni/element/header.rb +36 -1
- data/spec/support/servers/arachni/element/json.rb +33 -0
- data/spec/support/servers/arachni/element/link.rb +33 -1
- data/spec/support/servers/arachni/element/link_template.rb +37 -5
- data/spec/support/servers/arachni/element/nested_cookie.rb +84 -0
- data/spec/support/servers/arachni/element/xml.rb +33 -0
- data/spec/support/servers/arachni/http/client/dynamic_404_handler.rb +36 -0
- data/spec/support/servers/arachni/http/client/dynamic_404_handler_redirect_1.rb +18 -0
- data/spec/support/servers/arachni/http/client/dynamic_404_handler_redirect_2.rb +11 -0
- data/spec/support/servers/arachni/http/client.rb +43 -4
- data/spec/support/servers/arachni/http/proxy_server.rb +12 -0
- data/spec/support/servers/arachni/parser.rb +6 -0
- data/spec/support/servers/arachni/session.rb +24 -1
- data/spec/support/servers/checks/active/code_injection.rb +18 -0
- data/spec/support/servers/checks/active/code_injection_timing.rb +18 -0
- data/spec/support/servers/checks/active/csrf.rb +0 -76
- data/spec/support/servers/checks/active/file_inclusion.rb +19 -1
- data/spec/support/servers/checks/active/ldap_injection.rb +18 -0
- data/spec/support/servers/checks/active/no_sql_injection.rb +27 -0
- data/spec/support/servers/checks/active/no_sql_injection_differential.rb +19 -0
- data/spec/support/servers/checks/active/os_cmd_injection.rb +29 -0
- data/spec/support/servers/checks/active/os_cmd_injection_timing.rb +18 -1
- data/spec/support/servers/checks/active/path_traversal.rb +30 -3
- data/spec/support/servers/checks/active/response_splitting.rb +30 -1
- data/spec/support/servers/checks/active/rfi.rb +30 -2
- data/spec/support/servers/checks/active/session_fixation.rb +1 -3
- data/spec/support/servers/checks/active/source_code_disclosure.rb +16 -0
- data/spec/support/servers/checks/active/sql_injection/java +2 -0
- data/spec/support/servers/checks/active/sql_injection.rb +27 -0
- data/spec/support/servers/checks/active/sql_injection_differential.rb +19 -0
- data/spec/support/servers/checks/active/sql_injection_timing.rb +19 -1
- data/spec/support/servers/checks/active/unvalidated_redirect.rb +121 -1
- data/spec/support/servers/checks/active/xpath_injection.rb +27 -0
- data/spec/support/servers/checks/active/xss.rb +40 -0
- data/spec/support/servers/checks/active/xss_event.rb +23 -2
- data/spec/support/servers/checks/active/xss_script_context.rb +18 -0
- data/spec/support/servers/checks/active/xss_tag.rb +40 -0
- data/spec/support/servers/checks/passive/backup_files.rb +20 -1
- data/spec/support/servers/checks/passive/grep/cookie_set_for_parent_domain.rb +3 -5
- data/spec/support/servers/checks/passive/grep/insecure_cookies_https.rb +9 -0
- data/spec/support/servers/checks/passive/grep/x_frame_options.rb +5 -0
- data/spec/support/servers/plugins/autologin.rb +17 -1
- data/spec/support/servers/plugins/webhook_notify.rb +9 -0
- data/spec/support/shared/check.rb +1 -0
- data/spec/support/shared/element/capabilities/auditable/buffered.rb +791 -0
- data/spec/support/shared/element/capabilities/auditable/line_buffered.rb +797 -0
- data/spec/support/shared/element/capabilities/auditable.rb +28 -34
- data/spec/support/shared/element/capabilities/inputtable.rb +26 -0
- data/spec/support/shared/element/capabilities/with_node.rb +2 -2
- data/spec/support/shared/element/dom/submittable.rb +10 -10
- data/spec/support/shared/path_extractor.rb +17 -5
- data/ui/cli/framework/option_parser.rb +78 -13
- data/ui/cli/framework.rb +29 -8
- data/ui/cli/option_parser.rb +1 -1
- data/ui/cli/output.rb +10 -3
- data/ui/cli/reporter/option_parser.rb +1 -1
- data/ui/cli/reporter.rb +1 -1
- data/ui/cli/reproduce/option_parser.rb +90 -0
- data/ui/cli/reproduce.rb +228 -0
- data/ui/cli/rest/server/option_parser.rb +1 -1
- data/ui/cli/rest/server.rb +1 -1
- data/ui/cli/restored_framework/option_parser.rb +1 -1
- data/ui/cli/restored_framework.rb +1 -1
- data/ui/cli/rpc/client/dispatcher_monitor/option_parser.rb +1 -1
- data/ui/cli/rpc/client/dispatcher_monitor.rb +9 -11
- data/ui/cli/rpc/client/instance.rb +7 -4
- data/ui/cli/rpc/client/local/option_parser.rb +1 -1
- data/ui/cli/rpc/client/local.rb +1 -1
- data/ui/cli/rpc/client/remote/option_parser.rb +1 -1
- data/ui/cli/rpc/client/remote.rb +1 -1
- data/ui/cli/rpc/server/dispatcher/option_parser.rb +1 -1
- data/ui/cli/rpc/server/dispatcher.rb +1 -1
- data/ui/cli/utilities.rb +1 -1
- metadata +178 -79
- data/ACKNOWLEDGMENTS.md +0 -21
- data/AUTHORS.md +0 -3
- data/CONTRIBUTORS.md +0 -22
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright 2010-
|
2
|
+
* Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
*
|
4
4
|
* This file is part of the Arachni Framework project and is subject to
|
5
5
|
* redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -40,8 +40,8 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
40
40
|
data_flow_sinks: {},
|
41
41
|
|
42
42
|
ignore: {
|
43
|
-
'':
|
44
|
-
'lodash':
|
43
|
+
'': true,
|
44
|
+
'lodash': true
|
45
45
|
},
|
46
46
|
|
47
47
|
// Keeps track of which functions have had tracers installed.
|
@@ -70,7 +70,6 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
70
70
|
'decodeURI', 'escape', 'unescape'
|
71
71
|
]
|
72
72
|
],
|
73
|
-
[Text.prototype, ['replaceWholeText']],
|
74
73
|
[Document.prototype, ['createTextNode']],
|
75
74
|
[HTMLDocument.prototype, ['write', 'writeln']],
|
76
75
|
[Element.prototype, ['setAttribute']],
|
@@ -260,14 +259,17 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
260
259
|
trace = [];
|
261
260
|
|
262
261
|
depth_offset = parseInt( depth_offset ) || 3;
|
263
|
-
for( var i = 0; i < depth_offset -
|
262
|
+
for( var i = 0; i < depth_offset - 2; i++ ) {
|
264
263
|
if( f ) f = f.caller;
|
265
264
|
}
|
266
265
|
|
267
266
|
var error = _tokenTaintTracer.get_error_object();
|
268
267
|
var stackArrayOffset = depth_offset;
|
269
268
|
|
270
|
-
|
269
|
+
var current_url = window.location.href;
|
270
|
+
|
271
|
+
var stack_messages = error.stack.split( '\n' );
|
272
|
+
while( stackArrayOffset <= stack_messages.length - 1 ) {
|
271
273
|
// Skip our own functions from the trace.
|
272
274
|
if( !_tokenTaintTracer.has_function( f ) ) {
|
273
275
|
var frame = {
|
@@ -275,21 +277,41 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
275
277
|
};
|
276
278
|
|
277
279
|
if( f ) {
|
278
|
-
frame.function.source = f;
|
280
|
+
frame.function.source = f.toString();
|
279
281
|
|
280
282
|
// Scripts with 'use strict' don't let us access arguments.
|
281
283
|
try {
|
282
284
|
frame.function.arguments =
|
283
285
|
_tokenTaintTracer.sanitize_arguments( f.arguments );
|
284
|
-
} catch(e){}
|
286
|
+
} catch( e ){ console.log( e ) }
|
285
287
|
}
|
286
288
|
|
287
|
-
var
|
288
|
-
|
289
|
-
|
290
|
-
if(
|
289
|
+
var stack_frame = stack_messages[stackArrayOffset].split( 'at ', 2 ).pop();
|
290
|
+
|
291
|
+
var name_rest_splits = stack_frame.split( ' (' );
|
292
|
+
if( name_rest_splits.length > 1 ) {
|
293
|
+
frame.function.name = name_rest_splits.shift().split( '.', 2 ).pop();
|
294
|
+
}
|
295
|
+
|
296
|
+
var url_line_col_splits = name_rest_splits.pop().split( ':' );
|
297
|
+
|
298
|
+
// Remove the column.
|
299
|
+
url_line_col_splits.pop();
|
300
|
+
var url_line_splits = url_line_col_splits;
|
291
301
|
|
292
|
-
|
302
|
+
frame.line = parseInt( url_line_splits.pop() );
|
303
|
+
|
304
|
+
frame.url = url_line_splits.join( ':' ).split( ' (' ).pop();
|
305
|
+
|
306
|
+
// Line numbers in the current page will be off by one after the
|
307
|
+
// JS env has been removed, adjust accordingly.
|
308
|
+
if( frame.url == current_url && frame.line > 0 ) {
|
309
|
+
frame.line--;
|
310
|
+
}
|
311
|
+
|
312
|
+
if( frame.url != '<anonymous>' ) {
|
313
|
+
trace.push( frame );
|
314
|
+
}
|
293
315
|
}
|
294
316
|
|
295
317
|
// Scripts with 'use strict' don't let us access function callers.
|
@@ -412,7 +434,7 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
412
434
|
|
413
435
|
_tokenTaintTracer.log_data_flow_sink( taint, {
|
414
436
|
function: {
|
415
|
-
source: func,
|
437
|
+
source: func.toString(),
|
416
438
|
name: func.name || function_name,
|
417
439
|
arguments: arguments
|
418
440
|
},
|
@@ -489,19 +511,25 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
489
511
|
for( var name in namespace ){
|
490
512
|
if( !namespace.hasOwnProperty( name ) ) continue;
|
491
513
|
|
492
|
-
|
514
|
+
try {
|
515
|
+
var potentialFunction = namespace[name];
|
493
516
|
|
494
|
-
|
495
|
-
|
517
|
+
if (Object.prototype.toString.call(potentialFunction) !== '[object Function]')
|
518
|
+
continue;
|
496
519
|
|
497
|
-
|
520
|
+
if (_tokenTaintTracer.ignore[potentialFunction.name]) continue;
|
498
521
|
|
499
|
-
|
500
|
-
|
501
|
-
|
522
|
+
var namespace_function_name = Object.prototype.toString.call(namespace) +
|
523
|
+
'-' + potentialFunction.name;
|
524
|
+
if (_tokenTaintTracer.traced[namespace_function_name]) continue;
|
502
525
|
|
503
|
-
|
504
|
-
|
526
|
+
_tokenTaintTracer.add_trace_to_function(
|
527
|
+
namespace, name, _tokenTaintTracer.object_to_name( namespace )
|
528
|
+
);
|
529
|
+
_tokenTaintTracer.traced[namespace_function_name] = true;
|
530
|
+
} catch(e) {
|
531
|
+
console.log( e )
|
532
|
+
}
|
505
533
|
}
|
506
534
|
},
|
507
535
|
|
@@ -526,13 +554,41 @@ var _tokenTaintTracer = _tokenTaintTracer || {
|
|
526
554
|
},
|
527
555
|
|
528
556
|
add_trace_to_function: function ( object, name, object_name ){
|
529
|
-
//
|
530
|
-
|
557
|
+
// object[name].toString() can fail for certain functions so play it
|
558
|
+
// safe and bail out.
|
559
|
+
try {
|
560
|
+
// Don't trace a tracer.
|
561
|
+
if( _tokenTaintTracer.get_traced_function().toString() == (object[name] || '').toString() )
|
562
|
+
return;
|
563
|
+
} catch (e) {
|
531
564
|
return;
|
565
|
+
}
|
566
|
+
|
567
|
+
var function_needle = 'function ' + name + '(';
|
568
|
+
|
569
|
+
// Not a function but a constructor for a class-like structure, don't
|
570
|
+
// break it (we can't handle 'this' context for classes).
|
571
|
+
//
|
572
|
+
// We only check for user-specified ones, under Window, because these
|
573
|
+
// are unknown; framework-specified ones have been vetted.
|
574
|
+
if(
|
575
|
+
object == window && object[name] &&
|
576
|
+
(
|
577
|
+
// The name should be the same as the function name...
|
578
|
+
object[name].toString().substring( 0, function_needle.length ) !== function_needle ||
|
579
|
+
|
580
|
+
// .. and the prototype needs to not have any members.
|
581
|
+
(
|
582
|
+
object[name].prototype &&
|
583
|
+
!_tokenTaintTracer.isEmpty( object[name].prototype )
|
584
|
+
)
|
585
|
+
)
|
586
|
+
) return;
|
532
587
|
|
533
588
|
object[name] = _tokenTaintTracer.get_traced_function(
|
534
589
|
object[name], object_name || _tokenTaintTracer.object_to_name( object ), name
|
535
590
|
);
|
591
|
+
|
536
592
|
},
|
537
593
|
|
538
594
|
install_tracers_from_list: function( list ) {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright 2010-
|
2
|
+
Copyright 2010-2022 Ecsypno <http://www.ecsypno.com>
|
3
3
|
|
4
4
|
This file is part of the Arachni Framework project and is subject to
|
5
5
|
redistribution and commercial restrictions. Please see the Arachni Framework
|
@@ -21,16 +21,11 @@ class Javascript
|
|
21
21
|
require_relative 'javascript/taint_tracer'
|
22
22
|
require_relative 'javascript/dom_monitor'
|
23
23
|
|
24
|
-
CACHE = {
|
25
|
-
events_for: Support::Cache::LeastRecentlyPushed.new( 1_000 ),
|
26
|
-
select_events: Support::Cache::LeastRecentlyPushed.new( 1_000 )
|
27
|
-
}
|
28
|
-
|
29
24
|
TOKEN = 'arachni_js_namespace'
|
30
25
|
|
31
26
|
# @return [String]
|
32
27
|
# URL to use when requesting our custom JS scripts.
|
33
|
-
SCRIPT_BASE_URL = '
|
28
|
+
SCRIPT_BASE_URL = 'https://javascript.browser.arachni/'
|
34
29
|
|
35
30
|
# @return [String]
|
36
31
|
# Filesystem directory containing the JS scripts.
|
@@ -40,75 +35,46 @@ class Javascript
|
|
40
35
|
h.merge!( path => IO.read(path) )
|
41
36
|
end
|
42
37
|
|
43
|
-
|
38
|
+
NO_EVENTS_FOR_ELEMENTS = Set.new(%w(
|
39
|
+
base bdo br head html iframe meta param script style title link hr
|
40
|
+
))
|
44
41
|
|
45
|
-
|
46
|
-
:base, :bdo, :br, :head, :html, :iframe, :meta, :param, :script, :style,
|
47
|
-
:title, :link, :hr
|
48
|
-
])
|
42
|
+
EACH_DOM_ELEMENT_WITH_EVENTS_BATCH_SIZE = 300
|
49
43
|
|
50
|
-
|
51
|
-
GLOBAL_EVENTS = [
|
44
|
+
EVENTS = Set.new([
|
52
45
|
:onclick,
|
53
46
|
:ondblclick,
|
54
47
|
:onmousedown,
|
55
48
|
:onmousemove,
|
56
49
|
:onmouseout,
|
57
50
|
:onmouseover,
|
58
|
-
:onmouseup
|
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
|
-
textarea: [
|
86
|
-
:onselect,
|
87
|
-
:onchange,
|
88
|
-
:onfocus,
|
89
|
-
:onblur,
|
90
|
-
:onkeydown,
|
91
|
-
:onkeypress,
|
92
|
-
:onkeyup,
|
93
|
-
:oninput
|
94
|
-
],
|
95
|
-
|
96
|
-
select: [
|
97
|
-
:onchange,
|
98
|
-
:onfocus,
|
99
|
-
:onblur
|
100
|
-
],
|
101
|
-
|
102
|
-
button: [
|
103
|
-
:onfocus,
|
104
|
-
:onblur
|
105
|
-
],
|
106
|
-
|
107
|
-
label: [
|
108
|
-
:onfocus,
|
109
|
-
:onblur
|
110
|
-
]
|
111
|
-
}
|
51
|
+
:onmouseup,
|
52
|
+
:onload,
|
53
|
+
:onsubmit,
|
54
|
+
:onselect,
|
55
|
+
:onchange,
|
56
|
+
:onfocus,
|
57
|
+
:onblur,
|
58
|
+
:onkeydown,
|
59
|
+
:onkeypress,
|
60
|
+
:onkeyup,
|
61
|
+
:oninput,
|
62
|
+
:onselect,
|
63
|
+
:onchange,
|
64
|
+
:onfocus,
|
65
|
+
:onblur,
|
66
|
+
:onkeydown,
|
67
|
+
:onkeypress,
|
68
|
+
:onkeyup,
|
69
|
+
:oninput,
|
70
|
+
:onchange,
|
71
|
+
:onfocus,
|
72
|
+
:onblur,
|
73
|
+
:onfocus,
|
74
|
+
:onblur,
|
75
|
+
:onfocus,
|
76
|
+
:onblur
|
77
|
+
])
|
112
78
|
|
113
79
|
# @return [String]
|
114
80
|
# Token used to namespace the injected JS code and avoid clashes.
|
@@ -132,53 +98,7 @@ class Javascript
|
|
132
98
|
attr_reader :taint_tracer
|
133
99
|
|
134
100
|
def self.events
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
def self.event_whitelist
|
139
|
-
@event_whitelist ||= Set.new( events.flatten.map(&:to_s) )
|
140
|
-
end
|
141
|
-
|
142
|
-
# @param [Symbol] tag_name
|
143
|
-
#
|
144
|
-
# @return [Set<Symbol>]
|
145
|
-
# Events for `element`.
|
146
|
-
def self.events_for( tag_name )
|
147
|
-
CACHE[:events_for].fetch tag_name.to_sym do
|
148
|
-
Set.new(
|
149
|
-
GLOBAL_EVENTS + (EVENTS_PER_ELEMENT[tag_name.to_sym] || [])
|
150
|
-
).freeze
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# @param [Symbol] tag_name
|
155
|
-
# @param [Hash] events
|
156
|
-
# Event data with the event name as the key.
|
157
|
-
#
|
158
|
-
# @return [Hash]
|
159
|
-
# `events` filtered to only include valid events for the given element type.
|
160
|
-
def self.select_events( tag_name, events )
|
161
|
-
CACHE[:select_events].fetch [tag_name, events] do
|
162
|
-
supported = events_for( tag_name )
|
163
|
-
events.reject do |name, _|
|
164
|
-
!supported.include?( ('on' + name.to_s.gsub( /^on/, '' )).to_sym )
|
165
|
-
end.freeze
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# @param [Hash] attributes
|
170
|
-
# Element attributes.
|
171
|
-
#
|
172
|
-
# @return [Hash]
|
173
|
-
# `attributes` that include {.events}.
|
174
|
-
def self.select_event_attributes( attributes = {} )
|
175
|
-
# NOTICE: Don't cache this, attributes can include all kinds of weird
|
176
|
-
# random crap (framework-specific data nonce attributes etc.) which will
|
177
|
-
# keep filling the cache due to constant misses.
|
178
|
-
attributes.inject({}) do |h, (event, handler)|
|
179
|
-
next h if !event_whitelist.include?( event.to_s )
|
180
|
-
h.merge!( event.to_sym => handler )
|
181
|
-
end.freeze
|
101
|
+
EVENTS
|
182
102
|
end
|
183
103
|
|
184
104
|
# @param [Browser] browser
|
@@ -238,14 +158,35 @@ class Javascript
|
|
238
158
|
|
239
159
|
# Blocks until the browser page is {#ready? ready}.
|
240
160
|
def wait_till_ready
|
241
|
-
|
242
|
-
|
161
|
+
print_debug_level_2 'Waiting for custom JS...'
|
162
|
+
|
163
|
+
if !supported?
|
164
|
+
print_debug_level_2 '...unsupported.'
|
165
|
+
return
|
166
|
+
end
|
167
|
+
|
168
|
+
t = Time.now
|
169
|
+
|
170
|
+
while !ready?
|
171
|
+
sleep 0.1
|
172
|
+
|
173
|
+
if Time.now - t > Options.browser_cluster.job_timeout
|
174
|
+
print_debug_level_2 '...timed out.'
|
175
|
+
return
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
print_debug_level_2 '...done.'
|
180
|
+
true
|
243
181
|
end
|
244
182
|
|
245
183
|
# @return [Bool]
|
246
184
|
# `true` if our custom JS environment has been initialized.
|
247
185
|
def ready?
|
248
|
-
|
186
|
+
run( "return (typeof window._#{token} !== 'undefined' && document.readyState === 'complete')" )
|
187
|
+
rescue => e
|
188
|
+
print_debug_exception e, 2
|
189
|
+
false
|
249
190
|
end
|
250
191
|
|
251
192
|
# @param [String] script
|
@@ -317,35 +258,43 @@ class Javascript
|
|
317
258
|
dom_monitor.digest
|
318
259
|
end
|
319
260
|
|
261
|
+
# @return [String]
|
262
|
+
# Digest of the available DOM events.
|
263
|
+
def dom_event_digest
|
264
|
+
return '' if !supported?
|
265
|
+
dom_monitor.event_digest
|
266
|
+
end
|
267
|
+
|
320
268
|
# @note Will not include custom events.
|
321
269
|
#
|
322
270
|
# @return [Array<Hash>]
|
323
271
|
# Information about all DOM elements, including any registered event listeners.
|
324
|
-
def
|
325
|
-
return
|
272
|
+
def each_dom_element_with_events( whitelist = [] )
|
273
|
+
return if !supported?
|
326
274
|
|
327
|
-
|
328
|
-
|
275
|
+
start = 0
|
276
|
+
batch_size = EACH_DOM_ELEMENT_WITH_EVENTS_BATCH_SIZE
|
329
277
|
|
330
|
-
|
331
|
-
|
332
|
-
|
278
|
+
loop do
|
279
|
+
elements = dom_monitor.elements_with_events( start, batch_size, whitelist )
|
280
|
+
return if elements.empty?
|
333
281
|
|
334
|
-
|
335
|
-
|
282
|
+
elements.each do |element|
|
283
|
+
next if NO_EVENTS_FOR_ELEMENTS.include? element['tag_name']
|
336
284
|
|
337
|
-
|
338
|
-
|
285
|
+
events = {}
|
286
|
+
element['events'].each do |event, handlers|
|
287
|
+
events[event.to_sym] = handlers
|
288
|
+
end
|
289
|
+
element['events'] = events
|
339
290
|
|
340
|
-
|
341
|
-
element['events'].each do |event, callback|
|
342
|
-
categorized[event] ||= []
|
343
|
-
categorized[event] << callback
|
291
|
+
yield element
|
344
292
|
end
|
345
|
-
element['events'] = categorized
|
346
293
|
|
347
|
-
|
348
|
-
|
294
|
+
return if elements.size < batch_size
|
295
|
+
|
296
|
+
start += elements.size
|
297
|
+
end
|
349
298
|
end
|
350
299
|
|
351
300
|
# @return [Array<Array>]
|
@@ -355,13 +304,6 @@ class Javascript
|
|
355
304
|
dom_monitor.timeouts
|
356
305
|
end
|
357
306
|
|
358
|
-
# @return [Array<Array>]
|
359
|
-
# Arguments for JS `setInterval` calls.
|
360
|
-
def intervals
|
361
|
-
return [] if !supported?
|
362
|
-
dom_monitor.intervals
|
363
|
-
end
|
364
|
-
|
365
307
|
# @param [HTTP::Request] request
|
366
308
|
# Request to process.
|
367
309
|
# @param [HTTP::Response] response
|
@@ -401,30 +343,24 @@ class Javascript
|
|
401
343
|
# This is necessary because new files can be required dynamically.
|
402
344
|
if javascript?( response )
|
403
345
|
|
404
|
-
response.body
|
346
|
+
response.body.insert 0, <<-EOCODE
|
405
347
|
#{js_comment}
|
406
348
|
#{taint_tracer.stub.function( :update_tracers )};
|
407
349
|
#{dom_monitor.stub.function( :update_trackers )};
|
408
|
-
|
409
|
-
#{response.body};
|
410
350
|
EOCODE
|
351
|
+
response.body << ";\n"
|
411
352
|
|
412
353
|
# Already has the JS initializer, so it's an HTML response; just update
|
413
354
|
# taints and custom code.
|
414
355
|
elsif has_js_initializer?( response )
|
415
356
|
|
416
|
-
|
417
|
-
|
418
|
-
update_taints( body, response )
|
419
|
-
update_custom_code( body )
|
420
|
-
|
421
|
-
response.body = body
|
357
|
+
update_taints( response.body, response )
|
358
|
+
update_custom_code( response.body )
|
422
359
|
|
423
360
|
elsif html?( response )
|
424
|
-
body = response.body.dup
|
425
361
|
|
426
362
|
# Perform an update before each script.
|
427
|
-
body.gsub!(
|
363
|
+
response.body.gsub!(
|
428
364
|
/<script.*?>/i,
|
429
365
|
"\\0\n
|
430
366
|
#{js_comment}
|
@@ -433,7 +369,7 @@ class Javascript
|
|
433
369
|
)
|
434
370
|
|
435
371
|
# Perform an update after each script.
|
436
|
-
body.gsub!(
|
372
|
+
response.body.gsub!(
|
437
373
|
/<\/script>/i,
|
438
374
|
"\\0\n<script type=\"text/javascript\">" <<
|
439
375
|
"#{@taint_tracer.stub.function( :update_tracers )};" <<
|
@@ -442,19 +378,19 @@ class Javascript
|
|
442
378
|
)
|
443
379
|
|
444
380
|
# Include and initialize our JS interfaces.
|
445
|
-
response.body
|
381
|
+
response.body.insert 0, <<-EOHTML
|
446
382
|
<script src="#{script_url_for( :polyfills )}"></script> #{html_comment}
|
447
383
|
<script src="#{script_url_for( :taint_tracer )}"></script> #{html_comment}
|
448
384
|
<script src="#{script_url_for( :dom_monitor )}"></script> #{html_comment}
|
449
385
|
<script>
|
386
|
+
#{wrapped_dom_monitor_initializer}
|
450
387
|
#{wrapped_taint_tracer_initializer( response )}
|
451
388
|
#{js_initialization_signal};
|
452
389
|
|
453
390
|
#{wrapped_custom_code}
|
454
391
|
</script> #{html_comment}
|
455
|
-
|
456
|
-
#{body}
|
457
392
|
EOHTML
|
393
|
+
|
458
394
|
end
|
459
395
|
|
460
396
|
true
|
@@ -465,43 +401,9 @@ class Javascript
|
|
465
401
|
end
|
466
402
|
|
467
403
|
def html?( response )
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
return false if !response.headers.content_type.to_s.downcase.start_with?( 'text/html' )
|
472
|
-
|
473
|
-
# Let's check that the response at least looks like it contains HTML
|
474
|
-
# code of interest.
|
475
|
-
body = response.body.downcase.strip
|
476
|
-
return false if !HTML_IDENTIFIERS.find { |tag| body.include? tag.downcase }
|
477
|
-
|
478
|
-
# If there's a doctype then we're good to go.
|
479
|
-
return true if body.start_with?( '<!doctype html' )
|
480
|
-
|
481
|
-
# The last check isn't fool-proof, so don't do it when loading the page
|
482
|
-
# for the first time, but only when the page loads stuff via AJAX and whatnot.
|
483
|
-
#
|
484
|
-
# Well, we can be pretty sure that the root page will be HTML anyways.
|
485
|
-
return true if @browser.last_url == response.url
|
486
|
-
|
487
|
-
# Finally, verify that we're really working with markup (hopefully HTML)
|
488
|
-
# and that the previous checks weren't just flukes matching some other
|
489
|
-
# kind of document.
|
490
|
-
#
|
491
|
-
# For example, it may have been JSON with the wrong content-type that
|
492
|
-
# includes HTML -- it happens.
|
493
|
-
#
|
494
|
-
# Beware, if there's a doctype in the beginning this will fail.
|
495
|
-
begin
|
496
|
-
return false if Parser.parse_xml( response.body ).children.empty?
|
497
|
-
rescue => e
|
498
|
-
print_debug "Does not look like HTML: #{response.url}"
|
499
|
-
print_debug "\n#{response.body}"
|
500
|
-
print_debug_exception e
|
501
|
-
return false
|
502
|
-
end
|
503
|
-
|
504
|
-
true
|
404
|
+
# If the server says it's HTML dig deeper to ensure it.
|
405
|
+
# We don't want wrong response headers messing up the JS env.
|
406
|
+
response.html? && Parser.html?( response.body )
|
505
407
|
end
|
506
408
|
|
507
409
|
private
|
@@ -566,6 +468,12 @@ class Javascript
|
|
566
468
|
)
|
567
469
|
end
|
568
470
|
|
471
|
+
def wrapped_dom_monitor_initializer
|
472
|
+
"/* #{token}_tokenDOMMonitor_initialize_start */ " <<
|
473
|
+
"#{@dom_monitor.stub.function( :initialize, Options.scope.dom_event_inheritance_limit )} " <<
|
474
|
+
"/* #{token}_tokenDOMMonitor_initialize_stop */"
|
475
|
+
end
|
476
|
+
|
569
477
|
def wrapped_taint_tracer_initializer( response )
|
570
478
|
"/* #{token}_initialize_start */ " <<
|
571
479
|
"#{@taint_tracer.stub.function( :initialize, taints( response ) )} " <<
|
@@ -592,9 +500,14 @@ class Javascript
|
|
592
500
|
end
|
593
501
|
|
594
502
|
def filesystem_path_for_script( filename )
|
595
|
-
|
596
|
-
|
597
|
-
|
503
|
+
@filesystem_path_for_script ||= {}
|
504
|
+
|
505
|
+
@filesystem_path_for_script[filename] ||= begin
|
506
|
+
name = "#{SCRIPT_LIBRARY}#{filename}"
|
507
|
+
name << '.js' if !name.end_with?( '.js')
|
508
|
+
|
509
|
+
File.expand_path( name )
|
510
|
+
end
|
598
511
|
end
|
599
512
|
|
600
513
|
def script_url_for( filename )
|