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
@@ -21,6 +21,8 @@ class Form < Base
21
21
  Dir.glob( lib ).each { |f| require f }
22
22
 
23
23
  # Generic element capabilities.
24
+ include Arachni::Element::Capabilities::WithNode
25
+ include Arachni::Element::Capabilities::Inputtable
24
26
  include Arachni::Element::Capabilities::Analyzable
25
27
  include Arachni::Element::Capabilities::Refreshable
26
28
 
@@ -403,7 +405,16 @@ class Form < Base
403
405
  #
404
406
  # @return [String]
405
407
  def decode( string )
406
- ::URI.decode_www_form_component string.to_s
408
+ string = string.to_s
409
+
410
+ # Fast, but could throw error.
411
+ begin
412
+ ::URI.decode_www_form_component string
413
+
414
+ # Slower, but reliable.
415
+ rescue ArgumentError
416
+ URI.decode( string.gsub( '+', ' ' ) )
417
+ end
407
418
  end
408
419
 
409
420
  end
@@ -92,7 +92,8 @@ module Mutable
92
92
  inputs.keys.each do |input|
93
93
  next if field_type_for( input ) != :select
94
94
 
95
- node.xpath( "select[@name=\"#{input}\"]" ).css('option').each do |option|
95
+ escape = "'#{input.split( "'" ).join( "', \"'\", '" )}', ''"
96
+ node.xpath( "select[@name=concat(#{escape})]" ).css('option').each do |option|
96
97
  try_input do
97
98
  elem = self.dup
98
99
  elem.mutation_with_original_values
@@ -15,7 +15,6 @@ module Capabilities
15
15
  #
16
16
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
17
  module WithDOM
18
- include Arachni::Element::Capabilities::WithNode
19
18
  include Arachni::Element::Capabilities::WithDOM
20
19
 
21
20
  # @return [DOM]
@@ -6,6 +6,8 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
+ require_relative '../dom'
10
+
9
11
  module Arachni::Element
10
12
  class Form
11
13
 
@@ -13,9 +15,13 @@ class Form
13
15
  # functionality.
14
16
  #
15
17
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
- class DOM < Base
18
+ class DOM < DOM
17
19
  include Arachni::Element::Capabilities::WithNode
18
- include Arachni::Element::Capabilities::Auditable::DOM
20
+
21
+ include Arachni::Element::DOM::Capabilities::Mutable
22
+ include Arachni::Element::DOM::Capabilities::Inputtable
23
+ include Arachni::Element::DOM::Capabilities::Submittable
24
+ include Arachni::Element::DOM::Capabilities::Auditable
19
25
 
20
26
  def initialize( options )
21
27
  super
@@ -29,7 +35,7 @@ class DOM < Base
29
35
 
30
36
  # Submits the form using the configured {#inputs}.
31
37
  def trigger
32
- browser.fire_event element, :submit, inputs: inputs.dup
38
+ [ browser.fire_event( element, :submit, inputs: inputs.dup ) ]
33
39
  end
34
40
 
35
41
  def valid_input_name?( name )
@@ -14,9 +14,21 @@ module Arachni::Element
14
14
  #
15
15
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
16
16
  class Header < Base
17
- include Capabilities::Analyzable
18
17
 
19
- INVALID_INPUT_DATA = [ "\0" ]
18
+ # Load and include all form-specific capability overrides.
19
+ lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
20
+ Dir.glob( lib ).each { |f| require f }
21
+
22
+ # Generic element capabilities.
23
+ include Arachni::Element::Capabilities::Auditable
24
+ include Arachni::Element::Capabilities::Submittable
25
+ include Arachni::Element::Capabilities::Inputtable
26
+ include Arachni::Element::Capabilities::Analyzable
27
+
28
+ # Header-specific overrides.
29
+ include Capabilities::Mutable
30
+ include Capabilities::Inputtable
31
+
20
32
  ENCODE_CHARACTERS = ["\n", "\r"]
21
33
  ENCODE_CHARACTERS_LIST = ENCODE_CHARACTERS.join
22
34
 
@@ -32,37 +44,6 @@ class Header < Base
32
44
  @inputs.dup
33
45
  end
34
46
 
35
- # Overrides {Capabilities::Mutable#each_mutation} to handle header-specific
36
- # limitations.
37
- #
38
- # @param (see Capabilities::Mutable#each_mutation)
39
- # @return (see Capabilities::Mutable#each_mutation)
40
- # @yield (see Capabilities::Mutable#each_mutation)
41
- # @yieldparam (see Capabilities::Mutable#each_mutation)
42
- #
43
- # @see Capabilities::Mutable#each_mutation
44
- def each_mutation( payload, options = {}, &block )
45
- parameter_names = options.delete( :parameter_names )
46
- super( payload, options, &block )
47
-
48
- return if !parameter_names
49
-
50
- if !valid_input_name_data?( payload )
51
- print_debug_level_2 'Payload not supported as input name by' <<
52
- " #{audit_id}: #{payload.inspect}"
53
- return
54
- end
55
-
56
- elem = self.dup
57
- elem.affected_input_name = FUZZ_NAME
58
- elem.inputs = { payload => FUZZ_NAME_VALUE }
59
- yield elem
60
- end
61
-
62
- def valid_input_data?( data )
63
- !INVALID_INPUT_DATA.find { |c| data.include? c }
64
- end
65
-
66
47
  # @return [String]
67
48
  # Header name.
68
49
  def name
@@ -0,0 +1,29 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ module Arachni::Element
10
+ class Header
11
+ module Capabilities
12
+
13
+ # Extends {Arachni::Element::Capabilities::Inputtable} with {Header}-specific
14
+ # functionality.
15
+ #
16
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
+ module Inputtable
18
+ include Arachni::Element::Capabilities::Inputtable
19
+
20
+ INVALID_INPUT_DATA = [ "\0" ]
21
+
22
+ def valid_input_data?( data )
23
+ !INVALID_INPUT_DATA.find { |c| data.include? c }
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,51 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ module Arachni::Element
10
+ class Header
11
+ module Capabilities
12
+
13
+ # Extends {Arachni::Element::Capabilities::Mutable} with {Header}-specific
14
+ # functionality.
15
+ #
16
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
+ module Mutable
18
+ include Arachni::Element::Capabilities::Mutable
19
+
20
+ # Overrides {Capabilities::Mutable#each_mutation} to handle header-specific
21
+ # limitations.
22
+ #
23
+ # @param (see Capabilities::Mutable#each_mutation)
24
+ # @return (see Capabilities::Mutable#each_mutation)
25
+ # @yield (see Capabilities::Mutable#each_mutation)
26
+ # @yieldparam (see Capabilities::Mutable#each_mutation)
27
+ #
28
+ # @see Capabilities::Mutable#each_mutation
29
+ def each_mutation( payload, options = {}, &block )
30
+ parameter_names = options.delete( :parameter_names )
31
+ super( payload, options, &block )
32
+
33
+ return if !parameter_names
34
+
35
+ if !valid_input_name_data?( payload )
36
+ print_debug_level_2 'Payload not supported as input name by' <<
37
+ " #{audit_id}: #{payload.inspect}"
38
+ return
39
+ end
40
+
41
+ elem = self.dup
42
+ elem.affected_input_name = FUZZ_NAME
43
+ elem.inputs = { payload => FUZZ_NAME_VALUE }
44
+ yield elem
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,71 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ require_relative '../dom'
10
+
11
+ module Arachni::Element
12
+ class UIInput
13
+
14
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
+ class DOM < DOM
16
+ include Arachni::Element::Capabilities::WithNode
17
+
18
+ include Arachni::Element::DOM::Capabilities::Mutable
19
+ include Arachni::Element::DOM::Capabilities::Inputtable
20
+ include Arachni::Element::DOM::Capabilities::Submittable
21
+ include Arachni::Element::DOM::Capabilities::Auditable
22
+
23
+ def initialize( options )
24
+ super
25
+
26
+ self.method = options[:method] || self.parent.method
27
+
28
+ if options[:inputs]
29
+ @valid_input_name = options[:inputs].keys.first.to_s
30
+ self.inputs = options[:inputs]
31
+ else
32
+ @valid_input_name = (locator.attributes['name'] || locator.attributes['id']).to_s
33
+ self.inputs = {
34
+ @valid_input_name => locator.attributes['value']
35
+ }
36
+ end
37
+
38
+ @default_inputs = self.inputs.dup.freeze
39
+ end
40
+
41
+ # Submits the form using the configured {#inputs}.
42
+ def trigger
43
+ [ browser.fire_event( element, @method, value: value ) ]
44
+ end
45
+
46
+ def name
47
+ inputs.keys.first
48
+ end
49
+
50
+ def value
51
+ inputs.values.first
52
+ end
53
+
54
+ def valid_input_name?( name )
55
+ @valid_input_name == name.to_s
56
+ end
57
+
58
+ def type
59
+ self.class.type
60
+ end
61
+ def self.type
62
+ :ui_input_dom
63
+ end
64
+
65
+ def initialization_options
66
+ super.merge( inputs: inputs.dup, method: @method )
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -21,6 +21,8 @@ class JSON < Base
21
21
  Dir.glob( lib ).each { |f| require f }
22
22
 
23
23
  # Generic element capabilities.
24
+ include Arachni::Element::Capabilities::Auditable
25
+ include Arachni::Element::Capabilities::Submittable
24
26
  include Arachni::Element::Capabilities::Analyzable
25
27
  include Arachni::Element::Capabilities::WithSource
26
28
 
@@ -21,6 +21,9 @@ class Link < Base
21
21
  Dir.glob( lib ).each { |f| require f }
22
22
 
23
23
  # Generic element capabilities.
24
+ include Arachni::Element::Capabilities::WithNode
25
+ include Arachni::Element::Capabilities::Mutable
26
+ include Arachni::Element::Capabilities::Inputtable
24
27
  include Arachni::Element::Capabilities::Analyzable
25
28
  include Arachni::Element::Capabilities::Refreshable
26
29
 
@@ -15,7 +15,6 @@ module Capabilities
15
15
  #
16
16
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
17
  module WithDOM
18
- include Arachni::Element::Capabilities::WithNode
19
18
  include Arachni::Element::Capabilities::WithDOM
20
19
 
21
20
  # @return [DOM]
@@ -6,15 +6,28 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
+ require_relative '../dom'
10
+
9
11
  module Arachni::Element
10
12
  class Link
11
13
 
12
14
  # Provides access to DOM operations for {Link links}.
13
15
  #
14
16
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
- class DOM < Base
17
+ class DOM < DOM
18
+
19
+ # Load and include all link-specific capability overrides.
20
+ lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
21
+ Dir.glob( lib ).each { |f| require f }
22
+
23
+ # Generic element capabilities.
16
24
  include Arachni::Element::Capabilities::WithNode
17
- include Arachni::Element::Capabilities::Auditable::DOM
25
+ include Arachni::Element::DOM::Capabilities::Mutable
26
+ include Arachni::Element::DOM::Capabilities::Inputtable
27
+ include Arachni::Element::DOM::Capabilities::Auditable
28
+
29
+ # Link-specific overrides.
30
+ include Capabilities::Submittable
18
31
 
19
32
  # @return [String, nil]
20
33
  # URL fragment.
@@ -46,7 +59,7 @@ class DOM < Base
46
59
 
47
60
  # Loads the page with the {#inputs} in the {#fragment}.
48
61
  def trigger
49
- browser.goto to_s, take_snapshot: false, update_transitions: false
62
+ [ browser.goto( to_s, take_snapshot: false, update_transitions: false ) ]
50
63
  end
51
64
 
52
65
  def valid_input_name?( name )
@@ -0,0 +1,29 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ module Arachni::Element
10
+ class Link::DOM
11
+ module Capabilities
12
+
13
+ # Extends {Arachni::Element::DOM::Capabilities::Submittable} with {Link}-specific
14
+ # functionality.
15
+ #
16
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
+ module Submittable
18
+ include Arachni::Element::DOM::Capabilities::Submittable
19
+
20
+ def prepare_browser( browser, options )
21
+ @browser = browser
22
+ browser.javascript.custom_code = options[:custom_code]
23
+ browser.javascript.taint = options[:taint]
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -22,6 +22,9 @@ class LinkTemplate < Base
22
22
  Dir.glob( lib ).each { |f| require f }
23
23
 
24
24
  # Generic element capabilities.
25
+ include Arachni::Element::Capabilities::WithNode
26
+ include Arachni::Element::Capabilities::Mutable
27
+ include Arachni::Element::Capabilities::Submittable
25
28
  include Arachni::Element::Capabilities::Analyzable
26
29
 
27
30
  # LinkTemplate-specific overrides.
@@ -29,11 +32,6 @@ class LinkTemplate < Base
29
32
  include Capabilities::Inputtable
30
33
  include Capabilities::Auditable
31
34
 
32
- INVALID_INPUT_DATA = [
33
- # Protocol URLs require a // which we can't preserve.
34
- '://'
35
- ]
36
-
37
35
  # @return [Regexp]
38
36
  # Regular expressions with named captures, serving as templates used to
39
37
  # identify and manipulate inputs in {#action}.
@@ -17,6 +17,11 @@ module Capabilities
17
17
  module Inputtable
18
18
  include Arachni::Element::Capabilities::Inputtable
19
19
 
20
+ INVALID_INPUT_DATA = [
21
+ # Protocol URLs require a // which we can't preserve.
22
+ '://'
23
+ ]
24
+
20
25
  # @param [String] name
21
26
  # Input name.
22
27
  #
@@ -15,7 +15,6 @@ module Capabilities
15
15
  #
16
16
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
17
17
  module WithDOM
18
- include Arachni::Element::Capabilities::WithNode
19
18
  include Arachni::Element::Capabilities::WithDOM
20
19
 
21
20
  # @return [DOM]
@@ -6,15 +6,28 @@
6
6
  web site for more information on licensing and terms of use.
7
7
  =end
8
8
 
9
+ require_relative '../dom'
10
+
9
11
  module Arachni::Element
10
12
  class LinkTemplate
11
13
 
12
14
  # Provides access to DOM operations for {LinkTemplate link templates}.
13
15
  #
14
16
  # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
15
- class DOM < Base
17
+ class DOM < DOM
18
+
19
+ # Load and include all link-specific capability overrides.
20
+ lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
21
+ Dir.glob( lib ).each { |f| require f }
22
+
23
+ # Generic element capabilities.
16
24
  include Arachni::Element::Capabilities::WithNode
17
- include Arachni::Element::Capabilities::Auditable::DOM
25
+ include Arachni::Element::DOM::Capabilities::Mutable
26
+ include Arachni::Element::DOM::Capabilities::Inputtable
27
+ include Arachni::Element::DOM::Capabilities::Auditable
28
+
29
+ # LinkTtemplate-specific overrides.
30
+ include Capabilities::Submittable
18
31
 
19
32
  # @return [String, nil]
20
33
  # URL fragment.
@@ -37,7 +50,7 @@ class DOM < Base
37
50
 
38
51
  # Loads {#to_s}.
39
52
  def trigger
40
- browser.goto to_s, take_snapshot: false, update_transitions: false
53
+ [ browser.goto( to_s, take_snapshot: false, update_transitions: false ) ]
41
54
  end
42
55
 
43
56
  # @param [String] name