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
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Element::UIInput::DOM do
4
+ inputs = { 'my-input' => '1' }
5
+
6
+ it_should_behave_like 'element_dom'
7
+
8
+ it_should_behave_like 'with_node'
9
+
10
+ it_should_behave_like 'submittable_dom'
11
+ it_should_behave_like 'inputtable_dom', single_input: true, inputs: inputs
12
+ it_should_behave_like 'mutable_dom', single_input: true, inputs: inputs
13
+ it_should_behave_like 'auditable_dom'
14
+
15
+ def run
16
+ auditor.browser_cluster.wait
17
+ end
18
+
19
+ def auditable_extract_parameters( page )
20
+ { 'my-input' => page.document.css('#container').text.strip }
21
+ end
22
+
23
+ def element
24
+ e = Arachni::Element::UIInput.new(
25
+ method: 'input',
26
+ action: @page.url,
27
+ source: '<input oninput="handleOnInput();" id="my-input" name="my-input" value="1" />'
28
+ ).dom
29
+ e.page = @page
30
+ e.auditor = @auditor
31
+ e
32
+ end
33
+
34
+ before :each do
35
+ @framework = Arachni::Framework.new
36
+ @page = Arachni::Page.from_url( url )
37
+ @auditor = Auditor.new( @page, @framework )
38
+ end
39
+
40
+ after :each do
41
+ @framework.clean_up
42
+ @framework.reset
43
+ end
44
+
45
+ subject { element }
46
+ let(:parent) { subject.parent }
47
+ let(:url) { web_server_url_for( :input_dom ) }
48
+ let(:auditor) { @auditor }
49
+ let(:inputtable) { element }
50
+
51
+ describe '#type' do
52
+ it 'returns :ui_input_dom' do
53
+ expect(subject.type).to eq(:ui_input_dom)
54
+ end
55
+ end
56
+
57
+ describe '.type' do
58
+ it 'returns :ui_input_dom' do
59
+ expect(described_class.type).to eq(:ui_input_dom)
60
+ end
61
+ end
62
+
63
+ describe '#parent' do
64
+ it 'returns the parent element' do
65
+ expect(subject.parent).to be_kind_of Arachni::Element::UIInput
66
+ end
67
+ end
68
+
69
+ describe '#inputs' do
70
+ it 'uses the node attribute data' do
71
+ expect(subject.inputs).to eq(inputs)
72
+ end
73
+ end
74
+
75
+ describe '#locate' do
76
+ it 'locates the live element' do
77
+ called = false
78
+ subject.with_browser do |browser|
79
+ subject.browser = browser
80
+ browser.load subject.page
81
+
82
+ element = subject.locate
83
+ expect(element).to be_kind_of Watir::HTMLElement
84
+
85
+ expect(Arachni::Browser::ElementLocator.
86
+ from_html( element.opening_tag ).attributes
87
+ ).to eq(subject.locator.attributes)
88
+
89
+ called = true
90
+ end
91
+
92
+ subject.auditor.browser_cluster.wait
93
+ expect(called).to be_truthy
94
+ end
95
+ end
96
+
97
+ describe '#trigger' do
98
+ let(:new_inputs) { { subject.inputs.keys.first => 'The.Dude' } }
99
+
100
+ it 'triggers the event required to submit the element' do
101
+ subject.update new_inputs
102
+
103
+ called = false
104
+ subject.with_browser do |browser|
105
+ subject.browser = browser
106
+ browser.load subject.page
107
+
108
+ subject.trigger
109
+
110
+ page = browser.to_page
111
+
112
+ expect(subject.inputs).to eq(auditable_extract_parameters( page ))
113
+ called = true
114
+ end
115
+
116
+ subject.auditor.browser_cluster.wait
117
+ expect(called).to be_truthy
118
+ end
119
+
120
+ it 'returns a playable transition' do
121
+ subject.update new_inputs
122
+
123
+ transitions = []
124
+ called = false
125
+ subject.with_browser do |browser|
126
+ subject.browser = browser
127
+ browser.load subject.page
128
+
129
+ transitions = subject.trigger
130
+
131
+ page = browser.to_page
132
+
133
+ expect(subject.inputs).to eq(auditable_extract_parameters( page ))
134
+ called = true
135
+ end
136
+
137
+ subject.auditor.browser_cluster.wait
138
+ expect(called).to be_truthy
139
+
140
+ called = false
141
+ auditor.with_browser do |browser|
142
+ browser.load subject.page
143
+ expect(auditable_extract_parameters( browser.to_page ).values.first).to eq ''
144
+
145
+ transitions.each do |transition|
146
+ transition.play browser
147
+ end
148
+
149
+ expect(auditable_extract_parameters( browser.to_page )).to eq(new_inputs)
150
+ called = true
151
+ end
152
+ auditor.browser_cluster.wait
153
+ expect(called).to be_truthy
154
+ end
155
+ end
156
+
157
+ end
@@ -0,0 +1,136 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Element::UIInput do
4
+ html = '<input type=password name="my_first_input" value="my_first_value"" />'
5
+
6
+ it_should_behave_like 'dom_only', html
7
+
8
+ def new_element( html )
9
+ described_class.new(
10
+ action: url,
11
+ source: html,
12
+ method: 'onmouseover'
13
+ )
14
+ end
15
+
16
+ subject { new_element( html ) }
17
+ let(:inputtable) { new_element( html ) }
18
+ let(:url) { "#{web_server_url_for( :input_dom )}/" }
19
+
20
+ let(:browser) { @browser }
21
+ let(:page) { Arachni::Page.from_url( url ) }
22
+
23
+ describe '#type' do
24
+ it 'returns :ui_input' do
25
+ expect(subject.type).to eq(:ui_input)
26
+ end
27
+ end
28
+
29
+ describe '.type' do
30
+ it 'returns :ui_input' do
31
+ expect(described_class.type).to eq(:ui_input)
32
+ end
33
+ end
34
+
35
+ describe '.from_browser' do
36
+ before :each do
37
+ @browser = Arachni::Browser.new
38
+ @browser.load page
39
+ end
40
+
41
+ after :each do
42
+ @browser.shutdown
43
+ end
44
+
45
+ context 'when there no inputs' do
46
+ let(:url) { "#{super()}/without-inputs" }
47
+
48
+ it 'returns empty array' do
49
+ expect(described_class.from_browser( @browser, page )).to be_empty
50
+ end
51
+ end
52
+
53
+ context 'with inputs as' do
54
+ context '<input type="text">' do
55
+ let(:url) { "#{super()}/input/type/text" }
56
+
57
+ context 'with events' do
58
+ let(:url) { "#{super()}/with_events" }
59
+ let(:source) { '<input type="text" id="my-input" value="stuff">' }
60
+
61
+ it 'returns array of elements' do
62
+ input = described_class.from_browser( @browser, page ).first
63
+
64
+ expect(input.source).to eq source
65
+ expect(input.url).to eq page.url
66
+ expect(input.action).to eq page.url
67
+ expect(input.method).to eq :input
68
+ expect(input.inputs).to eq( 'my-input' => 'stuff' )
69
+ end
70
+ end
71
+
72
+ context 'without events' do
73
+ let(:url) { "#{super()}/without_events" }
74
+
75
+ it 'returns empty array' do
76
+ expect(described_class.from_browser( @browser, page )).to be_empty
77
+ end
78
+ end
79
+ end
80
+
81
+ context '<input>' do
82
+ let(:url) { "#{super()}/input/type/none" }
83
+
84
+ context 'with events' do
85
+ let(:url) { "#{super()}/with_events" }
86
+ let(:source) { '<input id="my-input" value="stuff">' }
87
+
88
+ it 'returns array of elements' do
89
+ input = described_class.from_browser( @browser, page ).first
90
+
91
+ expect(input.source).to eq source
92
+ expect(input.url).to eq page.url
93
+ expect(input.action).to eq page.url
94
+ expect(input.method).to eq :input
95
+ expect(input.inputs).to eq( 'my-input' => 'stuff' )
96
+ end
97
+ end
98
+
99
+ context 'without events' do
100
+ let(:url) { "#{super()}/without_events" }
101
+
102
+ it 'returns empty array' do
103
+ expect(described_class.from_browser( @browser, page )).to be_empty
104
+ end
105
+ end
106
+ end
107
+
108
+ context '<textarea>' do
109
+ let(:url) { "#{super()}/textarea" }
110
+
111
+ context 'with events' do
112
+ let(:url) { "#{super()}/with_events" }
113
+ let(:source) { '<textarea id="my-input" type="text">' }
114
+
115
+ it 'returns array of elements' do
116
+ input = described_class.from_browser( @browser, page ).first
117
+
118
+ expect(input.source).to eq source
119
+ expect(input.url).to eq page.url
120
+ expect(input.action).to eq page.url
121
+ expect(input.method).to eq :input
122
+ expect(input.inputs).to eq( 'my-input' => '' )
123
+ end
124
+ end
125
+
126
+ context 'without events' do
127
+ let(:url) { "#{super()}/without_events" }
128
+
129
+ it 'returns empty array' do
130
+ expect(described_class.from_browser( @browser, page )).to be_empty
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -4,9 +4,27 @@ describe Arachni::Element::XML do
4
4
  inputtable_source = '<input1>value1</input1><input2>value2</input2>'
5
5
 
6
6
  it_should_behave_like 'element'
7
- it_should_behave_like 'with_source', inputtable_source
8
- it_should_behave_like 'auditable',
7
+
8
+ it_should_behave_like 'with_source'
9
+ it_should_behave_like 'with_auditor'
10
+
11
+ it_should_behave_like 'submittable'
12
+ it_should_behave_like 'inputtable'
13
+ it_should_behave_like 'mutable',
9
14
  inputs: described_class.parse_inputs( inputtable_source )
15
+ it_should_behave_like 'auditable'
16
+
17
+ before :each do
18
+ @framework ||= Arachni::Framework.new
19
+ @auditor = Auditor.new( Arachni::Page.from_url( url ), @framework )
20
+ end
21
+
22
+ after :each do
23
+ @framework.reset
24
+ reset_options
25
+ end
26
+
27
+ let(:auditor) { @auditor }
10
28
 
11
29
  def auditable_extract_parameters( resource )
12
30
  described_class.parse_inputs( resource.body )
@@ -75,20 +93,20 @@ EOXML
75
93
  let(:utilities) { Arachni::Utilities }
76
94
 
77
95
  it 'is assigned to Arachni::Link for easy access' do
78
- Arachni::XML.should == described_class
96
+ expect(Arachni::XML).to eq(described_class)
79
97
  end
80
98
 
81
99
  describe '#initialize' do
82
100
  describe ':source' do
83
101
  it 'parses it into #inputs' do
84
- subject.inputs.should == described_class.parse_inputs( source )
102
+ expect(subject.inputs).to eq(described_class.parse_inputs( source ))
85
103
  end
86
104
 
87
105
  context 'when missing' do
88
106
  it 'fails' do
89
107
  expect do
90
108
  described_class.new( url: "#{url}submit" )
91
- end.to raise_error described_class::Error::MissingSource
109
+ end.to raise_error Arachni::Element::Capabilities::WithSource::Error::MissingSource
92
110
  end
93
111
  end
94
112
  end
@@ -96,7 +114,7 @@ EOXML
96
114
 
97
115
  describe '#simple' do
98
116
  it 'should return a simplified version as a hash' do
99
- subject.simple.should == { subject.action => subject.inputs }
117
+ expect(subject.simple).to eq({ subject.action => subject.inputs })
100
118
  end
101
119
  end
102
120
 
@@ -105,26 +123,26 @@ EOXML
105
123
  subject.inputs.each do |name, _|
106
124
  s = subject.dup
107
125
  s[name] = "#{name} value"
108
- Nokogiri::XML(s.to_xml).css(name).first.content.should == "#{name} value"
126
+ expect(Nokogiri::XML(s.to_xml).css(name).first.content).to eq("#{name} value")
109
127
  end
110
128
  end
111
129
  end
112
130
 
113
131
  describe '#to_s' do
114
132
  it 'returns #to_xml' do
115
- subject.to_s.should == subject.to_xml
133
+ expect(subject.to_s).to eq(subject.to_xml)
116
134
  end
117
135
  end
118
136
 
119
137
  describe '#type' do
120
138
  it 'should be "link"' do
121
- subject.type.should == :xml
139
+ expect(subject.type).to eq(:xml)
122
140
  end
123
141
  end
124
142
 
125
143
  describe '#to_rpc_data' do
126
144
  it "includes 'source'" do
127
- subject.to_rpc_data['source'].should == source
145
+ expect(subject.to_rpc_data['source']).to eq(source)
128
146
  end
129
147
  end
130
148
 
@@ -141,10 +159,10 @@ EOXML
141
159
  end
142
160
 
143
161
  it 'parses a request into an element' do
144
- subject.url.should == url
145
- subject.action.should == request.url
146
- subject.source.should == request.body
147
- subject.method.should == request.method
162
+ expect(subject.url).to eq(url)
163
+ expect(subject.action).to eq(request.url)
164
+ expect(subject.source).to eq(request.body)
165
+ expect(subject.method).to eq(request.method)
148
166
  end
149
167
  end
150
168
 
@@ -157,7 +175,7 @@ EOXML
157
175
  end
158
176
 
159
177
  it 'returns nil' do
160
- subject.should be_nil
178
+ expect(subject).to be_nil
161
179
  end
162
180
  end
163
181
 
@@ -171,7 +189,7 @@ EOXML
171
189
  end
172
190
 
173
191
  it 'returns nil' do
174
- subject.should be_nil
192
+ expect(subject).to be_nil
175
193
  end
176
194
  end
177
195
 
@@ -198,7 +216,7 @@ EOXML
198
216
 
199
217
  describe '.parse_inputs' do
200
218
  it 'parses an XML document into a hash of inputs' do
201
- described_class.parse_inputs( source ).should == {
219
+ expect(described_class.parse_inputs( source )).to eq({
202
220
  'bookstore > book:nth-of-type(1) > title > text()' => 'Everyday Italian',
203
221
  'bookstore > book:nth-of-type(1) > title > @lang' => 'en',
204
222
  'bookstore > book:nth-of-type(1) > author > text()' => 'Giada De Laurentiis',
@@ -227,40 +245,40 @@ EOXML
227
245
  'bookstore > book:nth-of-type(4) > year > text()' => '2003',
228
246
  'bookstore > book:nth-of-type(4) > price > text()' => '39.95',
229
247
  'bookstore > book:nth-of-type(4) > @category' => 'WEB'
230
- }
248
+ })
231
249
  end
232
250
  end
233
251
 
234
252
  describe '#transform_xml' do
235
253
  it 'assigns a callback to process the resulting XML' do
236
254
  subject.transform_xml do |xml|
237
- xml.should == Nokogiri::XML( subject.source ).to_xml
255
+ expect(xml).to eq(Nokogiri::XML( subject.source ).to_xml)
238
256
  'stuff'
239
257
  end
240
258
 
241
- subject.to_xml.should == 'stuff'
259
+ expect(subject.to_xml).to eq('stuff')
242
260
  end
243
261
  end
244
262
 
245
263
  describe '.encode' do
246
264
  it 'returns the string as is' do
247
- described_class.encode( 'stuff' ).should == 'stuff'
265
+ expect(described_class.encode( 'stuff' )).to eq('stuff')
248
266
  end
249
267
  end
250
268
  describe '#encode' do
251
269
  it 'returns the string as is' do
252
- subject.encode( 'stuff' ).should == 'stuff'
270
+ expect(subject.encode( 'stuff' )).to eq('stuff')
253
271
  end
254
272
  end
255
273
 
256
274
  describe '.decode' do
257
275
  it 'returns the string as is' do
258
- described_class.decode( 'stuff' ).should == 'stuff'
276
+ expect(described_class.decode( 'stuff' )).to eq('stuff')
259
277
  end
260
278
  end
261
279
  describe '#decode' do
262
280
  it 'returns the string as is' do
263
- subject.decode( 'stuff' ).should == 'stuff'
281
+ expect(subject.decode( 'stuff' )).to eq('stuff')
264
282
  end
265
283
  end
266
284