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
@@ -3,7 +3,7 @@
3
3
  %>
4
4
 
5
5
  <%= erb 'issue/remarks.erb', issue: issue %>
6
- <%= erb 'issue/platform.erb', issue: parent_issue %>
6
+ <%= erb 'issue/platform.erb', issue: issue %>
7
7
 
8
8
  <% if (issue.vector.respond_to?(:seed) && issue.vector.seed) || issue.signature || issue.proof %>
9
9
  <table class="table table-condensed table-fixed">
@@ -38,7 +38,7 @@
38
38
  </th>
39
39
  <% end %>
40
40
 
41
- <% if group.first.variations.first.request %>
41
+ <% if group.first.request %>
42
42
  <th>
43
43
  HTTP method
44
44
  </th>
@@ -69,9 +69,9 @@
69
69
  </td>
70
70
  <% end %>
71
71
 
72
- <% if issue.variations.first.request %>
72
+ <% if issue.request %>
73
73
  <td>
74
- <code><%= issue.variations.first.request.method.to_s.upcase %></code>
74
+ <code><%= issue.request.method.to_s.upcase %></code>
75
75
  </td>
76
76
  <% end %>
77
77
 
@@ -10,7 +10,6 @@
10
10
  # All UIs must have a default report.
11
11
  #
12
12
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
13
- # @version 0.3.1
14
13
  class Arachni::Reporters::Stdout < Arachni::Reporter::Base
15
14
 
16
15
  def run
@@ -42,12 +41,14 @@ class Arachni::Reporters::Stdout < Arachni::Reporter::Base
42
41
  print_info "User agent: #{report.options[:http][:user_agent]}"
43
42
  print_line
44
43
  print_status 'Audited elements: '
45
- print_info '* Links' if report.options[:audit][:links]
46
- print_info '* Forms' if report.options[:audit][:forms]
47
- print_info '* Cookies' if report.options[:audit][:cookies]
48
- print_info '* Headers' if report.options[:audit][:headers]
49
- print_info '* XMLs' if report.options[:audit][:xmls]
50
- print_info '* JSONs' if report.options[:audit][:jsons]
44
+ print_info '* Links' if report.options[:audit][:links]
45
+ print_info '* Forms' if report.options[:audit][:forms]
46
+ print_info '* Cookies' if report.options[:audit][:cookies]
47
+ print_info '* Headers' if report.options[:audit][:headers]
48
+ print_info '* XMLs' if report.options[:audit][:xmls]
49
+ print_info '* JSONs' if report.options[:audit][:jsons]
50
+ print_info '* UI inputs' if report.options[:audit][:ui_inputs]
51
+ print_info '* UI forms' if report.options[:audit][:ui_forms]
51
52
  print_line
52
53
  print_status "Checks: #{report.options[:checks].join( ', ' )}"
53
54
 
@@ -97,33 +98,20 @@ class Arachni::Reporters::Stdout < Arachni::Reporter::Base
97
98
  print_line
98
99
 
99
100
  report.issues.each_with_index do |issue, i|
100
- print_ok "[#{i+1}] #{issue.name}"
101
+ trusted = issue.trusted? ? 'Trusted' : 'Untrusted'
102
+
103
+ print_ok "[#{i+1}] #{issue.name} (#{trusted})"
101
104
  print_info '~~~~~~~~~~~~~~~~~~~~'
102
105
 
103
106
  print_info "Digest: #{issue.digest}"
104
107
  print_info "Severity: #{issue.severity.to_s.capitalize}"
105
- print_line
106
- print_info "URL: #{issue.vector.action}"
107
- print_info "Element: #{issue.vector.type}"
108
-
109
- if issue.active?
110
- print_info "Method: #{issue.vector.method.to_s.upcase}"
111
- print_info "Input name: #{issue.affected_input_name}"
112
- end
113
-
114
- if issue.vector.respond_to? :inputs
115
- print_info "All inputs: #{issue.vector.inputs.keys.join(', ')}"
116
- end
117
-
118
- print_line
119
- print_info "Tags: #{issue.tags.join(', ')}" if issue.tags.is_a?( Array )
120
- print_line
121
108
  print_info 'Description: '
122
109
  print_info issue.description
110
+ print_info "Tags: #{issue.tags.join(', ')}" if issue.tags.is_a?( Array )
123
111
 
124
112
  if issue.cwe_url
125
113
  print_line
126
- print_info issue.cwe_url
114
+ print_info "CWE: #{issue.cwe_url}"
127
115
  end
128
116
 
129
117
  if issue.references
@@ -131,7 +119,20 @@ class Arachni::Reporters::Stdout < Arachni::Reporter::Base
131
119
  issue.references.each{ |ref| print_info " #{ref[0]} - #{ref[1]}" }
132
120
  end
133
121
 
134
- print_info_variations issue
122
+ print_line
123
+ print_info "URL: #{issue.vector.action}"
124
+ print_info "Element: #{issue.vector.type}"
125
+
126
+ if issue.vector.respond_to? :inputs
127
+ print_info "All inputs: #{issue.vector.inputs.keys.join(', ')}"
128
+ end
129
+
130
+ if issue.active?
131
+ print_info "Method: #{issue.vector.method.to_s.upcase}"
132
+ print_info "Input name: #{issue.affected_input_name}"
133
+ end
134
+
135
+ print_info_issue_details issue
135
136
  print_line
136
137
  end
137
138
 
@@ -154,61 +155,51 @@ class Arachni::Reporters::Stdout < Arachni::Reporter::Base
154
155
  end
155
156
  end
156
157
 
157
- def print_info_variations( issue )
158
+ def print_info_issue_details( issue )
158
159
  print_line
159
- print_status 'Variations'
160
- print_info '----------'
161
-
162
- issue.variations.each_with_index do |var, i|
163
- print_line
164
- trusted = var.trusted? ? 'Trusted' : 'Untrusted'
165
-
166
- print_info "Variation #{i+1} (#{trusted}):"
167
-
168
- if var.active?
169
- if var.vector.respond_to? :seed
170
- print_info "Seed: #{var.vector.seed.inspect}"
171
- end
172
-
173
- print_info "Injected: #{var.vector.affected_input_value.inspect}"
160
+ if issue.active?
161
+ if issue.vector.respond_to? :seed
162
+ print_info "Seed: #{issue.vector.seed.inspect}"
174
163
  end
175
164
 
176
- print_info "Signature: #{var.signature}" if var.signature
177
- print_info "Proof: #{var.proof.inspect}" if var.proof
165
+ print_info "Injected: #{issue.vector.affected_input_value.inspect}"
166
+ end
178
167
 
179
- print_line
180
- print_info "Referring page: #{var.referring_page.dom.url}"
181
- if var.referring_page.dom.transitions.any?
182
- print_info 'DOM transitions:'
183
- var.referring_page.dom.print_transitions( method(:print_info), ' ' )
184
- end
168
+ print_info "Signature: #{issue.signature}" if issue.signature
169
+ print_info "Proof: #{issue.proof.inspect}" if issue.proof
185
170
 
186
- print_line
187
- print_info "Affected page: #{var.page.dom.url}"
171
+ print_line
172
+ print_info "Referring page: #{issue.referring_page.dom.url}"
173
+ if issue.referring_page.dom.transitions.any?
174
+ print_info 'DOM transitions:'
175
+ issue.referring_page.dom.print_transitions( method(:print_info), ' ' )
176
+ end
188
177
 
189
- if !var.request.to_s.empty?
190
- print_info "HTTP request\n#{var.request}"
191
- end
178
+ print_line
179
+ print_info "Affected page: #{issue.page.dom.url}"
192
180
 
193
- if var.page.dom.transitions.any?
194
- print_info 'DOM transitions:'
195
- var.page.dom.print_transitions( method(:print_info), ' ' )
196
- end
181
+ if !issue.request.to_s.empty?
182
+ print_info "HTTP request\n#{issue.request}"
183
+ end
197
184
 
198
- next if var.remarks.empty?
185
+ if issue.page.dom.transitions.any?
186
+ print_info 'DOM transitions:'
187
+ issue.page.dom.print_transitions( method(:print_info), ' ' )
188
+ end
199
189
 
200
- print_line
201
- print_info 'Remarks'
202
- print_info '-------'
203
- var.remarks.each do |logger, remarks|
204
- print_info " By #{logger}:"
205
- remarks.each do |remark|
206
- print_info " * #{word_wrap remark}"
207
- end
208
- end
190
+ return if issue.remarks.empty?
209
191
 
210
- print_line
192
+ print_line
193
+ print_info 'Remarks'
194
+ print_info '-------'
195
+ issue.remarks.each do |logger, remarks|
196
+ print_info " By #{logger}:"
197
+ remarks.each do |remark|
198
+ print_info " * #{word_wrap remark}"
199
+ end
211
200
  end
201
+
202
+ print_line
212
203
  end
213
204
 
214
205
  # Stolen from Rails.
@@ -225,7 +216,7 @@ class Arachni::Reporters::Stdout < Arachni::Reporter::Base
225
216
  name: 'Stdout',
226
217
  description: %q{Prints the results to standard output.},
227
218
  author: 'Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>',
228
- version: '0.3.1'
219
+ version: '0.3.2'
229
220
  }
230
221
  end
231
222
 
@@ -73,60 +73,46 @@ class Arachni::Reporters::XML < Arachni::Reporter::Base
73
73
  xml.source vector.source
74
74
  end
75
75
 
76
+ if vector.respond_to? :seed
77
+ xml.seed vector.seed
78
+ end
79
+
76
80
  if issue.active?
77
81
  xml.method_ vector.method
78
82
  end
79
83
 
80
- if issue.variations.first.vector.respond_to? :affected_input_name
81
- xml.affected_input_name issue.variations.first.vector.affected_input_name
84
+ if vector.respond_to? :affected_input_name
85
+ xml.affected_input_name vector.affected_input_name
82
86
  end
83
87
 
84
88
  if vector.respond_to? :inputs
85
89
  add_inputs( xml, vector.inputs )
86
90
  end
87
- }
88
-
89
- xml.variations {
90
- issue.variations.each do |variation|
91
- xml.variation {
92
- vector = variation.vector
93
91
 
94
- xml.vector {
95
- if issue.active?
96
- xml.method_ vector.method
97
- end
98
-
99
- if vector.respond_to? :seed
100
- xml.seed vector.seed
101
- end
102
-
103
- if vector.respond_to? :inputs
104
- add_inputs( xml, vector.inputs )
105
- end
106
- }
92
+ if vector.respond_to? :default_inputs
93
+ add_inputs( xml, vector.default_inputs, :default_inputs )
94
+ end
95
+ }
107
96
 
108
- xml.remarks {
109
- variation.remarks.each do |commenter, remarks|
110
- remarks.each do |remark|
111
- xml.remark {
112
- xml.commenter commenter
113
- xml.text_ remark
114
- }
115
- end
116
- end
97
+ xml.remarks {
98
+ issue.remarks.each do |commenter, remarks|
99
+ remarks.each do |remark|
100
+ xml.remark {
101
+ xml.commenter commenter
102
+ xml.text_ remark
117
103
  }
118
-
119
- add_page( xml, variation.page )
120
- add_page( xml, variation.referring_page, :referring_page )
121
-
122
- xml.signature variation.signature
123
- xml.proof variation.proof
124
- xml.trusted variation.trusted
125
- xml.platform_type variation.platform_type
126
- xml.platform_name variation.platform_name
127
- }
104
+ end
128
105
  end
129
106
  }
107
+
108
+ add_page( xml, issue.page )
109
+ add_page( xml, issue.referring_page, :referring_page )
110
+
111
+ xml.signature issue.signature
112
+ xml.proof issue.proof
113
+ xml.trusted issue.trusted
114
+ xml.platform_type issue.platform_type
115
+ xml.platform_name issue.platform_name
130
116
  }
131
117
  end
132
118
  }
@@ -387,10 +387,6 @@
387
387
  </xs:sequence>
388
388
  </xs:complexType>
389
389
 
390
- <!--
391
- Holds generic information about the logged issue, while providing
392
- details as "issuevariations" via the "variations" attribute.
393
- -->
394
390
  <xs:complexType name="issue">
395
391
  <xs:all>
396
392
  <xs:element name="name" type="xs:string"/>
@@ -403,8 +399,45 @@
403
399
  <xs:element name="cwe" type="xs:integer" minOccurs="0"/>
404
400
  <xs:element name="vector" type="vector"/>
405
401
  <xs:element name="digest" type="xs:integer"/>
406
- <xs:element name="variations" type="issuevariations"/>
407
402
  <xs:element name="check" type="check"/>
403
+
404
+ <!--
405
+ Page which displays the logged issue.
406
+ -->
407
+ <xs:element name="page" type="page"/>
408
+ <xs:element name="referring_page" type="page"/>
409
+
410
+ <!--
411
+ Signature used to identify the issue. Its match will be the
412
+ "proof".
413
+ -->
414
+ <xs:element name="signature" type="xs:string" minOccurs="0"/>
415
+
416
+ <!--
417
+ String proving the existence of the issue.
418
+ -->
419
+ <xs:element name="proof" type="xs:string"/>
420
+
421
+ <!--
422
+ Some issues may be logged even though the system doesn't
423
+ have 100% confidence in them, in that case they will be
424
+ marked as not trusted.
425
+ -->
426
+ <xs:element name="trusted" type="xs:boolean"/>
427
+
428
+ <xs:element name="remarks" type="remarks"/>
429
+
430
+ <!--
431
+ Type of the platform affected by this issue.
432
+ "db", "os", etc.
433
+ -->
434
+ <xs:element name="platform_type" type="xs:string"/>
435
+
436
+ <!--
437
+ Name of the platform affected by this issue.
438
+ "mysql", "linux", etc.
439
+ -->
440
+ <xs:element name="platform_name" type="xs:string"/>
408
441
  </xs:all>
409
442
  </xs:complexType>
410
443
 
@@ -421,18 +454,6 @@
421
454
  </xs:all>
422
455
  </xs:complexType>
423
456
 
424
- <!--
425
- Issues have 1 or more variations.
426
- Currently, active checks only have 1 variation while passive ones
427
- can have multiple.
428
- -->
429
- <xs:complexType name="issuevariations">
430
- <xs:sequence>
431
- <xs:element name="variation" type="issuevariation"
432
- minOccurs="1" maxOccurs="unbounded"/>
433
- </xs:sequence>
434
- </xs:complexType>
435
-
436
457
  <!--
437
458
  Input vector information, in essence, the element affected
438
459
  by the logged issue.
@@ -481,56 +502,11 @@
481
502
  <xs:element name="affected_input_name" type="xs:string"
482
503
  minOccurs="0"/>
483
504
 
505
+ <xs:element name="default_inputs" type="inputs" minOccurs="0"/>
484
506
  <xs:element name="inputs" type="inputs" minOccurs="0"/>
485
- </xs:all>
486
- </xs:complexType>
487
-
488
- <!--
489
- Details about the logged issue, each variation represents a
490
- situation where the same issue has been identified albeit in
491
- different ways.
492
- -->
493
- <xs:complexType name="issuevariation">
494
- <xs:all>
495
- <xs:element name="vector" type="variationvector"/>
496
-
497
- <!--
498
- Page which displays the logged issue.
499
- -->
500
- <xs:element name="page" type="page"/>
501
- <xs:element name="referring_page" type="page"/>
502
-
503
- <!--
504
- Signature used to identify the issue. Its match will be the
505
- "proof".
506
- -->
507
- <xs:element name="signature" type="xs:string" minOccurs="0"/>
508
507
 
509
- <!--
510
- String proving the existence of the issue.
511
- -->
512
- <xs:element name="proof" type="xs:string"/>
513
-
514
- <!--
515
- Some issues may be logged even though the system doesn't
516
- have 100% confidence in them, in that case they will be
517
- marked as not trusted.
518
- -->
519
- <xs:element name="trusted" type="xs:boolean"/>
520
-
521
- <xs:element name="remarks" type="remarks"/>
522
-
523
- <!--
524
- Type of the platform affected by this issue.
525
- "db", "os", etc.
526
- -->
527
- <xs:element name="platform_type" type="xs:string"/>
528
-
529
- <!--
530
- Name of the platform affected by this issue.
531
- "mysql", "linux", etc.
532
- -->
533
- <xs:element name="platform_name" type="xs:string"/>
508
+ <xs:element name="seed" type="xs:string" minOccurs="0"
509
+ maxOccurs="1"/>
534
510
  </xs:all>
535
511
  </xs:complexType>
536
512
 
@@ -576,30 +552,6 @@
576
552
  </xs:all>
577
553
  </xs:complexType>
578
554
 
579
- <!--
580
- This is details on the state of the logged vector when
581
- an "issuevariation" was identified.
582
-
583
- Merged with "vector" it forms the full vector mutation.
584
- -->
585
- <xs:complexType name="variationvector">
586
- <xs:sequence>
587
- <!--
588
- HTTP method used to submit the vector. Can be different
589
- from the "vector" one because the fuzzed version could
590
- have been submitted with a different method.
591
- -->
592
- <xs:element name="method" type="xs:string" minOccurs="0"
593
- maxOccurs="1"/>
594
-
595
- <xs:element name="seed" type="xs:string" minOccurs="0"
596
- maxOccurs="1"/>
597
-
598
- <xs:element name="inputs" type="inputs" minOccurs="0"
599
- maxOccurs="1"/>
600
- </xs:sequence>
601
- </xs:complexType>
602
-
603
555
  <xs:complexType name="page">
604
556
  <xs:all>
605
557
  <xs:element name="body" type="xs:string"/>
@@ -801,6 +753,8 @@
801
753
  <xs:enumeration value="Arachni::Element::GenericDOM" />
802
754
  <xs:enumeration value="Arachni::Element::JSON" />
803
755
  <xs:enumeration value="Arachni::Element::XML" />
756
+ <xs:enumeration value="Arachni::Element::UIForm::DOM" />
757
+ <xs:enumeration value="Arachni::Element::UIInput::DOM" />
804
758
  </xs:restriction>
805
759
  </xs:simpleType>
806
760