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.
Files changed (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/README.md +16 -5
  5. data/components/checks/active/ldap_injection/errors.txt +1 -0
  6. data/components/checks/active/source_code_disclosure.rb +1 -1
  7. data/components/checks/active/unvalidated_redirect.rb +6 -6
  8. data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
  9. data/components/checks/passive/grep/captcha.rb +14 -5
  10. data/components/checks/passive/grep/form_upload.rb +7 -3
  11. data/components/checks/passive/grep/hsts.rb +3 -3
  12. data/components/checks/passive/grep/html_objects.rb +2 -3
  13. data/components/checks/passive/grep/http_only_cookies.rb +2 -3
  14. data/components/checks/passive/grep/insecure_cookies.rb +1 -1
  15. data/components/checks/passive/grep/password_autocomplete.rb +2 -2
  16. data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
  17. data/components/checks/passive/grep/x_frame_options.rb +2 -2
  18. data/components/checks/passive/http_put.rb +2 -3
  19. data/components/path_extractors/comments.rb +3 -3
  20. data/components/path_extractors/scripts.rb +10 -1
  21. data/components/plugins/defaults/autothrottle.rb +27 -18
  22. data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
  23. data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
  24. data/components/plugins/login_script.rb +9 -3
  25. data/components/plugins/proxy.rb +4 -3
  26. data/components/reporters/html.rb +11 -14
  27. data/components/reporters/html/default/issue.erb +13 -38
  28. data/components/reporters/html/default/issue/info.erb +1 -1
  29. data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
  30. data/components/reporters/stdout.rb +62 -71
  31. data/components/reporters/xml.rb +26 -40
  32. data/components/reporters/xml/schema.xsd +43 -89
  33. data/lib/arachni/browser.rb +52 -3
  34. data/lib/arachni/browser/javascript.rb +3 -3
  35. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
  36. data/lib/arachni/browser_cluster.rb +61 -0
  37. data/lib/arachni/browser_cluster/job.rb +21 -1
  38. data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
  39. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
  40. data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
  41. data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
  42. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
  43. data/lib/arachni/browser_cluster/worker.rb +5 -0
  44. data/lib/arachni/check/auditor.rb +22 -12
  45. data/lib/arachni/data/framework.rb +13 -1
  46. data/lib/arachni/data/issues.rb +9 -25
  47. data/lib/arachni/element/base.rb +9 -3
  48. data/lib/arachni/element/capabilities/analyzable.rb +2 -6
  49. data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
  50. data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
  51. data/lib/arachni/element/capabilities/auditable.rb +0 -6
  52. data/lib/arachni/element/capabilities/dom_only.rb +61 -0
  53. data/lib/arachni/element/capabilities/with_dom.rb +3 -1
  54. data/lib/arachni/element/cookie.rb +35 -5
  55. data/lib/arachni/element/cookie/dom.rb +13 -4
  56. data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
  57. data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
  58. data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
  59. data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
  60. data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
  61. data/lib/arachni/element/form.rb +12 -1
  62. data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
  63. data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
  64. data/lib/arachni/element/form/dom.rb +9 -3
  65. data/lib/arachni/element/header.rb +14 -33
  66. data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
  67. data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
  68. data/lib/arachni/element/input/dom.rb +71 -0
  69. data/lib/arachni/element/json.rb +2 -0
  70. data/lib/arachni/element/link.rb +3 -0
  71. data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
  72. data/lib/arachni/element/link/dom.rb +16 -3
  73. data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
  74. data/lib/arachni/element/link_template.rb +3 -5
  75. data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
  76. data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
  77. data/lib/arachni/element/link_template/dom.rb +16 -3
  78. data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
  79. data/lib/arachni/element/server.rb +3 -5
  80. data/lib/arachni/element/ui_form.rb +106 -0
  81. data/lib/arachni/element/ui_form/dom.rb +107 -0
  82. data/lib/arachni/element/ui_input.rb +62 -0
  83. data/lib/arachni/element/xml.rb +2 -1
  84. data/lib/arachni/framework.rb +7 -5
  85. data/lib/arachni/framework/parts/audit.rb +0 -1
  86. data/lib/arachni/framework/parts/check.rb +1 -0
  87. data/lib/arachni/framework/parts/data.rb +4 -0
  88. data/lib/arachni/framework/parts/state.rb +0 -2
  89. data/lib/arachni/http/client.rb +17 -6
  90. data/lib/arachni/http/proxy_server.rb +52 -5
  91. data/lib/arachni/http/request.rb +1 -1
  92. data/lib/arachni/issue.rb +34 -179
  93. data/lib/arachni/issue/severity.rb +2 -0
  94. data/lib/arachni/option_groups/audit.rb +22 -2
  95. data/lib/arachni/option_groups/browser_cluster.rb +15 -0
  96. data/lib/arachni/page.rb +3 -2
  97. data/lib/arachni/parser.rb +24 -5
  98. data/lib/arachni/platform/manager.rb +1 -2
  99. data/lib/arachni/rpc/server/framework.rb +3 -4
  100. data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
  101. data/lib/arachni/session.rb +1 -1
  102. data/lib/arachni/trainer.rb +4 -7
  103. data/lib/arachni/watir/element.rb +12 -1
  104. data/lib/version +1 -1
  105. data/spec/arachni/browser/element_locator_spec.rb +43 -43
  106. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
  107. data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
  108. data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
  109. data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
  110. data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
  111. data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
  112. data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
  113. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
  114. data/spec/arachni/browser/javascript_spec.rb +73 -63
  115. data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
  116. data/spec/arachni/browser_cluster/job_spec.rb +68 -48
  117. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
  118. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
  119. data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
  120. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
  121. data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
  122. data/spec/arachni/browser_cluster_spec.rb +64 -39
  123. data/spec/arachni/browser_spec.rb +692 -527
  124. data/spec/arachni/check/auditor_spec.rb +177 -147
  125. data/spec/arachni/check/base_spec.rb +33 -33
  126. data/spec/arachni/check/manager_spec.rb +15 -15
  127. data/spec/arachni/component/base_spec.rb +8 -8
  128. data/spec/arachni/component/manager_spec.rb +100 -99
  129. data/spec/arachni/component/options/address_spec.rb +3 -3
  130. data/spec/arachni/component/options/base_spec.rb +7 -7
  131. data/spec/arachni/component/options/bool_spec.rb +9 -9
  132. data/spec/arachni/component/options/float_spec.rb +6 -6
  133. data/spec/arachni/component/options/int_spec.rb +5 -5
  134. data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
  135. data/spec/arachni/component/options/object_spec.rb +2 -2
  136. data/spec/arachni/component/options/path_spec.rb +3 -3
  137. data/spec/arachni/component/options/port_spec.rb +5 -5
  138. data/spec/arachni/component/options/string_spec.rb +3 -3
  139. data/spec/arachni/component/options/url_spec.rb +4 -4
  140. data/spec/arachni/component/utilities_spec.rb +2 -2
  141. data/spec/arachni/data/framework/rpc_spec.rb +10 -9
  142. data/spec/arachni/data/framework_spec.rb +65 -46
  143. data/spec/arachni/data/issues_spec.rb +39 -77
  144. data/spec/arachni/data/plugins_spec.rb +11 -11
  145. data/spec/arachni/data/session_spec.rb +6 -6
  146. data/spec/arachni/data_spec.rb +8 -8
  147. data/spec/arachni/element/body_spec.rb +10 -10
  148. data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
  149. data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
  150. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
  151. data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
  152. data/spec/arachni/element/cookie/dom_spec.rb +37 -18
  153. data/spec/arachni/element/cookie_spec.rb +206 -139
  154. data/spec/arachni/element/form/dom_spec.rb +36 -19
  155. data/spec/arachni/element/form_spec.rb +210 -187
  156. data/spec/arachni/element/generic_dom_spec.rb +14 -14
  157. data/spec/arachni/element/header_spec.rb +35 -17
  158. data/spec/arachni/element/json_spec.rb +53 -31
  159. data/spec/arachni/element/link/dom_spec.rb +46 -28
  160. data/spec/arachni/element/link_spec.rb +58 -40
  161. data/spec/arachni/element/link_template/dom_spec.rb +47 -29
  162. data/spec/arachni/element/link_template_spec.rb +79 -61
  163. data/spec/arachni/element/path_spec.rb +1 -1
  164. data/spec/arachni/element/server_spec.rb +33 -32
  165. data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
  166. data/spec/arachni/element/ui_form_spec.rb +242 -0
  167. data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
  168. data/spec/arachni/element/ui_input_spec.rb +136 -0
  169. data/spec/arachni/element/xml_spec.rb +42 -24
  170. data/spec/arachni/element_filter_spec.rb +49 -48
  171. data/spec/arachni/error_spec.rb +3 -3
  172. data/spec/arachni/framework/parts/audit_spec.rb +64 -63
  173. data/spec/arachni/framework/parts/browser_spec.rb +16 -16
  174. data/spec/arachni/framework/parts/check_spec.rb +3 -3
  175. data/spec/arachni/framework/parts/data_spec.rb +48 -48
  176. data/spec/arachni/framework/parts/platform_spec.rb +3 -3
  177. data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
  178. data/spec/arachni/framework/parts/report_spec.rb +7 -7
  179. data/spec/arachni/framework/parts/scope_spec.rb +16 -16
  180. data/spec/arachni/framework/parts/state_spec.rb +68 -69
  181. data/spec/arachni/framework_spec.rb +39 -31
  182. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
  183. data/spec/arachni/http/client_spec.rb +219 -208
  184. data/spec/arachni/http/cookie_jar_spec.rb +72 -72
  185. data/spec/arachni/http/headers_spec.rb +14 -14
  186. data/spec/arachni/http/proxy_server_spec.rb +43 -42
  187. data/spec/arachni/http/request_spec.rb +105 -103
  188. data/spec/arachni/http/response/scope_spec.rb +24 -24
  189. data/spec/arachni/http/response_spec.rb +50 -49
  190. data/spec/arachni/issue/severity_spec.rb +10 -9
  191. data/spec/arachni/issue_spec.rb +71 -369
  192. data/spec/arachni/option_groups/audit_spec.rb +114 -114
  193. data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
  194. data/spec/arachni/option_groups/datastore_spec.rb +6 -6
  195. data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
  196. data/spec/arachni/option_groups/http_spec.rb +11 -11
  197. data/spec/arachni/option_groups/input_spec.rb +31 -27
  198. data/spec/arachni/option_groups/output_spec.rb +2 -2
  199. data/spec/arachni/option_groups/paths_spec.rb +17 -17
  200. data/spec/arachni/option_groups/rpc_spec.rb +2 -2
  201. data/spec/arachni/option_groups/scope_spec.rb +40 -40
  202. data/spec/arachni/option_groups/session_spec.rb +6 -5
  203. data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
  204. data/spec/arachni/options_spec.rb +46 -45
  205. data/spec/arachni/page/dom/transition_spec.rb +74 -72
  206. data/spec/arachni/page/dom_spec.rb +35 -35
  207. data/spec/arachni/page/scope_spec.rb +15 -15
  208. data/spec/arachni/page_spec.rb +217 -217
  209. data/spec/arachni/parser_spec.rb +106 -104
  210. data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
  211. data/spec/arachni/platform/list_spec.rb +33 -33
  212. data/spec/arachni/platform/manager_spec.rb +67 -64
  213. data/spec/arachni/plugin/base_spec.rb +10 -10
  214. data/spec/arachni/plugin/manager_spec.rb +38 -37
  215. data/spec/arachni/report_spec.rb +43 -40
  216. data/spec/arachni/reporter/base_spec.rb +15 -15
  217. data/spec/arachni/reporter/manager_spec.rb +4 -4
  218. data/spec/arachni/reporter/options_spec.rb +6 -6
  219. data/spec/arachni/rpc/client/base_spec.rb +6 -6
  220. data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
  221. data/spec/arachni/rpc/client/instance_spec.rb +6 -6
  222. data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
  223. data/spec/arachni/rpc/server/base_spec.rb +5 -5
  224. data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
  225. data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
  226. data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
  227. data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
  228. data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
  229. data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
  230. data/spec/arachni/rpc/server/framework_spec.rb +90 -85
  231. data/spec/arachni/rpc/server/instance_spec.rb +126 -107
  232. data/spec/arachni/rpc/server/output_spec.rb +1 -1
  233. data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
  234. data/spec/arachni/ruby/array_spec.rb +42 -42
  235. data/spec/arachni/ruby/hash_spec.rb +20 -18
  236. data/spec/arachni/ruby/io_spec.rb +2 -2
  237. data/spec/arachni/ruby/object_spec.rb +1 -1
  238. data/spec/arachni/ruby/set_spec.rb +3 -3
  239. data/spec/arachni/ruby/string_spec.rb +30 -30
  240. data/spec/arachni/ruby/webrick_spec.rb +2 -2
  241. data/spec/arachni/scope_spec.rb +1 -1
  242. data/spec/arachni/session_spec.rb +67 -64
  243. data/spec/arachni/snapshot_spec.rb +15 -15
  244. data/spec/arachni/state/audit_spec.rb +11 -11
  245. data/spec/arachni/state/element_filter_spec.rb +6 -6
  246. data/spec/arachni/state/framework/rpc_spec.rb +12 -12
  247. data/spec/arachni/state/framework_spec.rb +125 -121
  248. data/spec/arachni/state/http_spec.rb +7 -7
  249. data/spec/arachni/state/options_spec.rb +7 -7
  250. data/spec/arachni/state/plugins_spec.rb +8 -8
  251. data/spec/arachni/state_spec.rb +10 -10
  252. data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
  253. data/spec/arachni/support/buffer/base_spec.rb +39 -39
  254. data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
  255. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
  256. data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
  257. data/spec/arachni/support/cache/preference_spec.rb +4 -4
  258. data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
  259. data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
  260. data/spec/arachni/support/database/hash_spec.rb +44 -43
  261. data/spec/arachni/support/database/queue_spec.rb +27 -27
  262. data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
  263. data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
  264. data/spec/arachni/support/mixins/observable_spec.rb +6 -6
  265. data/spec/arachni/support/signature_spec.rb +19 -19
  266. data/spec/arachni/trainer_spec.rb +39 -39
  267. data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
  268. data/spec/arachni/uri/scope_spec.rb +66 -66
  269. data/spec/arachni/uri_spec.rb +107 -105
  270. data/spec/arachni/utilities_spec.rb +40 -40
  271. data/spec/components/checks/active/csrf_spec.rb +8 -8
  272. data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
  273. data/spec/components/checks/active/sql_injection_spec.rb +16 -16
  274. data/spec/components/checks/active/trainer_spec.rb +4 -4
  275. data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
  276. data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
  277. data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
  278. data/spec/components/checks/active/xss_dom_spec.rb +46 -24
  279. data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
  280. data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
  281. data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
  282. data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
  283. data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
  284. data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
  285. data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
  286. data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
  287. data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
  288. data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
  289. data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
  290. data/spec/components/checks/passive/webdav_spec.rb +1 -1
  291. data/spec/components/checks/passive/xst_spec.rb +1 -1
  292. data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
  293. data/spec/components/path_extractors/comments_spec.rb +5 -1
  294. data/spec/components/path_extractors/scripts_spec.rb +5 -2
  295. data/spec/components/plugins/autologin_spec.rb +22 -22
  296. data/spec/components/plugins/autothrottle_spec.rb +6 -5
  297. data/spec/components/plugins/content_types_spec.rb +4 -4
  298. data/spec/components/plugins/cookie_collector_spec.rb +5 -5
  299. data/spec/components/plugins/exec_spec.rb +12 -12
  300. data/spec/components/plugins/form_dicattack_spec.rb +3 -3
  301. data/spec/components/plugins/headers_collector_spec.rb +8 -8
  302. data/spec/components/plugins/healthmap_spec.rb +3 -3
  303. data/spec/components/plugins/http_dicattack_spec.rb +3 -3
  304. data/spec/components/plugins/login_script_spec.rb +79 -22
  305. data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
  306. data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
  307. data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
  308. data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
  309. data/spec/components/plugins/script_spec.rb +1 -1
  310. data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
  311. data/spec/components/plugins/vector_collector_spec.rb +2 -2
  312. data/spec/components/plugins/vector_feed_spec.rb +40 -40
  313. data/spec/components/plugins/waf_detector_spec.rb +6 -6
  314. data/spec/components/reporters/json_spec.rb +4 -4
  315. data/spec/components/reporters/marshal_spec.rb +2 -2
  316. data/spec/components/reporters/yaml_spec.rb +3 -2
  317. data/spec/external/wavsep/active/sqli_spec.rb +1 -3
  318. data/spec/spec_helper.rb +4 -0
  319. data/spec/support/factories/element/ui_form.rb +14 -0
  320. data/spec/support/factories/element/ui_input.rb +13 -0
  321. data/spec/support/factories/issue.rb +0 -13
  322. data/spec/support/fixtures/report.afr +0 -0
  323. data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
  324. data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
  325. data/spec/support/helpers/framework.rb +1 -1
  326. data/spec/support/helpers/pages.rb +2 -2
  327. data/spec/support/servers/arachni/browser.rb +139 -0
  328. data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
  329. data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
  330. data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
  331. data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
  332. data/spec/support/servers/checks/active/trainer_check.rb +7 -7
  333. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
  334. data/spec/support/servers/checks/active/xss_dom.rb +50 -0
  335. data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
  336. data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
  337. data/spec/support/shared/check.rb +10 -12
  338. data/spec/support/shared/component/options/base.rb +24 -24
  339. data/spec/support/shared/element/base.rb +25 -25
  340. data/spec/support/shared/element/capabilities/auditable.rb +116 -140
  341. data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
  342. data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
  343. data/spec/support/shared/element/capabilities/mutable.rb +122 -111
  344. data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
  345. data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
  346. data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
  347. data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
  348. data/spec/support/shared/element/capabilities/with_node.rb +4 -6
  349. data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
  350. data/spec/support/shared/element/capabilities/with_source.rb +6 -8
  351. data/spec/support/shared/element/dom.rb +144 -0
  352. data/spec/support/shared/element/dom/auditable.rb +42 -0
  353. data/spec/support/shared/element/dom/inputtable.rb +5 -0
  354. data/spec/support/shared/element/dom/mutable.rb +3 -0
  355. data/spec/support/shared/element/dom/submittable.rb +119 -0
  356. data/spec/support/shared/external/wavsep.rb +3 -3
  357. data/spec/support/shared/fingerprinter.rb +2 -2
  358. data/spec/support/shared/framework.rb +1 -1
  359. data/spec/support/shared/http/message.rb +9 -9
  360. data/spec/support/shared/option_group.rb +17 -17
  361. data/spec/support/shared/path_extractor.rb +1 -1
  362. data/spec/support/shared/plugin.rb +2 -2
  363. data/spec/support/shared/support/cache.rb +57 -57
  364. data/spec/support/shared/support/lookup.rb +25 -25
  365. data/ui/cli/framework.rb +22 -11
  366. data/ui/cli/framework/option_parser.rb +15 -0
  367. data/ui/cli/option_parser.rb +8 -1
  368. data/ui/cli/output.rb +2 -1
  369. metadata +54 -20
  370. data/components/checks/active/xss_dom_inputs.rb +0 -236
  371. data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
  372. data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
  373. data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
@@ -18,13 +18,13 @@ describe Arachni::Utilities do
18
18
 
19
19
  describe '#caller_name' do
20
20
  it 'returns the filename of the caller' do
21
- subject.caller_name.should == 'instance_eval_with_args'
21
+ expect(subject.caller_name).to eq('instance_eval_with_args')
22
22
  end
23
23
  end
24
24
 
25
25
  describe '#caller_path' do
26
26
  it 'returns the filepath of the caller' do
27
- subject.caller_path.should == Kernel.caller.first.match( /^(.+):\d/ )[1]
27
+ expect(subject.caller_path).to eq(Kernel.caller.first.match( /^(.+):\d/ )[1])
28
28
  end
29
29
  end
30
30
 
@@ -61,15 +61,15 @@ describe Arachni::Utilities do
61
61
  it "delegates to #{klass}.#{delegated}" do
62
62
  ret = :blah
63
63
 
64
- klass.stub(delegated){ ret }
65
- subject.send( m, 'stuff' ).should == ret
64
+ allow(klass).to receive(delegated){ ret }
65
+ expect(subject.send( m, 'stuff' )).to eq(ret)
66
66
  end
67
67
  end
68
68
  end
69
69
 
70
70
  describe '#uri_parser' do
71
71
  it 'returns a URI::Parser' do
72
- subject.uri_parser.class.should == ::URI::Parser
72
+ expect(subject.uri_parser.class).to eq(::URI::Parser)
73
73
  end
74
74
  end
75
75
 
@@ -78,8 +78,8 @@ describe Arachni::Utilities do
78
78
  }.each do |k, v|
79
79
  describe "##{k}" do
80
80
  it "delegates to #{Arachni::URI}##{v}" do
81
- Arachni::URI.any_instance.stub(v) { :stuff }
82
- subject.send( k, 'http://url/' ).should == :stuff
81
+ allow_any_instance_of(Arachni::URI).to receive(v) { :stuff }
82
+ expect(subject.send( k, 'http://url/' )).to eq(:stuff)
83
83
  end
84
84
  end
85
85
  end
@@ -94,8 +94,8 @@ describe Arachni::Utilities do
94
94
  }.each do |k, v|
95
95
  describe "##{k}" do
96
96
  it "delegates to #{Arachni::URI::Scope}##{v}" do
97
- Arachni::URI::Scope.any_instance.stub(v) { :stuff }
98
- subject.send( k, 'http://url/' ).should == :stuff
97
+ allow_any_instance_of(Arachni::URI::Scope).to receive(v) { :stuff }
98
+ expect(subject.send( k, 'http://url/' )).to eq(:stuff)
99
99
  end
100
100
  end
101
101
  end
@@ -103,14 +103,14 @@ describe Arachni::Utilities do
103
103
  describe '#port_available?' do
104
104
  context 'when a port is available' do
105
105
  it 'returns true' do
106
- subject.port_available?( 7777 ).should be_true
106
+ expect(subject.port_available?( 7777 )).to be_truthy
107
107
  end
108
108
  end
109
109
 
110
110
  context 'when a port is not available' do
111
111
  it 'returns true' do
112
112
  s = TCPServer.new( 7777 )
113
- subject.port_available?( 7777 ).should be_false
113
+ expect(subject.port_available?( 7777 )).to be_falsey
114
114
  s.close
115
115
  end
116
116
  end
@@ -118,15 +118,15 @@ describe Arachni::Utilities do
118
118
 
119
119
  describe '#skip_page?' do
120
120
  it "delegates to #{Arachni::Page::Scope}#out?" do
121
- Arachni::Page::Scope.any_instance.stub(:out?) { :stuff }
122
- subject.skip_page?( page ).should == :stuff
121
+ allow_any_instance_of(Arachni::Page::Scope).to receive(:out?) { :stuff }
122
+ expect(subject.skip_page?( page )).to eq(:stuff)
123
123
  end
124
124
  end
125
125
 
126
126
  describe '#skip_response?' do
127
127
  it "delegates to #{Arachni::HTTP::Response::Scope}#out?" do
128
- Arachni::HTTP::Response::Scope.any_instance.stub(:out?) { :stuff }
129
- subject.skip_response?( response ).should == :stuff
128
+ allow_any_instance_of(Arachni::HTTP::Response::Scope).to receive(:out?) { :stuff }
129
+ expect(subject.skip_response?( response )).to eq(:stuff)
130
130
  end
131
131
  end
132
132
 
@@ -136,15 +136,15 @@ describe Arachni::Utilities do
136
136
  context 'and #skip_response? returns' do
137
137
  context 'true' do
138
138
  it 'returns true' do
139
- subject.stub(:skip_response?){ true }
140
- subject.skip_resource?( response ).should be_true
139
+ allow(subject).to receive(:skip_response?){ true }
140
+ expect(subject.skip_resource?( response )).to be_truthy
141
141
  end
142
142
  end
143
143
 
144
144
  context 'false' do
145
145
  it 'returns false' do
146
- subject.stub(:skip_response?){ false }
147
- subject.skip_resource?( response ).should be_false
146
+ allow(subject).to receive(:skip_response?){ false }
147
+ expect(subject.skip_resource?( response )).to be_falsey
148
148
  end
149
149
  end
150
150
  end
@@ -154,15 +154,15 @@ describe Arachni::Utilities do
154
154
  context 'and #skip_page? returns' do
155
155
  context 'true' do
156
156
  it 'returns true' do
157
- subject.stub(:skip_page?){ true }
158
- subject.skip_resource?( page ).should be_true
157
+ allow(subject).to receive(:skip_page?){ true }
158
+ expect(subject.skip_resource?( page )).to be_truthy
159
159
  end
160
160
  end
161
161
 
162
162
  context 'false' do
163
163
  it 'returns false' do
164
- subject.stub(:skip_page?){ false }
165
- subject.skip_resource?( page ).should be_false
164
+ allow(subject).to receive(:skip_page?){ false }
165
+ expect(subject.skip_resource?( page )).to be_falsey
166
166
  end
167
167
  end
168
168
  end
@@ -172,15 +172,15 @@ describe Arachni::Utilities do
172
172
  context 'and #skip_path? returns' do
173
173
  context 'true' do
174
174
  it 'returns true' do
175
- subject.stub(:skip_path?){ true }
176
- subject.skip_resource?( 'stuff' ).should be_true
175
+ allow(subject).to receive(:skip_path?){ true }
176
+ expect(subject.skip_resource?( 'stuff' )).to be_truthy
177
177
  end
178
178
  end
179
179
 
180
180
  context 'false' do
181
181
  it 'returns false' do
182
- subject.stub(:skip_path?){ false }
183
- subject.skip_resource?( 'stuff' ).should be_false
182
+ allow(subject).to receive(:skip_path?){ false }
183
+ expect(subject.skip_resource?( 'stuff' )).to be_falsey
184
184
  end
185
185
  end
186
186
  end
@@ -190,34 +190,34 @@ describe Arachni::Utilities do
190
190
 
191
191
  describe '#random_seed' do
192
192
  it 'returns a random string' do
193
- subject.random_seed.should be_kind_of String
193
+ expect(subject.random_seed).to be_kind_of String
194
194
  end
195
195
  end
196
196
 
197
197
  describe '#seconds_to_hms' do
198
198
  it 'converts seconds to HOURS:MINUTES:SECONDS' do
199
- subject.seconds_to_hms( 0 ).should == '00:00:00'
200
- subject.seconds_to_hms( 1 ).should == '00:00:01'
201
- subject.seconds_to_hms( 60 ).should == '00:01:00'
202
- subject.seconds_to_hms( 60*60 ).should == '01:00:00'
203
- subject.seconds_to_hms( 60*60 + 60 + 1 ).should == '01:01:01'
199
+ expect(subject.seconds_to_hms( 0 )).to eq('00:00:00')
200
+ expect(subject.seconds_to_hms( 1 )).to eq('00:00:01')
201
+ expect(subject.seconds_to_hms( 60 )).to eq('00:01:00')
202
+ expect(subject.seconds_to_hms( 60*60 )).to eq('01:00:00')
203
+ expect(subject.seconds_to_hms( 60*60 + 60 + 1 )).to eq('01:01:01')
204
204
  end
205
205
  end
206
206
 
207
207
  describe '#hms_to_seconds' do
208
208
  it 'converts seconds to HOURS:MINUTES:SECONDS' do
209
- subject.hms_to_seconds( '00:00:00' ).should == 0
210
- subject.hms_to_seconds( '00:00:01' ).should == 1
211
- subject.hms_to_seconds( '00:01:00' ).should == 60
212
- subject.hms_to_seconds( '01:00:00' ).should == 60*60
213
- subject.hms_to_seconds( '01:01:01').should == 60 * 60 + 60 + 1
209
+ expect(subject.hms_to_seconds( '00:00:00' )).to eq(0)
210
+ expect(subject.hms_to_seconds( '00:00:01' )).to eq(1)
211
+ expect(subject.hms_to_seconds( '00:01:00' )).to eq(60)
212
+ expect(subject.hms_to_seconds( '01:00:00' )).to eq(60*60)
213
+ expect(subject.hms_to_seconds( '01:01:01')).to eq(60 * 60 + 60 + 1)
214
214
  end
215
215
  end
216
216
 
217
217
  describe '#exception_jail' do
218
218
  context 'when no error occurs' do
219
219
  it 'returns the return value of the block' do
220
- subject.exception_jail { :stuff }.should == :stuff
220
+ expect(subject.exception_jail { :stuff }).to eq(:stuff)
221
221
  end
222
222
  end
223
223
 
@@ -241,7 +241,7 @@ describe Arachni::Utilities do
241
241
 
242
242
  context false do
243
243
  it 'returns nil' do
244
- subject.exception_jail( false ) { raise }.should be_nil
244
+ expect(subject.exception_jail( false ) { raise }).to be_nil
245
245
  end
246
246
  end
247
247
  end
@@ -16,29 +16,29 @@ describe name_from_filename do
16
16
 
17
17
  it 'logs forms that lack CSRF protection' do
18
18
  audit :forms
19
- issues.size.should == 1
20
- issues.first.vector.name.should == 'insecure_important_form'
19
+ expect(issues.size).to eq(1)
20
+ expect(issues.first.vector.name).to eq('insecure_important_form')
21
21
  end
22
22
 
23
23
  it 'skips forms that have an anti-CSRF token in a name attribute' do
24
24
  options.url = url + 'token_in_name'
25
25
  audit :forms
26
- issues.size.should == 1
27
- issues.first.vector.name.should == 'insecure_important_form'
26
+ expect(issues.size).to eq(1)
27
+ expect(issues.first.vector.name).to eq('insecure_important_form')
28
28
  end
29
29
 
30
30
  it 'skips forms that have an anti-CSRF token in their action URL' do
31
31
  options.url = url + 'token_in_action'
32
32
  audit :forms
33
- issues.size.should == 1
34
- issues.first.vector.name.should == 'insecure_important_form'
33
+ expect(issues.size).to eq(1)
34
+ expect(issues.first.vector.name).to eq('insecure_important_form')
35
35
  end
36
36
 
37
37
  it 'skips forms that have a nonce' do
38
38
  options.url = url + 'with_nonce'
39
39
  audit :forms
40
- issues.size.should == 1
41
- issues.first.vector.name.should == 'insecure_important_form'
40
+ expect(issues.size).to eq(1)
41
+ expect(issues.first.vector.name).to eq('insecure_important_form')
42
42
  end
43
43
 
44
44
  end
@@ -17,7 +17,7 @@ describe name_from_filename do
17
17
  mongodb: {
18
18
  Element::Form => 2,
19
19
  Element::Link => 2,
20
- Element::Cookie => 1,
20
+ Element::Cookie => 2,
21
21
  Element::Header => 1,
22
22
  Element::LinkTemplate => 1,
23
23
  Element::JSON => 2,
@@ -19,7 +19,7 @@ describe name_from_filename do
19
19
  access: {
20
20
  Element::Form => 12,
21
21
  Element::Link => 12,
22
- Element::Cookie => 6,
22
+ Element::Cookie => 12,
23
23
  Element::Header => 6,
24
24
  Element::LinkTemplate => 6,
25
25
  Element::JSON => 12,
@@ -28,7 +28,7 @@ describe name_from_filename do
28
28
  db2: {
29
29
  Element::Form => 16,
30
30
  Element::Link => 16,
31
- Element::Cookie => 8,
31
+ Element::Cookie => 16,
32
32
  Element::Header => 8,
33
33
  Element::LinkTemplate => 8,
34
34
  Element::JSON => 16,
@@ -37,7 +37,7 @@ describe name_from_filename do
37
37
  emc: {
38
38
  Element::Form => 8,
39
39
  Element::Link => 8,
40
- Element::Cookie => 4,
40
+ Element::Cookie => 8,
41
41
  Element::Header => 4,
42
42
  Element::LinkTemplate => 4,
43
43
  Element::JSON => 8,
@@ -46,7 +46,7 @@ describe name_from_filename do
46
46
  firebird: {
47
47
  Element::Form => 4,
48
48
  Element::Link => 4,
49
- Element::Cookie => 2,
49
+ Element::Cookie => 4,
50
50
  Element::Header => 2,
51
51
  Element::LinkTemplate => 2,
52
52
  Element::JSON => 4,
@@ -55,7 +55,7 @@ describe name_from_filename do
55
55
  frontbase: {
56
56
  Element::Form => 4,
57
57
  Element::Link => 4,
58
- Element::Cookie => 2,
58
+ Element::Cookie => 4,
59
59
  Element::Header => 2,
60
60
  Element::LinkTemplate => 2,
61
61
  Element::JSON => 4,
@@ -64,7 +64,7 @@ describe name_from_filename do
64
64
  hsqldb: {
65
65
  Element::Form => 4,
66
66
  Element::Link => 4,
67
- Element::Cookie => 2,
67
+ Element::Cookie => 4,
68
68
  Element::Header => 2,
69
69
  Element::LinkTemplate => 2,
70
70
  Element::JSON => 4,
@@ -73,7 +73,7 @@ describe name_from_filename do
73
73
  informix: {
74
74
  Element::Form => 12,
75
75
  Element::Link => 12,
76
- Element::Cookie => 6,
76
+ Element::Cookie => 12,
77
77
  Element::Header => 6,
78
78
  Element::LinkTemplate => 6,
79
79
  Element::JSON => 12,
@@ -82,7 +82,7 @@ describe name_from_filename do
82
82
  ingres: {
83
83
  Element::Form => 12,
84
84
  Element::Link => 12,
85
- Element::Cookie => 6,
85
+ Element::Cookie => 12,
86
86
  Element::Header => 6,
87
87
  Element::LinkTemplate => 6,
88
88
  Element::JSON => 12,
@@ -91,7 +91,7 @@ describe name_from_filename do
91
91
  interbase: {
92
92
  Element::Form => 8,
93
93
  Element::Link => 8,
94
- Element::Cookie => 4,
94
+ Element::Cookie => 8,
95
95
  Element::Header => 4,
96
96
  Element::LinkTemplate => 4,
97
97
  Element::JSON => 8,
@@ -100,7 +100,7 @@ describe name_from_filename do
100
100
  maxdb: {
101
101
  Element::Form => 4,
102
102
  Element::Link => 4,
103
- Element::Cookie => 2,
103
+ Element::Cookie => 4,
104
104
  Element::Header => 2,
105
105
  Element::LinkTemplate => 2,
106
106
  Element::JSON => 4,
@@ -109,7 +109,7 @@ describe name_from_filename do
109
109
  mssql: {
110
110
  Element::Form => 86,
111
111
  Element::Link => 86,
112
- Element::Cookie => 42,
112
+ Element::Cookie => 86,
113
113
  Element::Header => 42,
114
114
  Element::LinkTemplate => 42,
115
115
  Element::JSON => 86,
@@ -118,7 +118,7 @@ describe name_from_filename do
118
118
  mysql: {
119
119
  Element::Form => 52,
120
120
  Element::Link => 52,
121
- Element::Cookie => 26,
121
+ Element::Cookie => 52,
122
122
  Element::Header => 26,
123
123
  Element::LinkTemplate => 26,
124
124
  Element::JSON => 52,
@@ -127,7 +127,7 @@ describe name_from_filename do
127
127
  oracle: {
128
128
  Element::Form => 20,
129
129
  Element::Link => 20,
130
- Element::Cookie => 10,
130
+ Element::Cookie => 20,
131
131
  Element::Header => 10,
132
132
  Element::LinkTemplate => 10,
133
133
  Element::JSON => 20,
@@ -136,7 +136,7 @@ describe name_from_filename do
136
136
  pgsql: {
137
137
  Element::Form => 36,
138
138
  Element::Link => 36,
139
- Element::Cookie => 18,
139
+ Element::Cookie => 36,
140
140
  Element::Header => 18,
141
141
  Element::LinkTemplate => 18,
142
142
  Element::JSON => 36,
@@ -145,7 +145,7 @@ describe name_from_filename do
145
145
  sqlite: {
146
146
  Element::Form => 16,
147
147
  Element::Link => 16,
148
- Element::Cookie => 8,
148
+ Element::Cookie => 16,
149
149
  Element::Header => 8,
150
150
  Element::LinkTemplate => 8,
151
151
  Element::JSON => 16,
@@ -154,7 +154,7 @@ describe name_from_filename do
154
154
  sybase: {
155
155
  Element::Form => 12,
156
156
  Element::Link => 12,
157
- Element::Cookie => 6,
157
+ Element::Cookie => 12,
158
158
  Element::Header => 6,
159
159
  Element::LinkTemplate => 6,
160
160
  Element::JSON => 12,
@@ -17,8 +17,8 @@ describe name_from_filename do
17
17
  audit element, false
18
18
 
19
19
  urls = framework.sitemap
20
- urls.should include options.url + "#{element}/straight/trained"
21
- urls.should include options.url + "#{element}/append/trained"
20
+ expect(urls).to include options.url + "#{element}/straight/trained"
21
+ expect(urls).to include options.url + "#{element}/append/trained"
22
22
  end
23
23
  end
24
24
 
@@ -28,8 +28,8 @@ describe name_from_filename do
28
28
  audit :form, false
29
29
 
30
30
  urls = framework.sitemap
31
- urls.should_not include "#{options.url}form/straight/trained"
32
- urls.should_not include "#{options.url}form/append/trained"
31
+ expect(urls).not_to include "#{options.url}header/straight/trained"
32
+ expect(urls).not_to include "#{options.url}header/append/trained"
33
33
  end
34
34
  end
35
35
 
@@ -4,14 +4,16 @@ describe name_from_filename do
4
4
  include_examples 'check'
5
5
 
6
6
  def self.elements
7
- [ Element::Form::DOM, Element::Link::DOM, Element::Cookie::DOM ]
7
+ [ Element::Form::DOM, Element::Link::DOM, Element::Cookie::DOM,
8
+ Element::UIForm::DOM ]
8
9
  end
9
10
 
10
11
  def issue_count_per_element
11
12
  {
12
13
  Element::Form::DOM => 3,
13
14
  Element::Link::DOM => 3,
14
- Element::Cookie::DOM => 3
15
+ Element::Cookie::DOM => 3,
16
+ Element::UIForm::DOM => 3
15
17
  }
16
18
  end
17
19
 
@@ -12,7 +12,7 @@ describe name_from_filename do
12
12
  {
13
13
  Element::Form => 125,
14
14
  Element::Link => 125,
15
- Element::Cookie => 75,
15
+ Element::Cookie => 150,
16
16
  Element::Header => 75,
17
17
  Element::LinkTemplate => 75,
18
18
  Element::JSON => 75,
@@ -5,7 +5,7 @@ describe name_from_filename do
5
5
 
6
6
  def self.elements
7
7
  [ Element::Form::DOM, Element::Link::DOM, Element::Cookie::DOM,
8
- Element::LinkTemplate::DOM]
8
+ Element::LinkTemplate::DOM, Element::UIInput::DOM, Element::UIForm::DOM ]
9
9
  end
10
10
 
11
11
  def issue_count_per_element
@@ -13,49 +13,79 @@ describe name_from_filename do
13
13
  Element::Form::DOM => 2,
14
14
  Element::Link::DOM => 2,
15
15
  Element::Cookie::DOM => 2,
16
- Element::LinkTemplate::DOM => 2
16
+ Element::LinkTemplate::DOM => 2,
17
+ Element::UIInput::DOM => 2,
18
+ Element::UIForm::DOM => 2
17
19
  }
18
20
  end
19
21
 
20
22
  easy_test do
21
23
  issues.each do |issue|
22
- issue.page.dom.execution_flow_sinks.should be_any
24
+ expect(issue.page.dom.execution_flow_sinks).to be_any
23
25
  data_flow_sinks = issue.page.dom.data_flow_sinks
24
26
 
25
- if [Element::Link::DOM, Element::LinkTemplate::DOM].include? issue.vector.class
26
- data_flow_sinks.size.should == 2
27
+ if [
28
+ Element::Cookie::DOM,
29
+ Element::Link::DOM,
30
+ Element::LinkTemplate::DOM
31
+ ].include?( issue.vector.class )
32
+
33
+ expect(data_flow_sinks.size).to eq 2
34
+
35
+ elsif issue.vector.class == Element::UIInput::DOM
36
+
37
+ expect(data_flow_sinks.size).to eq 3
38
+
27
39
  else
28
- data_flow_sinks.size.should == 1
40
+ expect(data_flow_sinks.size).to eq 1
29
41
  end
30
42
 
31
43
  data = data_flow_sinks.last
32
- data.function.source.should start_with 'function pre_eval('
33
- data.function.name.should == 'pre_eval'
34
- data.object.should == 'DOMWindow'
35
- data.taint.should include 'taint_tracer.log_execution_flow_sink()'
36
- data.tainted_value.should include 'taint_tracer.log_execution_flow_sink()'
37
- data.function.arguments.should == [data.tainted_value]
44
+ expect(data.function.source).to start_with 'function pre_eval('
45
+ expect(data.function.name).to eq 'pre_eval'
46
+ expect(data.object).to eq 'DOMWindow'
47
+ expect(data.taint).to include 'taint_tracer.log_execution_flow_sink()'
48
+ expect(data.tainted_value).to include 'taint_tracer.log_execution_flow_sink()'
49
+ expect(data.function.arguments).to eq [data.tainted_value]
38
50
 
39
51
  trace = data_flow_sinks.first.trace
40
52
 
41
53
  case issue.vector
42
54
 
43
55
  when Element::Form::DOM
44
- trace.size.should == 2
45
- trace.first.function.source.should start_with 'function handleSubmit()'
46
- trace.first.function.name.should start_with 'handleSubmit'
56
+ expect(trace.size).to eq 2
57
+ expect(trace.first.function.source).to start_with 'function handleSubmit()'
58
+ expect(trace.first.function.name).to start_with 'handleSubmit'
47
59
 
48
60
  when Element::LinkTemplate::DOM
49
- trace.size.should == 2
50
- trace.first.url.should == issue.page.dom.url
61
+ expect(trace.size).to eq 2
62
+ expect(trace.first.url).to eq issue.page.dom.url
51
63
 
52
64
  when Element::Link::DOM
53
- trace.size.should == 2
54
- trace.first.url.should == issue.page.dom.url
65
+ expect(trace.size).to eq 2
66
+ expect(trace.first.url).to eq issue.page.dom.url
55
67
 
56
68
  when Element::Cookie::DOM
57
- trace.size.should == 1
58
- trace.first.url.should == issue.page.dom.url
69
+ expect(trace.size).to eq 2
70
+ expect(trace.first.url).to eq issue.page.dom.url
71
+
72
+ when Element::UIInput::DOM
73
+ transition = issue.page.dom.transitions.last
74
+
75
+ expect(transition.element.tag_name).to eq :input
76
+ expect(transition.event).to eq :input
77
+
78
+ when Element::UIForm::DOM
79
+ transitions = [
80
+ issue.page.dom.transitions.pop,
81
+ issue.page.dom.transitions.pop
82
+ ].reverse
83
+
84
+ expect(transitions[0].element.tag_name).to eq :input
85
+ expect(transitions[0].event).to eq :input
86
+
87
+ expect(transitions[1].element.tag_name).to eq :button
88
+ expect(transitions[1].event).to eq :click
59
89
  end
60
90
 
61
91
  end