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
@@ -13,9 +13,10 @@ describe name_from_filename do
13
13
  context 'when issues have similar response bodies' do
14
14
  it 'marks them as untrusted and adds remarks' do
15
15
  run
16
+
16
17
  framework.report.issues.each do |issue|
17
- issue.variations.map( &:untrusted? ).uniq == [true]
18
- issue.variations.first.remarks[:meta_analysis].should be_true
18
+ expect(issue).to be_untrusted
19
+ expect(issue.remarks).to include :meta_analysis
19
20
  end
20
21
  end
21
22
  end
@@ -20,11 +20,11 @@ describe name_from_filename do
20
20
  next if issue.affected_input_name != 'untrusted_input'
21
21
 
22
22
  checked += 1
23
- issue.variations.first.should be_untrusted
24
- issue.variations.first.remarks[:meta_analysis].should be_true
23
+ expect(issue).to be_untrusted
24
+ expect(issue.remarks).to include :meta_analysis
25
25
  end
26
26
 
27
- checked.should > 0
27
+ expect(checked).to be > 0
28
28
  end
29
29
  end
30
30
 
@@ -23,7 +23,7 @@ describe name_from_filename do
23
23
  it 'logs digests of issues which affect similar parameters across multiple pages' do
24
24
  run
25
25
 
26
- actual_results[0].sort.should == @uniformals[1].map(&:digest).sort
27
- actual_results[1].sort.should == @uniformals[0].map(&:digest).sort
26
+ expect(actual_results[0].sort).to eq(@uniformals[1].map(&:digest).sort)
27
+ expect(actual_results[1].sort).to eq(@uniformals[0].map(&:digest).sort)
28
28
  end
29
29
  end
@@ -11,6 +11,6 @@ describe name_from_filename do
11
11
  options.plugins[component_name] = { 'fragment' => 'stuff/blah' }
12
12
 
13
13
  run
14
- framework.sitemap.should == { "#{options.url}#stuff/blah" => 200 }
14
+ expect(framework.sitemap).to eq({ "#{options.url}#stuff/blah" => 200 })
15
15
  end
16
16
  end
@@ -8,6 +8,6 @@ describe name_from_filename do
8
8
  options.plugins[component_name] = { 'path' => fixtures_path + '/script_plugin.rb' }
9
9
 
10
10
  run
11
- actual_results.should == 'I\'m a script!'
11
+ expect(actual_results).to eq('I\'m a script!')
12
12
  end
13
13
  end
@@ -50,7 +50,7 @@ describe name_from_filename do
50
50
  },
51
51
  ]
52
52
 
53
- framework.plugins[component_name].merge( results ).should == {
53
+ expect(framework.plugins[component_name].merge( results )).to eq({
54
54
  "#{url}" => {
55
55
  "Name" => "Value",
56
56
  "Name2" => "Value2"
@@ -58,7 +58,7 @@ describe name_from_filename do
58
58
  "#{url}2" => {
59
59
  "Name22" => "Value22"
60
60
  }
61
- }
61
+ })
62
62
  end
63
63
  end
64
64
  end
@@ -38,6 +38,7 @@ __URL__:
38
38
  cookie1: val1
39
39
  action: __URL__
40
40
  method: get
41
+ source: cookie1=val1; domain=127.0.0.2; path=/; HttpOnly
41
42
  __URL__link?link_input=blah:
42
43
  - class: Arachni::Element::Cookie
43
44
  type: :cookie
@@ -46,8 +47,7 @@ __URL__link?link_input=blah:
46
47
  cookie1: val1
47
48
  action: __URL__link?link_input=blah
48
49
  method: get
49
-
50
-
50
+ source: cookie1=val1; domain=127.0.0.2; path=/; HttpOnly
51
51
  YAML
52
52
  end
53
53
 
@@ -67,96 +67,96 @@ describe name_from_filename do
67
67
  next if page.code != 200
68
68
 
69
69
  if page.response.headers.any?
70
- page.url.should == v.first['url']
71
- page.code.should == v.first['code']
72
- page.body.should == v.first['body']
70
+ expect(page.url).to eq(v.first['url'])
71
+ expect(page.code).to eq(v.first['code'])
72
+ expect(page.body).to eq(v.first['body'])
73
73
 
74
- page.response.headers.should == v.first['headers']
74
+ expect(page.response.headers).to eq(v.first['headers'])
75
75
 
76
76
  oks += 1
77
77
  end
78
78
 
79
79
  if page.cookies.any?
80
- page.cookies.size.should == 1
80
+ expect(page.cookies.size).to eq(1)
81
81
  cookie = v.select { |vector| vector['type'] == 'cookie' }.first
82
- page.cookies.first.action.should == cookie['action']
83
- page.cookies.first.inputs.should == cookie['inputs']
82
+ expect(page.cookies.first.action).to eq(cookie['action'])
83
+ expect(page.cookies.first.inputs).to eq(cookie['inputs'])
84
84
 
85
- page.url.should == cookie['action']
86
- page.code.should == 200
87
- page.body.should == ''
85
+ expect(page.url).to eq(cookie['action'])
86
+ expect(page.code).to eq(200)
87
+ expect(page.body).to eq('')
88
88
 
89
89
  oks += 1
90
90
  end
91
91
 
92
92
  if page.links.any?
93
93
  link = v.select { |vector| vector['type'] == 'link' }.first
94
- page.links.first.action.should == link['action']
95
- page.links.first.inputs.should == link['inputs']
94
+ expect(page.links.first.action).to eq(link['action'])
95
+ expect(page.links.first.inputs).to eq(link['inputs'])
96
96
 
97
- page.url.should == url
98
- page.code.should == 200
99
- page.body.should == ''
97
+ expect(page.url).to eq(url)
98
+ expect(page.code).to eq(200)
99
+ expect(page.body).to eq('')
100
100
 
101
101
  oks += 1
102
102
  end
103
103
 
104
104
  if page.forms.any?
105
105
  form = v.select { |vector| vector['type'] == 'form' }.first
106
- page.forms.first.action.should == form['action']
107
- page.forms.first.inputs.should == form['inputs']
106
+ expect(page.forms.first.action).to eq(form['action'])
107
+ expect(page.forms.first.inputs).to eq(form['inputs'])
108
108
 
109
- page.forms.first.immutables.include?( form['skip'].first ).should be_true
109
+ expect(page.forms.first.immutables.include?( form['skip'].first )).to be_truthy
110
110
 
111
- page.url.should == url
112
- page.code.should == 200
113
- page.body.should == ''
111
+ expect(page.url).to eq(url)
112
+ expect(page.code).to eq(200)
113
+ expect(page.body).to eq('')
114
114
 
115
115
  oks += 1
116
116
  end
117
117
 
118
118
  if page.headers.any?
119
119
  header = v.select { |vector| vector['type'] == 'header' }.first
120
- page.headers.first.action.should == header['action']
121
- page.headers.first.inputs.should == header['inputs']
120
+ expect(page.headers.first.action).to eq(header['action'])
121
+ expect(page.headers.first.inputs).to eq(header['inputs'])
122
122
 
123
- page.url.should == header['action']
124
- page.code.should == 200
125
- page.body.should == ''
123
+ expect(page.url).to eq(header['action'])
124
+ expect(page.code).to eq(200)
125
+ expect(page.body).to eq('')
126
126
 
127
127
  oks += 1
128
128
  end
129
129
 
130
130
  if page.jsons.any?
131
131
  json = v.select { |vector| vector['type'] == 'json' }.first
132
- page.jsons.first.action.should == json['action']
133
- page.jsons.first.source.should == json['source']
134
- page.jsons.first.inputs.should == { 'name' => 'value' }
132
+ expect(page.jsons.first.action).to eq(json['action'])
133
+ expect(page.jsons.first.source).to eq(json['source'])
134
+ expect(page.jsons.first.inputs).to eq({ 'name' => 'value' })
135
135
 
136
- page.url.should == json['action']
137
- page.code.should == 200
138
- page.body.should == ''
136
+ expect(page.url).to eq(json['action'])
137
+ expect(page.code).to eq(200)
138
+ expect(page.body).to eq('')
139
139
 
140
140
  oks += 1
141
141
  end
142
142
 
143
143
  if page.xmls.any?
144
144
  xml = v.select { |vector| vector['type'] == 'xml' }.first
145
- page.xmls.first.action.should == xml['action']
146
- page.xmls.first.source.should == xml['source']
147
- page.xmls.first.inputs.should == {
145
+ expect(page.xmls.first.action).to eq(xml['action'])
146
+ expect(page.xmls.first.source).to eq(xml['source'])
147
+ expect(page.xmls.first.inputs).to eq({
148
148
  'forgot > username > text()' => 'admin'
149
- }
149
+ })
150
150
 
151
- page.url.should == xml['action']
152
- page.code.should == 200
153
- page.body.should == ''
151
+ expect(page.url).to eq(xml['action'])
152
+ expect(page.code).to eq(200)
153
+ expect(page.body).to eq('')
154
154
 
155
155
  oks += 1
156
156
  end
157
157
  end
158
158
 
159
- oks.should == 7
159
+ expect(oks).to eq(7)
160
160
  end
161
161
 
162
162
  def run_test
@@ -14,10 +14,10 @@ describe name_from_filename do
14
14
 
15
15
  run
16
16
 
17
- actual_results.should == {
17
+ expect(actual_results).to eq({
18
18
  'status' => 'found',
19
19
  'message' => plugin::STATUSES[:found]
20
- }
20
+ })
21
21
  end
22
22
  end
23
23
 
@@ -27,10 +27,10 @@ describe name_from_filename do
27
27
 
28
28
  run
29
29
 
30
- actual_results.should == {
30
+ expect(actual_results).to eq({
31
31
  'status' => 'not_found',
32
32
  'message' => plugin::STATUSES[:not_found]
33
- }
33
+ })
34
34
  end
35
35
  end
36
36
  end
@@ -41,10 +41,10 @@ describe name_from_filename do
41
41
 
42
42
  run
43
43
 
44
- actual_results.should == {
44
+ expect(actual_results).to eq({
45
45
  'status' => 'inconclusive',
46
46
  'message' => plugin::STATUSES[:inconclusive]
47
- }
47
+ })
48
48
  end
49
49
  end
50
50
  end
@@ -5,13 +5,13 @@ describe name_from_filename do
5
5
 
6
6
  test_with_full_report do
7
7
  json = IO.read( outfile ).force_encoding( 'UTF-8' )
8
- JSON.pretty_generate( full_report.to_hash ).should == json
9
- JSON.load( json ).is_a?( Hash ).should be_true
8
+ expect(JSON.pretty_generate( full_report.to_hash )).to eq(json)
9
+ expect(JSON.load( json ).is_a?( Hash )).to be_truthy
10
10
  end
11
11
 
12
12
  test_with_empty_report do
13
13
  json = IO.read( outfile )
14
- JSON.pretty_generate( empty_report.to_hash ).should == json
15
- JSON.load( json ).is_a?( Hash ).should be_true
14
+ expect(JSON.pretty_generate( empty_report.to_hash )).to eq(json)
15
+ expect(JSON.load( json ).is_a?( Hash )).to be_truthy
16
16
  end
17
17
  end
@@ -4,10 +4,10 @@ describe name_from_filename do
4
4
  include_examples 'reporter'
5
5
 
6
6
  test_with_full_report do
7
- Marshal.dump( full_report.to_h ).should == IO.read( outfile )
7
+ expect(Marshal.dump( full_report.to_h )).to eq(IO.read( outfile ))
8
8
  end
9
9
 
10
10
  test_with_empty_report do
11
- Marshal.dump( empty_report.to_h ).should == IO.read( outfile )
11
+ expect(Marshal.dump( empty_report.to_h )).to eq(IO.read( outfile ))
12
12
  end
13
13
  end
@@ -4,11 +4,12 @@ describe name_from_filename do
4
4
  include_examples 'reporter'
5
5
 
6
6
  test_with_full_report do
7
- full_report.to_h.to_yaml.recode.should ==
7
+ expect(full_report.to_h.to_yaml.recode).to eq(
8
8
  IO.read( outfile ).force_encoding( 'UTF-8' )
9
+ )
9
10
  end
10
11
 
11
12
  test_with_empty_report do
12
- empty_report.to_h.to_yaml.should == IO.binread( outfile )
13
+ expect(empty_report.to_h.to_yaml).to eq(IO.binread( outfile ))
13
14
  end
14
15
  end
@@ -102,9 +102,7 @@ describe 'WAVSEP SQL Injection' do
102
102
  # Timing attack issues can be marked as untrusted sometimes to
103
103
  # indicate the possibility of a false positive, make sure we've only
104
104
  # got trusted issues.
105
- issue.should be_trusted
106
-
107
- issue.variations.each { |v| v.should be_trusted }
105
+ expect(issue).to be_trusted
108
106
  end
109
107
  end
110
108
  end
@@ -35,6 +35,10 @@ RSpec.configure do |config|
35
35
  config.add_formatter :documentation
36
36
  config.include PageHelpers
37
37
 
38
+ config.mock_with :rspec do |mocks|
39
+ mocks.yield_receiver_to_any_instance_implementation_blocks = true
40
+ end
41
+
38
42
  config.before( :all ) do
39
43
  killall
40
44
  reset_all
@@ -0,0 +1,14 @@
1
+ Factory.define :ui_form, class: Arachni::Element::UIForm,
2
+ options: {
3
+ url: 'http://test.com',
4
+ source: '<button id="myname" />',
5
+ method: 'click',
6
+ inputs: { 'my-input' => 'stuff' },
7
+ opening_tags: {
8
+ 'my-input' => "<input id=\"my-input\" type=\"text\" value=\"stuff\">"
9
+ }
10
+ }
11
+
12
+ Factory.define :ui_form_dom do
13
+ Factory[:ui_form].dom
14
+ end
@@ -0,0 +1,13 @@
1
+ Factory.define :ui_input, class: Arachni::Element::UIInput,
2
+ options: {
3
+ url: 'http://test.com',
4
+ source: '<input id="myname" />',
5
+ method: 'input',
6
+ inputs: {
7
+ 'myname' => ''
8
+ }
9
+ }
10
+
11
+ Factory.define :ui_input_dom do
12
+ Factory[:ui_input].dom
13
+ end
@@ -52,16 +52,3 @@ end
52
52
  Factory.define :issue_empty do
53
53
  Arachni::Issue.new( vector: Factory[:vector] )
54
54
  end
55
-
56
- Factory.define :issue_with_variations do
57
- root = Factory[:active_issue].with_variations
58
-
59
- 10.times do |i|
60
- root.variations << Factory[:active_issue].as_variation.tap do |issue|
61
- issue.vector.affected_input_value = i.to_s
62
- issue.vector.seed = i.to_s
63
- end
64
- end
65
-
66
- root
67
- end
@@ -6,7 +6,7 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
- class Arachni::Checks::Taint < Arachni::Check::Base
9
+ class Arachni::Checks::Signature < Arachni::Check::Base
10
10
 
11
11
  def run
12
12
  audit '--seed', submit: { train: true }
@@ -14,7 +14,7 @@ class Arachni::Checks::Taint < Arachni::Check::Base
14
14
 
15
15
  def self.info
16
16
  {
17
- name: 'Taint check',
17
+ name: 'Signature check',
18
18
  description: %q{Test description},
19
19
  author: 'Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>',
20
20
  version: '0.1',
@@ -1,32 +1,32 @@
1
1
  def browser_cluster_job_taint_tracer_execution_flow_check_pages( pages )
2
2
  page = pages.find { |page| page.dom.execution_flow_sinks.any? }
3
- page.dom.data_flow_sinks.should be_empty
3
+ expect(page.dom.data_flow_sinks).to be_empty
4
4
 
5
5
  sink = page.dom.execution_flow_sinks
6
- sink.size.should == 1
6
+ expect(sink.size).to eq(1)
7
7
 
8
8
  trace = sink.first.trace
9
- trace.size.should == 2
10
- trace[0].function.source.should include 'log_execution_flow_sink()'
11
- trace[1].function.source.should start_with 'function onsubmit'
9
+ expect(trace.size).to eq(2)
10
+ expect(trace[0].function.source).to include 'log_execution_flow_sink()'
11
+ expect(trace[1].function.source).to start_with 'function onsubmit'
12
12
  end
13
13
 
14
14
  def browser_cluster_job_taint_tracer_data_flow_check_pages( pages )
15
15
  page = pages.find { |page| page.dom.data_flow_sinks.any? }
16
- page.dom.execution_flow_sinks.should be_empty
16
+ expect(page.dom.execution_flow_sinks).to be_empty
17
17
 
18
18
  sink = page.dom.data_flow_sinks
19
- sink.size.should == 1
19
+ expect(sink.size).to eq(1)
20
20
 
21
- sink.first.function.name.should == 'process'
21
+ expect(sink.first.function.name).to eq('process')
22
22
  end
23
23
 
24
24
  def browser_cluster_job_taint_tracer_data_flow_with_injector_check_pages( pages )
25
25
  page = pages.find { |page| page.dom.data_flow_sinks.any? }
26
- page.dom.execution_flow_sinks.should be_empty
26
+ expect(page.dom.execution_flow_sinks).to be_empty
27
27
 
28
28
  sink = page.dom.data_flow_sinks
29
- sink.size.should == 1
29
+ expect(sink.size).to eq(1)
30
30
 
31
- sink.first.function.name.should == 'onClick'
31
+ expect(sink.first.function.name).to eq('onClick')
32
32
  end