arachni 1.2.1 → 1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/README.md +16 -5
  5. data/components/checks/active/ldap_injection/errors.txt +1 -0
  6. data/components/checks/active/source_code_disclosure.rb +1 -1
  7. data/components/checks/active/unvalidated_redirect.rb +6 -6
  8. data/components/checks/active/unvalidated_redirect_dom.rb +10 -7
  9. data/components/checks/passive/grep/captcha.rb +14 -5
  10. data/components/checks/passive/grep/form_upload.rb +7 -3
  11. data/components/checks/passive/grep/hsts.rb +3 -3
  12. data/components/checks/passive/grep/html_objects.rb +2 -3
  13. data/components/checks/passive/grep/http_only_cookies.rb +2 -3
  14. data/components/checks/passive/grep/insecure_cookies.rb +1 -1
  15. data/components/checks/passive/grep/password_autocomplete.rb +2 -2
  16. data/components/checks/passive/grep/unencrypted_password_forms.rb +7 -7
  17. data/components/checks/passive/grep/x_frame_options.rb +2 -2
  18. data/components/checks/passive/http_put.rb +2 -3
  19. data/components/path_extractors/comments.rb +3 -3
  20. data/components/path_extractors/scripts.rb +10 -1
  21. data/components/plugins/defaults/autothrottle.rb +27 -18
  22. data/components/plugins/defaults/meta/remedies/discovery.rb +30 -33
  23. data/components/plugins/defaults/meta/remedies/timing_attacks.rb +7 -11
  24. data/components/plugins/login_script.rb +9 -3
  25. data/components/plugins/proxy.rb +4 -3
  26. data/components/reporters/html.rb +11 -14
  27. data/components/reporters/html/default/issue.erb +13 -38
  28. data/components/reporters/html/default/issue/info.erb +1 -1
  29. data/components/reporters/html/default/summary/issues/by_name.erb +3 -3
  30. data/components/reporters/stdout.rb +62 -71
  31. data/components/reporters/xml.rb +26 -40
  32. data/components/reporters/xml/schema.xsd +43 -89
  33. data/lib/arachni/browser.rb +52 -3
  34. data/lib/arachni/browser/javascript.rb +3 -3
  35. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +46 -25
  36. data/lib/arachni/browser_cluster.rb +61 -0
  37. data/lib/arachni/browser_cluster/job.rb +21 -1
  38. data/lib/arachni/browser_cluster/jobs/browser_provider.rb +3 -1
  39. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +2 -1
  40. data/lib/arachni/browser_cluster/jobs/resource_exploration/event_trigger.rb +2 -1
  41. data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -2
  42. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +1 -1
  43. data/lib/arachni/browser_cluster/worker.rb +5 -0
  44. data/lib/arachni/check/auditor.rb +22 -12
  45. data/lib/arachni/data/framework.rb +13 -1
  46. data/lib/arachni/data/issues.rb +9 -25
  47. data/lib/arachni/element/base.rb +9 -3
  48. data/lib/arachni/element/capabilities/analyzable.rb +2 -6
  49. data/lib/arachni/element/capabilities/analyzable/differential.rb +24 -7
  50. data/lib/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +23 -23
  51. data/lib/arachni/element/capabilities/auditable.rb +0 -6
  52. data/lib/arachni/element/capabilities/dom_only.rb +61 -0
  53. data/lib/arachni/element/capabilities/with_dom.rb +3 -1
  54. data/lib/arachni/element/cookie.rb +35 -5
  55. data/lib/arachni/element/cookie/dom.rb +13 -4
  56. data/lib/arachni/element/{capabilities/auditable/dom.rb → dom.rb} +20 -68
  57. data/lib/arachni/element/dom/capabilities/auditable.rb +29 -0
  58. data/lib/arachni/element/dom/capabilities/inputtable.rb +27 -0
  59. data/lib/arachni/element/dom/capabilities/mutable.rb +21 -0
  60. data/lib/arachni/element/dom/capabilities/submittable.rb +52 -0
  61. data/lib/arachni/element/form.rb +12 -1
  62. data/lib/arachni/element/form/capabilities/mutable.rb +2 -1
  63. data/lib/arachni/element/form/capabilities/with_dom.rb +0 -1
  64. data/lib/arachni/element/form/dom.rb +9 -3
  65. data/lib/arachni/element/header.rb +14 -33
  66. data/lib/arachni/element/header/capabilities/inputtable.rb +29 -0
  67. data/lib/arachni/element/header/capabilities/mutable.rb +51 -0
  68. data/lib/arachni/element/input/dom.rb +71 -0
  69. data/lib/arachni/element/json.rb +2 -0
  70. data/lib/arachni/element/link.rb +3 -0
  71. data/lib/arachni/element/link/capabilities/with_dom.rb +0 -1
  72. data/lib/arachni/element/link/dom.rb +16 -3
  73. data/lib/arachni/element/link/dom/capabilities/submittable.rb +29 -0
  74. data/lib/arachni/element/link_template.rb +3 -5
  75. data/lib/arachni/element/link_template/capabilities/inputtable.rb +5 -0
  76. data/lib/arachni/element/link_template/capabilities/with_dom.rb +0 -1
  77. data/lib/arachni/element/link_template/dom.rb +16 -3
  78. data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +29 -0
  79. data/lib/arachni/element/server.rb +3 -5
  80. data/lib/arachni/element/ui_form.rb +106 -0
  81. data/lib/arachni/element/ui_form/dom.rb +107 -0
  82. data/lib/arachni/element/ui_input.rb +62 -0
  83. data/lib/arachni/element/xml.rb +2 -1
  84. data/lib/arachni/framework.rb +7 -5
  85. data/lib/arachni/framework/parts/audit.rb +0 -1
  86. data/lib/arachni/framework/parts/check.rb +1 -0
  87. data/lib/arachni/framework/parts/data.rb +4 -0
  88. data/lib/arachni/framework/parts/state.rb +0 -2
  89. data/lib/arachni/http/client.rb +17 -6
  90. data/lib/arachni/http/proxy_server.rb +52 -5
  91. data/lib/arachni/http/request.rb +1 -1
  92. data/lib/arachni/issue.rb +34 -179
  93. data/lib/arachni/issue/severity.rb +2 -0
  94. data/lib/arachni/option_groups/audit.rb +22 -2
  95. data/lib/arachni/option_groups/browser_cluster.rb +15 -0
  96. data/lib/arachni/page.rb +3 -2
  97. data/lib/arachni/parser.rb +24 -5
  98. data/lib/arachni/platform/manager.rb +1 -2
  99. data/lib/arachni/rpc/server/framework.rb +3 -4
  100. data/lib/arachni/rpc/server/framework/multi_instance.rb +2 -1
  101. data/lib/arachni/session.rb +1 -1
  102. data/lib/arachni/trainer.rb +4 -7
  103. data/lib/arachni/watir/element.rb +12 -1
  104. data/lib/version +1 -1
  105. data/spec/arachni/browser/element_locator_spec.rb +43 -43
  106. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +44 -44
  107. data/spec/arachni/browser/javascript/proxy/stub_spec.rb +17 -14
  108. data/spec/arachni/browser/javascript/proxy_spec.rb +24 -24
  109. data/spec/arachni/browser/javascript/taint_tracer/frame/called_function_spec.rb +11 -11
  110. data/spec/arachni/browser/javascript/taint_tracer/frame_spec.rb +7 -7
  111. data/spec/arachni/browser/javascript/taint_tracer/sink/data_flow_spec.rb +13 -13
  112. data/spec/arachni/browser/javascript/taint_tracer/sink/execution_flow_spec.rb +7 -7
  113. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +568 -558
  114. data/spec/arachni/browser/javascript_spec.rb +73 -63
  115. data/spec/arachni/browser_cluster/job/result_spec.rb +3 -3
  116. data/spec/arachni/browser_cluster/job_spec.rb +68 -48
  117. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger/result_spec.rb +2 -2
  118. data/spec/arachni/browser_cluster/jobs/resource_exploration/event_trigger_spec.rb +5 -4
  119. data/spec/arachni/browser_cluster/jobs/resource_exploration/result_spec.rb +2 -2
  120. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +5 -5
  121. data/spec/arachni/browser_cluster/worker_spec.rb +87 -70
  122. data/spec/arachni/browser_cluster_spec.rb +64 -39
  123. data/spec/arachni/browser_spec.rb +692 -527
  124. data/spec/arachni/check/auditor_spec.rb +177 -147
  125. data/spec/arachni/check/base_spec.rb +33 -33
  126. data/spec/arachni/check/manager_spec.rb +15 -15
  127. data/spec/arachni/component/base_spec.rb +8 -8
  128. data/spec/arachni/component/manager_spec.rb +100 -99
  129. data/spec/arachni/component/options/address_spec.rb +3 -3
  130. data/spec/arachni/component/options/base_spec.rb +7 -7
  131. data/spec/arachni/component/options/bool_spec.rb +9 -9
  132. data/spec/arachni/component/options/float_spec.rb +6 -6
  133. data/spec/arachni/component/options/int_spec.rb +5 -5
  134. data/spec/arachni/component/options/multiple_choice_spec.rb +12 -12
  135. data/spec/arachni/component/options/object_spec.rb +2 -2
  136. data/spec/arachni/component/options/path_spec.rb +3 -3
  137. data/spec/arachni/component/options/port_spec.rb +5 -5
  138. data/spec/arachni/component/options/string_spec.rb +3 -3
  139. data/spec/arachni/component/options/url_spec.rb +4 -4
  140. data/spec/arachni/component/utilities_spec.rb +2 -2
  141. data/spec/arachni/data/framework/rpc_spec.rb +10 -9
  142. data/spec/arachni/data/framework_spec.rb +65 -46
  143. data/spec/arachni/data/issues_spec.rb +39 -77
  144. data/spec/arachni/data/plugins_spec.rb +11 -11
  145. data/spec/arachni/data/session_spec.rb +6 -6
  146. data/spec/arachni/data_spec.rb +8 -8
  147. data/spec/arachni/element/body_spec.rb +10 -10
  148. data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +39 -21
  149. data/spec/arachni/element/capabilities/analyzable/{taint_spec.rb → signature_spec.rb} +63 -63
  150. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +51 -51
  151. data/spec/arachni/element/capabilities/with_scope/scope_spec.rb +5 -5
  152. data/spec/arachni/element/cookie/dom_spec.rb +37 -18
  153. data/spec/arachni/element/cookie_spec.rb +206 -139
  154. data/spec/arachni/element/form/dom_spec.rb +36 -19
  155. data/spec/arachni/element/form_spec.rb +210 -187
  156. data/spec/arachni/element/generic_dom_spec.rb +14 -14
  157. data/spec/arachni/element/header_spec.rb +35 -17
  158. data/spec/arachni/element/json_spec.rb +53 -31
  159. data/spec/arachni/element/link/dom_spec.rb +46 -28
  160. data/spec/arachni/element/link_spec.rb +58 -40
  161. data/spec/arachni/element/link_template/dom_spec.rb +47 -29
  162. data/spec/arachni/element/link_template_spec.rb +79 -61
  163. data/spec/arachni/element/path_spec.rb +1 -1
  164. data/spec/arachni/element/server_spec.rb +33 -32
  165. data/spec/arachni/element/ui_form/ui_form_dom_spec.rb +164 -0
  166. data/spec/arachni/element/ui_form_spec.rb +242 -0
  167. data/spec/arachni/element/ui_input/dom_spec.rb +157 -0
  168. data/spec/arachni/element/ui_input_spec.rb +136 -0
  169. data/spec/arachni/element/xml_spec.rb +42 -24
  170. data/spec/arachni/element_filter_spec.rb +49 -48
  171. data/spec/arachni/error_spec.rb +3 -3
  172. data/spec/arachni/framework/parts/audit_spec.rb +64 -63
  173. data/spec/arachni/framework/parts/browser_spec.rb +16 -16
  174. data/spec/arachni/framework/parts/check_spec.rb +3 -3
  175. data/spec/arachni/framework/parts/data_spec.rb +48 -48
  176. data/spec/arachni/framework/parts/platform_spec.rb +3 -3
  177. data/spec/arachni/framework/parts/plugin_spec.rb +7 -6
  178. data/spec/arachni/framework/parts/report_spec.rb +7 -7
  179. data/spec/arachni/framework/parts/scope_spec.rb +16 -16
  180. data/spec/arachni/framework/parts/state_spec.rb +68 -69
  181. data/spec/arachni/framework_spec.rb +39 -31
  182. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +32 -32
  183. data/spec/arachni/http/client_spec.rb +219 -208
  184. data/spec/arachni/http/cookie_jar_spec.rb +72 -72
  185. data/spec/arachni/http/headers_spec.rb +14 -14
  186. data/spec/arachni/http/proxy_server_spec.rb +43 -42
  187. data/spec/arachni/http/request_spec.rb +105 -103
  188. data/spec/arachni/http/response/scope_spec.rb +24 -24
  189. data/spec/arachni/http/response_spec.rb +50 -49
  190. data/spec/arachni/issue/severity_spec.rb +10 -9
  191. data/spec/arachni/issue_spec.rb +71 -369
  192. data/spec/arachni/option_groups/audit_spec.rb +114 -114
  193. data/spec/arachni/option_groups/browser_cluster_spec.rb +20 -3
  194. data/spec/arachni/option_groups/datastore_spec.rb +6 -6
  195. data/spec/arachni/option_groups/dispatcher_spec.rb +19 -19
  196. data/spec/arachni/option_groups/http_spec.rb +11 -11
  197. data/spec/arachni/option_groups/input_spec.rb +31 -27
  198. data/spec/arachni/option_groups/output_spec.rb +2 -2
  199. data/spec/arachni/option_groups/paths_spec.rb +17 -17
  200. data/spec/arachni/option_groups/rpc_spec.rb +2 -2
  201. data/spec/arachni/option_groups/scope_spec.rb +40 -40
  202. data/spec/arachni/option_groups/session_spec.rb +6 -5
  203. data/spec/arachni/option_groups/snapshot_spec.rb +4 -4
  204. data/spec/arachni/options_spec.rb +46 -45
  205. data/spec/arachni/page/dom/transition_spec.rb +74 -72
  206. data/spec/arachni/page/dom_spec.rb +35 -35
  207. data/spec/arachni/page/scope_spec.rb +15 -15
  208. data/spec/arachni/page_spec.rb +217 -217
  209. data/spec/arachni/parser_spec.rb +106 -104
  210. data/spec/arachni/platform/fingerprinter_spec.rb +17 -14
  211. data/spec/arachni/platform/list_spec.rb +33 -33
  212. data/spec/arachni/platform/manager_spec.rb +67 -64
  213. data/spec/arachni/plugin/base_spec.rb +10 -10
  214. data/spec/arachni/plugin/manager_spec.rb +38 -37
  215. data/spec/arachni/report_spec.rb +43 -40
  216. data/spec/arachni/reporter/base_spec.rb +15 -15
  217. data/spec/arachni/reporter/manager_spec.rb +4 -4
  218. data/spec/arachni/reporter/options_spec.rb +6 -6
  219. data/spec/arachni/rpc/client/base_spec.rb +6 -6
  220. data/spec/arachni/rpc/client/dispatcher_spec.rb +2 -2
  221. data/spec/arachni/rpc/client/instance_spec.rb +6 -6
  222. data/spec/arachni/rpc/server/active_options_spec.rb +11 -8
  223. data/spec/arachni/rpc/server/base_spec.rb +5 -5
  224. data/spec/arachni/rpc/server/checks/manager_spec.rb +8 -8
  225. data/spec/arachni/rpc/server/dispatcher/node_spec.rb +37 -37
  226. data/spec/arachni/rpc/server/dispatcher/service_spec.rb +15 -14
  227. data/spec/arachni/rpc/server/dispatcher_spec.rb +36 -35
  228. data/spec/arachni/rpc/server/framework/distributor_spec.rb +36 -36
  229. data/spec/arachni/rpc/server/framework_multi_spec.rb +340 -336
  230. data/spec/arachni/rpc/server/framework_spec.rb +90 -85
  231. data/spec/arachni/rpc/server/instance_spec.rb +126 -107
  232. data/spec/arachni/rpc/server/output_spec.rb +1 -1
  233. data/spec/arachni/rpc/server/plugin/manager_spec.rb +6 -6
  234. data/spec/arachni/ruby/array_spec.rb +42 -42
  235. data/spec/arachni/ruby/hash_spec.rb +20 -18
  236. data/spec/arachni/ruby/io_spec.rb +2 -2
  237. data/spec/arachni/ruby/object_spec.rb +1 -1
  238. data/spec/arachni/ruby/set_spec.rb +3 -3
  239. data/spec/arachni/ruby/string_spec.rb +30 -30
  240. data/spec/arachni/ruby/webrick_spec.rb +2 -2
  241. data/spec/arachni/scope_spec.rb +1 -1
  242. data/spec/arachni/session_spec.rb +67 -64
  243. data/spec/arachni/snapshot_spec.rb +15 -15
  244. data/spec/arachni/state/audit_spec.rb +11 -11
  245. data/spec/arachni/state/element_filter_spec.rb +6 -6
  246. data/spec/arachni/state/framework/rpc_spec.rb +12 -12
  247. data/spec/arachni/state/framework_spec.rb +125 -121
  248. data/spec/arachni/state/http_spec.rb +7 -7
  249. data/spec/arachni/state/options_spec.rb +7 -7
  250. data/spec/arachni/state/plugins_spec.rb +8 -8
  251. data/spec/arachni/state_spec.rb +10 -10
  252. data/spec/arachni/support/buffer/autoflush_spec.rb +16 -16
  253. data/spec/arachni/support/buffer/base_spec.rb +39 -39
  254. data/spec/arachni/support/cache/least_cost_replacement_spec.rb +18 -18
  255. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +24 -24
  256. data/spec/arachni/support/cache/least_recently_used_spec.rb +20 -20
  257. data/spec/arachni/support/cache/preference_spec.rb +4 -4
  258. data/spec/arachni/support/cache/random_replacement_spec.rb +8 -8
  259. data/spec/arachni/support/crypto/rsa_aes_cbc_spec.rb +1 -1
  260. data/spec/arachni/support/database/hash_spec.rb +44 -43
  261. data/spec/arachni/support/database/queue_spec.rb +27 -27
  262. data/spec/arachni/support/lookup/hash_set_spec.rb +8 -8
  263. data/spec/arachni/support/lookup/moolb_spec.rb +3 -3
  264. data/spec/arachni/support/mixins/observable_spec.rb +6 -6
  265. data/spec/arachni/support/signature_spec.rb +19 -19
  266. data/spec/arachni/trainer_spec.rb +39 -39
  267. data/spec/arachni/typhoeus/hydra_spec.rb +2 -2
  268. data/spec/arachni/uri/scope_spec.rb +66 -66
  269. data/spec/arachni/uri_spec.rb +107 -105
  270. data/spec/arachni/utilities_spec.rb +40 -40
  271. data/spec/components/checks/active/csrf_spec.rb +8 -8
  272. data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
  273. data/spec/components/checks/active/sql_injection_spec.rb +16 -16
  274. data/spec/components/checks/active/trainer_spec.rb +4 -4
  275. data/spec/components/checks/active/unvalidated_redirect_dom_spec.rb +4 -2
  276. data/spec/components/checks/active/xpath_injection_spec.rb +1 -1
  277. data/spec/components/checks/active/xss_dom_script_context_spec.rb +51 -21
  278. data/spec/components/checks/active/xss_dom_spec.rb +46 -24
  279. data/spec/components/checks/passive/allowed_methods_spec.rb +1 -1
  280. data/spec/components/checks/passive/grep/cookie_set_for_parent_domain_spec.rb +1 -1
  281. data/spec/components/checks/passive/grep/hsts_spec.rb +2 -2
  282. data/spec/components/checks/passive/grep/http_only_cookies_spec.rb +1 -1
  283. data/spec/components/checks/passive/grep/insecure_cookies_spec.rb +1 -1
  284. data/spec/components/checks/passive/grep/insecure_cors_policy_spec.rb +2 -2
  285. data/spec/components/checks/passive/grep/password_autocomplete_spec.rb +1 -1
  286. data/spec/components/checks/passive/grep/private_ip_spec.rb +3 -3
  287. data/spec/components/checks/passive/grep/unencrypted_password_forms_spec.rb +1 -1
  288. data/spec/components/checks/passive/grep/x_frame_options_spec.rb +2 -2
  289. data/spec/components/checks/passive/interesting_responses_spec.rb +2 -2
  290. data/spec/components/checks/passive/webdav_spec.rb +1 -1
  291. data/spec/components/checks/passive/xst_spec.rb +1 -1
  292. data/spec/components/fingerprinters/servers/apache_spec.rb +2 -2
  293. data/spec/components/path_extractors/comments_spec.rb +5 -1
  294. data/spec/components/path_extractors/scripts_spec.rb +5 -2
  295. data/spec/components/plugins/autologin_spec.rb +22 -22
  296. data/spec/components/plugins/autothrottle_spec.rb +6 -5
  297. data/spec/components/plugins/content_types_spec.rb +4 -4
  298. data/spec/components/plugins/cookie_collector_spec.rb +5 -5
  299. data/spec/components/plugins/exec_spec.rb +12 -12
  300. data/spec/components/plugins/form_dicattack_spec.rb +3 -3
  301. data/spec/components/plugins/headers_collector_spec.rb +8 -8
  302. data/spec/components/plugins/healthmap_spec.rb +3 -3
  303. data/spec/components/plugins/http_dicattack_spec.rb +3 -3
  304. data/spec/components/plugins/login_script_spec.rb +79 -22
  305. data/spec/components/plugins/meta/remedies/discovery_spec.rb +3 -2
  306. data/spec/components/plugins/meta/remedies/timing_attacks_spec.rb +3 -3
  307. data/spec/components/plugins/meta/uniformity_spec.rb +2 -2
  308. data/spec/components/plugins/restrict_to_dom_state_spec.rb +1 -1
  309. data/spec/components/plugins/script_spec.rb +1 -1
  310. data/spec/components/plugins/uncommon_headers_spec.rb +2 -2
  311. data/spec/components/plugins/vector_collector_spec.rb +2 -2
  312. data/spec/components/plugins/vector_feed_spec.rb +40 -40
  313. data/spec/components/plugins/waf_detector_spec.rb +6 -6
  314. data/spec/components/reporters/json_spec.rb +4 -4
  315. data/spec/components/reporters/marshal_spec.rb +2 -2
  316. data/spec/components/reporters/yaml_spec.rb +3 -2
  317. data/spec/external/wavsep/active/sqli_spec.rb +1 -3
  318. data/spec/spec_helper.rb +4 -0
  319. data/spec/support/factories/element/ui_form.rb +14 -0
  320. data/spec/support/factories/element/ui_input.rb +13 -0
  321. data/spec/support/factories/issue.rb +0 -13
  322. data/spec/support/fixtures/report.afr +0 -0
  323. data/spec/support/fixtures/{taint_check/taint.rb → signature_check/signature.rb} +2 -2
  324. data/spec/support/helpers/browser_cluster/jobs/taint_tracer.rb +11 -11
  325. data/spec/support/helpers/framework.rb +1 -1
  326. data/spec/support/helpers/pages.rb +2 -2
  327. data/spec/support/servers/arachni/browser.rb +139 -0
  328. data/spec/support/servers/arachni/browser/javascript/taint_tracer.rb +40 -0
  329. data/spec/support/servers/arachni/element/capabilities/analyzable/{taint.rb → signature.rb} +0 -0
  330. data/spec/support/servers/arachni/element/input/input_dom.rb +102 -0
  331. data/spec/support/servers/arachni/element/ui_form/ui_form_dom.rb +238 -0
  332. data/spec/support/servers/checks/active/trainer_check.rb +7 -7
  333. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +22 -6
  334. data/spec/support/servers/checks/active/xss_dom.rb +50 -0
  335. data/spec/support/servers/checks/active/xss_dom_script_context.rb +53 -0
  336. data/spec/support/shared/browser/javascript/taint_tracer/sink/base.rb +6 -6
  337. data/spec/support/shared/check.rb +10 -12
  338. data/spec/support/shared/component/options/base.rb +24 -24
  339. data/spec/support/shared/element/base.rb +25 -25
  340. data/spec/support/shared/element/capabilities/auditable.rb +116 -140
  341. data/spec/support/shared/element/capabilities/dom_only.rb +65 -0
  342. data/spec/support/shared/element/capabilities/inputtable.rb +71 -86
  343. data/spec/support/shared/element/capabilities/mutable.rb +122 -111
  344. data/spec/support/shared/element/capabilities/refreshable.rb +10 -10
  345. data/spec/support/shared/element/capabilities/{submitable.rb → submittable.rb} +26 -26
  346. data/spec/support/shared/element/capabilities/with_auditor.rb +10 -10
  347. data/spec/support/shared/element/capabilities/with_dom.rb +8 -8
  348. data/spec/support/shared/element/capabilities/with_node.rb +4 -6
  349. data/spec/support/shared/element/capabilities/with_scope.rb +2 -2
  350. data/spec/support/shared/element/capabilities/with_source.rb +6 -8
  351. data/spec/support/shared/element/dom.rb +144 -0
  352. data/spec/support/shared/element/dom/auditable.rb +42 -0
  353. data/spec/support/shared/element/dom/inputtable.rb +5 -0
  354. data/spec/support/shared/element/dom/mutable.rb +3 -0
  355. data/spec/support/shared/element/dom/submittable.rb +119 -0
  356. data/spec/support/shared/external/wavsep.rb +3 -3
  357. data/spec/support/shared/fingerprinter.rb +2 -2
  358. data/spec/support/shared/framework.rb +1 -1
  359. data/spec/support/shared/http/message.rb +9 -9
  360. data/spec/support/shared/option_group.rb +17 -17
  361. data/spec/support/shared/path_extractor.rb +1 -1
  362. data/spec/support/shared/plugin.rb +2 -2
  363. data/spec/support/shared/support/cache.rb +57 -57
  364. data/spec/support/shared/support/lookup.rb +25 -25
  365. data/ui/cli/framework.rb +22 -11
  366. data/ui/cli/framework/option_parser.rb +15 -0
  367. data/ui/cli/option_parser.rb +8 -1
  368. data/ui/cli/output.rb +2 -1
  369. metadata +54 -20
  370. data/components/checks/active/xss_dom_inputs.rb +0 -236
  371. data/spec/components/checks/active/xss_dom_inputs_spec.rb +0 -30
  372. data/spec/support/servers/checks/active/xss_dom_inputs.rb +0 -59
  373. data/spec/support/shared/element/capabilities/auditable/dom.rb +0 -322
@@ -0,0 +1,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 LinkTemplate::DOM
11
+ module Capabilities
12
+
13
+ # Extends {Arachni::Element::DOM::Capabilities::Submittable} with
14
+ # {LinkTemplate}-specific 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
@@ -139,12 +139,10 @@ class Server < Base
139
139
 
140
140
  def self.flag_issues_as_untrusted( issue_digests )
141
141
  issue_digests.uniq.each do |digest|
142
- next if !Arachni::Data.issues[digest]
142
+ next if !(issue = Arachni::Data.issues[digest])
143
143
 
144
- Arachni::Data.issues[digest].variations.each do |issue|
145
- issue.add_remark :meta_analysis, REMARK
146
- issue.trusted = false
147
- end
144
+ issue.add_remark :meta_analysis, REMARK
145
+ issue.trusted = false
148
146
  end
149
147
  end
150
148
 
@@ -0,0 +1,106 @@
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 'base'
10
+
11
+ module Arachni::Element
12
+
13
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
14
+ class UIForm < Base
15
+ require_relative 'ui_form/dom'
16
+
17
+ include Arachni::Element::Capabilities::DOMOnly
18
+
19
+ SUPPORTED_TYPES = Set.new([:input, :button])
20
+
21
+ attr_accessor :opening_tags
22
+
23
+ def initialize( options )
24
+ super options
25
+
26
+ @opening_tags = (options[:opening_tags] || []).dup
27
+ end
28
+
29
+ def dup
30
+ super.tap do |o|
31
+ o.opening_tags = self.opening_tags.dup
32
+ end
33
+ end
34
+
35
+ def self.type
36
+ :ui_form
37
+ end
38
+
39
+ def self.from_browser( browser, page )
40
+ ui_forms = []
41
+
42
+ # JS not supported on page, no sense in continuing...
43
+ return ui_forms if !browser.javascript.supported?
44
+
45
+ # Does the page have any buttons at all?
46
+ if !page.has_elements?( :button ) &&
47
+ !page.document.xpath( "//input[@type='button']" )
48
+ return ui_forms
49
+ end
50
+
51
+ # Does the page have any text inputs?
52
+ inputs, opening_tags = inputs_from_page( page )
53
+ return ui_forms if inputs.empty?
54
+
55
+ # Looks like we have input groups, get buttons with events.
56
+ browser.each_element_with_events false do |locator, events|
57
+ next if !SUPPORTED_TYPES.include?( locator.tag_name )
58
+ next if locator.tag_name == :input &&
59
+ locator.attributes['type'] != 'button'
60
+
61
+ browser.filter_events( locator.tag_name, events ).each do |event, _|
62
+ ui_forms << new(
63
+ action: page.url,
64
+ source: locator.to_s,
65
+ method: event,
66
+ inputs: inputs,
67
+ opening_tags: opening_tags
68
+ )
69
+ end
70
+ end
71
+
72
+ ui_forms
73
+ end
74
+
75
+ def self.inputs_from_page( page )
76
+ opening_tags = {}
77
+ inputs = {}
78
+
79
+ page.document.css( 'textarea' ).each do |textarea|
80
+ name = node_to_name( textarea )
81
+
82
+ inputs[name] = textarea.text
83
+ opening_tags[name] = Arachni::Browser::ElementLocator.from_node( textarea ).to_s
84
+ end
85
+
86
+ page.document.css( 'input' ).each do |input|
87
+ next if input['type'] && input['type'] != 'text'
88
+
89
+ name = node_to_name( input )
90
+
91
+ inputs[name] = input['value'].to_s
92
+ opening_tags[name] = Arachni::Browser::ElementLocator.from_node( input ).to_s
93
+ end
94
+
95
+ [inputs, opening_tags]
96
+ end
97
+
98
+ def self.node_to_name( node )
99
+ node['name'] || node['id'] ||
100
+ Arachni::Browser::ElementLocator.from_node( node ).to_s
101
+ end
102
+
103
+ end
104
+ end
105
+
106
+ Arachni::UIForm = Arachni::Element::UIForm
@@ -0,0 +1,107 @@
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 UIForm
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
+ INPUTS = Set.new([:input, :textarea])
24
+
25
+ def initialize( options )
26
+ super
27
+
28
+ @opening_tags = (options[:opening_tags] || parent.opening_tags).dup
29
+
30
+ self.method = options[:method] || self.parent.method
31
+
32
+ inputs = (options[:inputs] || self.parent.inputs ).dup
33
+
34
+ @valid_input_names = Set.new(inputs.keys)
35
+ self.inputs = inputs
36
+
37
+ @default_inputs = self.inputs.dup.freeze
38
+ end
39
+
40
+ # Submits the form using the configured {#inputs}.
41
+ def trigger
42
+ transitions = fill_in_inputs
43
+
44
+ print_debug "Submitting: #{self.source}"
45
+ submission_transition = browser.fire_event( element, @method )
46
+ print_debug "Submitted: #{self.source}"
47
+
48
+ return if !submission_transition
49
+
50
+ transitions + [submission_transition]
51
+ end
52
+
53
+ def valid_input_name?( name )
54
+ @valid_input_names.include? name.to_s
55
+ end
56
+
57
+ def type
58
+ self.class.type
59
+ end
60
+ def self.type
61
+ :ui_form_dom
62
+ end
63
+
64
+ def initialization_options
65
+ super.merge(
66
+ inputs: inputs.dup,
67
+ method: @method,
68
+ opening_tags: @opening_tags.dup
69
+ )
70
+ end
71
+
72
+ def marshal_dump
73
+ super.tap { |h| h.delete :@valid_input_names }
74
+ end
75
+
76
+ private
77
+
78
+ def fill_in_inputs
79
+ transitions = []
80
+
81
+ @inputs.each do |name, value|
82
+ locator = locator_for_input( name )
83
+ opening_tag = @opening_tags[name]
84
+
85
+ print_debug "Filling in: #{name} => #{value} [#{opening_tag}]"
86
+
87
+ t = browser.fire_event( locator, :input, value: value )
88
+
89
+ if !t
90
+ print_debug "Could not fill in: #{name} => #{value} [#{opening_tag}]"
91
+ next
92
+ end
93
+ print_debug "Filled in: #{name} => #{value} [#{opening_tag}]"
94
+
95
+ transitions << t
96
+ end
97
+
98
+ transitions
99
+ end
100
+
101
+ def locator_for_input( name )
102
+ Arachni::Browser::ElementLocator.from_html @opening_tags[name]
103
+ end
104
+
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,62 @@
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 'base'
10
+
11
+ module Arachni::Element
12
+
13
+ # @author Tasos "Zapotek" Laskos <tasos.laskos@arachni-scanner.com>
14
+ class UIInput < Base
15
+ require_relative 'input/dom'
16
+
17
+ include Arachni::Element::Capabilities::DOMOnly
18
+
19
+ SUPPORTED_TYPES = Set.new([:input, :textarea])
20
+
21
+ def self.type
22
+ :ui_input
23
+ end
24
+
25
+ def self.from_browser( browser, page )
26
+ inputs = []
27
+
28
+ return inputs if !browser.javascript.supported?
29
+
30
+ if page.document.css( 'textarea' ).empty? &&
31
+ page.document.xpath( '//input[@type="text"]' ).empty? &&
32
+ page.document.xpath( '//input[not(@type)]' ).empty?
33
+ return inputs
34
+ end
35
+
36
+ browser.each_element_with_events false do |locator, events|
37
+ next if !SUPPORTED_TYPES.include?( locator.tag_name )
38
+ next if locator.attributes['type'] &&
39
+ locator.attributes['type'] != 'text'
40
+
41
+ browser.filter_events( locator.tag_name, events ).each do |event, _|
42
+ name = locator.attributes['name'] || locator.attributes['id'] ||
43
+ locator.to_s
44
+
45
+ inputs << new(
46
+ action: page.url,
47
+ source: locator.to_s,
48
+ method: event,
49
+ inputs: {
50
+ name => locator.attributes['value'].to_s
51
+ }
52
+ )
53
+ end
54
+ end
55
+
56
+ inputs
57
+ end
58
+
59
+ end
60
+ end
61
+
62
+ Arachni::UIInput = Arachni::Element::UIInput
@@ -18,7 +18,8 @@ class XML < Base
18
18
  lib = "#{File.dirname( __FILE__ )}/#{File.basename(__FILE__, '.rb')}/capabilities/**/*.rb"
19
19
  Dir.glob( lib ).each { |f| require f }
20
20
 
21
- # Generic element capabilities.
21
+ include Arachni::Element::Capabilities::Auditable
22
+ include Arachni::Element::Capabilities::Submittable
22
23
  include Arachni::Element::Capabilities::Analyzable
23
24
  include Arachni::Element::Capabilities::WithSource
24
25
 
@@ -133,6 +133,7 @@ class Framework
133
133
  # Framework statistics:
134
134
  #
135
135
  # * `:http` -- {HTTP::Client#statistics}
136
+ # * `browser_cluster` -- {BrowserCluster.statistics}
136
137
  # * `:runtime` -- Scan runtime in seconds.
137
138
  # * `:found_pages` -- Number of discovered pages.
138
139
  # * `:audited_pages` -- Number of audited pages.
@@ -141,11 +142,12 @@ class Framework
141
142
  # * `:messages` -- {#status_messages}
142
143
  def statistics
143
144
  {
144
- http: http.statistics,
145
- runtime: @start_datetime ? Time.now - @start_datetime : 0,
146
- found_pages: sitemap.size,
147
- audited_pages: state.audited_page_count,
148
- current_page: @current_url
145
+ http: http.statistics,
146
+ browser_cluster: BrowserCluster.statistics,
147
+ runtime: @start_datetime ? Time.now - @start_datetime : 0,
148
+ found_pages: sitemap.size,
149
+ audited_pages: state.audited_page_count,
150
+ current_page: @current_url
149
151
  }
150
152
  end
151
153
 
@@ -80,7 +80,6 @@ module Audit
80
80
 
81
81
  state.audited_page_count += 1
82
82
  add_to_sitemap( page )
83
- sitemap.merge!( browser_sitemap )
84
83
 
85
84
  print_line
86
85
  print_status "[HTTP: #{page.code}] #{page.dom.url}"
@@ -80,6 +80,7 @@ module Check
80
80
  @checks.run_one( check, page )
81
81
  rescue => e
82
82
  print_error "Error in #{check.to_s}: #{e.to_s}"
83
+ print_error "Page: #{page.dom.url}"
83
84
  print_error_backtrace e
84
85
  false
85
86
  end
@@ -184,6 +184,10 @@ module Data
184
184
  data.add_page_to_sitemap( page )
185
185
  end
186
186
 
187
+ def update_sitemap( entries )
188
+ data.update_sitemap( entries )
189
+ end
190
+
187
191
  def push_paths_from_page( page )
188
192
  page.paths.select { |path| push_to_url_queue( path ) }
189
193
  end
@@ -108,8 +108,6 @@ module State
108
108
 
109
109
  state.status = :cleanup
110
110
 
111
- sitemap.merge!( browser_sitemap )
112
-
113
111
  if shutdown_browsers
114
112
  state.set_status_message :browser_cluster_shutdown
115
113
  shutdown_browser_cluster
@@ -116,6 +116,8 @@ class Client
116
116
  # @return [Dynamic404Handler]
117
117
  attr_reader :dynamic_404_handler
118
118
 
119
+ attr_reader :original_max_concurrency
120
+
119
121
  def initialize
120
122
  super
121
123
  reset
@@ -177,12 +179,14 @@ class Client
177
179
  # * {#burst_responses_per_second}
178
180
  # * {#burst_average_response_time}
179
181
  # * {#max_concurrency}
182
+ # * {#original_max_concurrency}
180
183
  def statistics
181
184
  [:request_count, :response_count, :time_out_count,
182
185
  :total_responses_per_second, :burst_response_time_sum,
183
186
  :burst_response_count, :burst_responses_per_second,
184
187
  :burst_average_response_time, :total_average_response_time,
185
- :max_concurrency].inject({}) { |h, k| h[k] = send(k); h }
188
+ :max_concurrency, :original_max_concurrency].
189
+ inject({}) { |h, k| h[k] = send(k); h }
186
190
  end
187
191
 
188
192
  # @return [CookieJar]
@@ -549,10 +553,15 @@ class Client
549
553
  request = response.request
550
554
 
551
555
  synchronize do
552
- @response_count += 1
553
- @burst_response_count += 1
554
- @burst_response_time_sum += response.time
555
- @total_response_time_sum += response.time
556
+ @response_count += 1
557
+ @burst_response_count += 1
558
+
559
+ response_time = response.timed_out? ?
560
+ request.timeout / 1_000.0 :
561
+ response.time
562
+
563
+ @burst_response_time_sum += response_time
564
+ @total_response_time_sum += response_time
556
565
 
557
566
  if response.request.fingerprint? &&
558
567
  Platform::Manager.fingerprint?( response )
@@ -587,8 +596,10 @@ class Client
587
596
  end
588
597
 
589
598
  def client_initialize
599
+ @original_max_concurrency = Options.http.request_concurrency || MAX_CONCURRENCY
600
+
590
601
  @hydra = Typhoeus::Hydra.new(
591
- max_concurrency: Options.http.request_concurrency || MAX_CONCURRENCY
602
+ max_concurrency: @original_max_concurrency
592
603
  )
593
604
  end
594
605