arachni 1.3.2 → 1.4

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 (727) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +108 -0
  3. data/Gemfile +2 -6
  4. data/LICENSE.md +1 -1
  5. data/README.md +34 -16
  6. data/Rakefile +1 -1
  7. data/arachni.gemspec +28 -20
  8. data/bin/arachni +1 -1
  9. data/bin/arachni_console +1 -1
  10. data/bin/arachni_multi +1 -1
  11. data/bin/arachni_reporter +1 -1
  12. data/bin/arachni_rest_server +13 -0
  13. data/bin/arachni_restore +1 -1
  14. data/bin/arachni_rpc +1 -1
  15. data/bin/arachni_rpcd +1 -1
  16. data/bin/arachni_rpcd_monitor +1 -1
  17. data/bin/arachni_script +1 -1
  18. data/components/checks/active/code_injection.rb +8 -10
  19. data/components/checks/active/code_injection_php_input_wrapper.rb +5 -6
  20. data/components/checks/active/code_injection_timing.rb +1 -1
  21. data/components/checks/active/csrf.rb +1 -1
  22. data/components/checks/active/file_inclusion.rb +20 -26
  23. data/components/checks/active/ldap_injection.rb +4 -5
  24. data/components/checks/active/no_sql_injection.rb +11 -20
  25. data/components/checks/active/no_sql_injection/substrings/mongodb +1 -0
  26. data/components/checks/active/no_sql_injection_differential.rb +3 -4
  27. data/components/checks/active/os_cmd_injection.rb +5 -9
  28. data/components/checks/active/os_cmd_injection_timing.rb +1 -1
  29. data/components/checks/active/path_traversal.rb +4 -17
  30. data/components/checks/active/response_splitting.rb +8 -2
  31. data/components/checks/active/rfi.rb +4 -5
  32. data/components/checks/active/session_fixation.rb +9 -3
  33. data/components/checks/active/source_code_disclosure.rb +5 -20
  34. data/components/checks/active/sql_injection.rb +30 -18
  35. data/components/checks/active/sql_injection/{regexp_ignore.txt → ignore_substrings} +0 -0
  36. data/components/checks/active/sql_injection/regexps/db2.yaml +2 -0
  37. data/components/checks/active/sql_injection/regexps/frontbase.yaml +1 -0
  38. data/components/checks/active/sql_injection/regexps/informix.yaml +1 -0
  39. data/components/checks/active/sql_injection/regexps/ingres.yaml +2 -0
  40. data/components/checks/active/sql_injection/regexps/maxdb.yaml +2 -0
  41. data/components/checks/active/sql_injection/regexps/mssql.yaml +8 -0
  42. data/components/checks/active/sql_injection/regexps/mysql.yaml +4 -0
  43. data/components/checks/active/sql_injection/regexps/oracle.yaml +4 -0
  44. data/components/checks/active/sql_injection/regexps/pgsql.yaml +3 -0
  45. data/components/checks/active/sql_injection/regexps/sqlite.yaml +2 -0
  46. data/components/checks/active/sql_injection/regexps/sybase.yaml +2 -0
  47. data/components/checks/active/sql_injection/substrings/access +3 -0
  48. data/components/checks/active/sql_injection/substrings/db2 +2 -0
  49. data/components/checks/active/sql_injection/{patterns → substrings}/emc +1 -1
  50. data/components/checks/active/sql_injection/{patterns → substrings}/firebird +0 -1
  51. data/components/checks/active/sql_injection/substrings/hsqldb +1 -0
  52. data/components/checks/active/sql_injection/{patterns → substrings}/informix +1 -2
  53. data/components/checks/active/sql_injection/substrings/ingres +1 -0
  54. data/components/checks/active/sql_injection/{patterns → substrings}/interbase +0 -0
  55. data/components/checks/active/sql_injection/substrings/mssql +17 -0
  56. data/components/checks/active/sql_injection/{patterns → substrings}/mysql +3 -6
  57. data/components/checks/active/sql_injection/substrings/oracle +2 -0
  58. data/components/checks/active/sql_injection/{patterns → substrings}/pgsql +3 -6
  59. data/components/checks/active/sql_injection/substrings/sqlite +3 -0
  60. data/components/checks/active/sql_injection/substrings/sybase +1 -0
  61. data/components/checks/active/sql_injection_differential.rb +5 -7
  62. data/components/checks/active/sql_injection_differential/payloads.txt +1 -1
  63. data/components/checks/active/sql_injection_timing.rb +1 -1
  64. data/components/checks/active/trainer.rb +5 -4
  65. data/components/checks/active/unvalidated_redirect.rb +1 -1
  66. data/components/checks/active/unvalidated_redirect_dom.rb +1 -1
  67. data/components/checks/active/xpath_injection.rb +3 -4
  68. data/components/checks/active/xss.rb +33 -12
  69. data/components/checks/active/xss_dom.rb +7 -4
  70. data/components/checks/active/xss_dom_script_context.rb +1 -1
  71. data/components/checks/active/xss_event.rb +43 -20
  72. data/components/checks/active/xss_path.rb +5 -4
  73. data/components/checks/active/xss_script_context.rb +41 -11
  74. data/components/checks/active/xss_tag.rb +14 -15
  75. data/components/checks/active/xxe.rb +5 -16
  76. data/components/checks/passive/allowed_methods.rb +1 -1
  77. data/components/checks/passive/backdoors.rb +4 -2
  78. data/components/checks/passive/backup_directories.rb +4 -2
  79. data/components/checks/passive/backup_files.rb +4 -2
  80. data/components/checks/passive/common_admin_interfaces.rb +4 -3
  81. data/components/checks/passive/common_directories.rb +3 -1
  82. data/components/checks/passive/common_files.rb +3 -1
  83. data/components/checks/passive/directory_listing.rb +4 -4
  84. data/components/checks/passive/grep/captcha.rb +1 -1
  85. data/components/checks/passive/grep/cookie_set_for_parent_domain.rb +1 -1
  86. data/components/checks/passive/grep/credit_card.rb +5 -7
  87. data/components/checks/passive/grep/cvs_svn_users.rb +1 -1
  88. data/components/checks/passive/grep/emails.rb +135 -8
  89. data/components/checks/passive/grep/form_upload.rb +1 -1
  90. data/components/checks/passive/grep/hsts.rb +4 -3
  91. data/components/checks/passive/grep/html_objects.rb +1 -1
  92. data/components/checks/passive/grep/http_only_cookies.rb +5 -3
  93. data/components/checks/passive/grep/insecure_cookies.rb +5 -3
  94. data/components/checks/passive/grep/insecure_cors_policy.rb +1 -1
  95. data/components/checks/passive/grep/mixed_resource.rb +1 -1
  96. data/components/checks/passive/grep/password_autocomplete.rb +1 -1
  97. data/components/checks/passive/grep/private_ip.rb +1 -1
  98. data/components/checks/passive/grep/ssn.rb +6 -3
  99. data/components/checks/passive/grep/unencrypted_password_forms.rb +1 -1
  100. data/components/checks/passive/grep/x_frame_options.rb +4 -3
  101. data/components/checks/passive/htaccess_limit.rb +1 -1
  102. data/components/checks/passive/http_put.rb +1 -1
  103. data/components/checks/passive/insecure_client_access_policy.rb +2 -2
  104. data/components/checks/passive/insecure_cross_domain_policy_access.rb +2 -2
  105. data/components/checks/passive/insecure_cross_domain_policy_headers.rb +2 -2
  106. data/components/checks/passive/interesting_responses.rb +1 -1
  107. data/components/checks/passive/localstart_asp.rb +1 -1
  108. data/components/checks/passive/origin_spoof_access_restriction_bypass.rb +1 -1
  109. data/components/checks/passive/webdav.rb +1 -1
  110. data/components/checks/passive/xst.rb +1 -1
  111. data/components/fingerprinters/frameworks/aspx_mvc.rb +1 -1
  112. data/components/fingerprinters/frameworks/cakephp.rb +1 -1
  113. data/components/fingerprinters/frameworks/cherrypy.rb +1 -1
  114. data/components/fingerprinters/frameworks/django.rb +1 -1
  115. data/components/fingerprinters/frameworks/jsf.rb +1 -1
  116. data/components/fingerprinters/frameworks/nette.rb +1 -1
  117. data/components/fingerprinters/frameworks/rack.rb +1 -1
  118. data/components/fingerprinters/frameworks/rails.rb +1 -1
  119. data/components/fingerprinters/frameworks/symfony.rb +1 -1
  120. data/components/fingerprinters/languages/asp.rb +1 -1
  121. data/components/fingerprinters/languages/aspx.rb +1 -1
  122. data/components/fingerprinters/languages/java.rb +1 -1
  123. data/components/fingerprinters/languages/php.rb +1 -1
  124. data/components/fingerprinters/languages/python.rb +1 -1
  125. data/components/fingerprinters/languages/ruby.rb +1 -1
  126. data/components/fingerprinters/os/bsd.rb +1 -1
  127. data/components/fingerprinters/os/linux.rb +1 -1
  128. data/components/fingerprinters/os/solaris.rb +1 -1
  129. data/components/fingerprinters/os/unix.rb +1 -1
  130. data/components/fingerprinters/os/windows.rb +1 -1
  131. data/components/fingerprinters/servers/apache.rb +1 -1
  132. data/components/fingerprinters/servers/gunicorn.rb +1 -1
  133. data/components/fingerprinters/servers/iis.rb +1 -1
  134. data/components/fingerprinters/servers/jetty.rb +1 -1
  135. data/components/fingerprinters/servers/nginx.rb +1 -1
  136. data/components/fingerprinters/servers/tomcat.rb +1 -1
  137. data/components/path_extractors/anchors.rb +1 -1
  138. data/components/path_extractors/areas.rb +1 -1
  139. data/components/path_extractors/comments.rb +1 -1
  140. data/components/path_extractors/data_url.rb +1 -1
  141. data/components/path_extractors/forms.rb +1 -1
  142. data/components/path_extractors/frames.rb +1 -1
  143. data/components/path_extractors/generic.rb +1 -1
  144. data/components/path_extractors/links.rb +1 -1
  145. data/components/path_extractors/meta_refresh.rb +3 -3
  146. data/components/path_extractors/scripts.rb +1 -1
  147. data/components/plugins/autologin.rb +16 -24
  148. data/components/plugins/beep_notify.rb +1 -1
  149. data/components/plugins/content_types.rb +1 -1
  150. data/components/plugins/cookie_collector.rb +1 -1
  151. data/components/plugins/defaults/autothrottle.rb +1 -1
  152. data/components/plugins/defaults/healthmap.rb +1 -1
  153. data/components/plugins/defaults/meta/remedies/discovery.rb +10 -9
  154. data/components/plugins/defaults/meta/remedies/timing_attacks.rb +1 -1
  155. data/components/plugins/defaults/meta/uniformity.rb +1 -1
  156. data/components/plugins/email_notify.rb +3 -5
  157. data/components/plugins/exec.rb +1 -1
  158. data/components/plugins/form_dicattack.rb +1 -1
  159. data/components/plugins/headers_collector.rb +1 -1
  160. data/components/plugins/http_dicattack.rb +1 -1
  161. data/components/plugins/login_script.rb +47 -22
  162. data/components/plugins/metrics.rb +1 -1
  163. data/components/plugins/proxy.rb +69 -44
  164. data/components/plugins/proxy/panel/help.html.erb +1 -18
  165. data/components/plugins/proxy/panel/inspect.html.erb +4 -3
  166. data/components/plugins/proxy/panel/page_accordion.html.erb +78 -43
  167. data/components/plugins/proxy/panel/panel.html.erb +2 -7
  168. data/components/plugins/proxy/template_scope.rb +1 -1
  169. data/components/plugins/restrict_to_dom_state.rb +3 -15
  170. data/components/plugins/script.rb +1 -1
  171. data/components/plugins/uncommon_headers.rb +1 -1
  172. data/components/plugins/vector_collector.rb +1 -1
  173. data/components/plugins/vector_feed.rb +3 -11
  174. data/components/plugins/waf_detector.rb +1 -1
  175. data/components/reporters/ap.rb +1 -1
  176. data/components/reporters/html.rb +2 -2
  177. data/components/reporters/json.rb +1 -1
  178. data/components/reporters/marshal.rb +1 -1
  179. data/components/reporters/plugin_formatters/html/autologin.rb +1 -1
  180. data/components/reporters/plugin_formatters/html/content_types.rb +1 -1
  181. data/components/reporters/plugin_formatters/html/cookie_collector.rb +1 -1
  182. data/components/reporters/plugin_formatters/html/exec.rb +1 -1
  183. data/components/reporters/plugin_formatters/html/form_dicattack.rb +1 -1
  184. data/components/reporters/plugin_formatters/html/healthmap.rb +1 -1
  185. data/components/reporters/plugin_formatters/html/http_dicattack.rb +1 -1
  186. data/components/reporters/plugin_formatters/html/login_script.rb +1 -1
  187. data/components/reporters/plugin_formatters/html/metrics.rb +1 -1
  188. data/components/reporters/plugin_formatters/html/uncommon_headers.rb +1 -1
  189. data/components/reporters/plugin_formatters/html/uniformity.rb +1 -1
  190. data/components/reporters/plugin_formatters/html/vector_collector.rb +1 -1
  191. data/components/reporters/plugin_formatters/html/waf_detector.rb +1 -1
  192. data/components/reporters/plugin_formatters/stdout/autologin.rb +1 -1
  193. data/components/reporters/plugin_formatters/stdout/content_types.rb +1 -1
  194. data/components/reporters/plugin_formatters/stdout/cookie_collector.rb +1 -1
  195. data/components/reporters/plugin_formatters/stdout/exec.rb +1 -1
  196. data/components/reporters/plugin_formatters/stdout/form_dicattack.rb +1 -1
  197. data/components/reporters/plugin_formatters/stdout/healthmap.rb +1 -1
  198. data/components/reporters/plugin_formatters/stdout/http_dicattack.rb +1 -1
  199. data/components/reporters/plugin_formatters/stdout/login_script.rb +1 -1
  200. data/components/reporters/plugin_formatters/stdout/metrics.rb +1 -1
  201. data/components/reporters/plugin_formatters/stdout/uncommon_headers.rb +1 -1
  202. data/components/reporters/plugin_formatters/stdout/uniformity.rb +1 -1
  203. data/components/reporters/plugin_formatters/stdout/vector_collector.rb +1 -1
  204. data/components/reporters/plugin_formatters/stdout/waf_detector.rb +1 -1
  205. data/components/reporters/plugin_formatters/xml/autologin.rb +1 -1
  206. data/components/reporters/plugin_formatters/xml/content_types.rb +1 -1
  207. data/components/reporters/plugin_formatters/xml/cookie_collector.rb +1 -1
  208. data/components/reporters/plugin_formatters/xml/exec.rb +1 -1
  209. data/components/reporters/plugin_formatters/xml/form_dicattack.rb +1 -1
  210. data/components/reporters/plugin_formatters/xml/healthmap.rb +1 -1
  211. data/components/reporters/plugin_formatters/xml/http_dicattack.rb +1 -1
  212. data/components/reporters/plugin_formatters/xml/login_script.rb +1 -1
  213. data/components/reporters/plugin_formatters/xml/metrics.rb +1 -1
  214. data/components/reporters/plugin_formatters/xml/uncommon_headers.rb +1 -1
  215. data/components/reporters/plugin_formatters/xml/uniformity.rb +1 -1
  216. data/components/reporters/plugin_formatters/xml/vector_collector.rb +1 -1
  217. data/components/reporters/plugin_formatters/xml/waf_detector.rb +1 -1
  218. data/components/reporters/stdout.rb +1 -1
  219. data/components/reporters/txt.rb +1 -1
  220. data/components/reporters/xml.rb +29 -4
  221. data/components/reporters/yaml.rb +1 -1
  222. data/lib/arachni.rb +48 -3
  223. data/lib/arachni/banner.rb +1 -1
  224. data/lib/arachni/browser.rb +601 -358
  225. data/lib/arachni/browser/element_locator.rb +25 -6
  226. data/lib/arachni/browser/javascript.rb +103 -35
  227. data/lib/arachni/browser/javascript/dom_monitor.rb +1 -1
  228. data/lib/arachni/browser/javascript/proxy.rb +28 -16
  229. data/lib/arachni/browser/javascript/proxy/stub.rb +1 -1
  230. data/lib/arachni/browser/javascript/scripts/dom_monitor.js +138 -67
  231. data/lib/arachni/browser/javascript/scripts/polyfills.js +28 -0
  232. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +27 -6
  233. data/lib/arachni/browser/javascript/taint_tracer.rb +1 -1
  234. data/lib/arachni/browser/javascript/taint_tracer/frame.rb +1 -1
  235. data/lib/arachni/browser/javascript/taint_tracer/frame/called_function.rb +1 -1
  236. data/lib/arachni/browser/javascript/taint_tracer/sink/base.rb +1 -1
  237. data/lib/arachni/browser/javascript/taint_tracer/sink/data_flow.rb +1 -1
  238. data/lib/arachni/browser/javascript/taint_tracer/sink/execution_flow.rb +1 -1
  239. data/lib/arachni/browser_cluster.rb +10 -14
  240. data/lib/arachni/browser_cluster/job.rb +1 -1
  241. data/lib/arachni/browser_cluster/job/result.rb +1 -1
  242. data/lib/arachni/browser_cluster/jobs/browser_provider.rb +1 -1
  243. data/lib/arachni/browser_cluster/jobs/{resource_exploration.rb → dom_exploration.rb} +5 -5
  244. data/lib/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/event_trigger.rb +7 -4
  245. data/lib/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/event_trigger/result.rb +3 -3
  246. data/lib/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/result.rb +2 -2
  247. data/lib/arachni/browser_cluster/jobs/taint_trace.rb +3 -3
  248. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger.rb +2 -2
  249. data/lib/arachni/browser_cluster/jobs/taint_trace/event_trigger/result.rb +2 -2
  250. data/lib/arachni/browser_cluster/jobs/taint_trace/result.rb +1 -1
  251. data/lib/arachni/browser_cluster/worker.rb +12 -40
  252. data/lib/arachni/check.rb +1 -1
  253. data/lib/arachni/check/auditor.rb +15 -1
  254. data/lib/arachni/check/base.rb +1 -1
  255. data/lib/arachni/check/manager.rb +1 -1
  256. data/lib/arachni/component.rb +1 -1
  257. data/lib/arachni/component/base.rb +5 -5
  258. data/lib/arachni/component/manager.rb +39 -13
  259. data/lib/arachni/component/options.rb +1 -1
  260. data/lib/arachni/component/options/address.rb +1 -1
  261. data/lib/arachni/component/options/base.rb +1 -1
  262. data/lib/arachni/component/options/bool.rb +1 -1
  263. data/lib/arachni/component/options/float.rb +1 -1
  264. data/lib/arachni/component/options/int.rb +1 -1
  265. data/lib/arachni/component/options/multiple_choice.rb +1 -1
  266. data/lib/arachni/component/options/object.rb +1 -1
  267. data/lib/arachni/component/options/path.rb +1 -1
  268. data/lib/arachni/component/options/port.rb +1 -1
  269. data/lib/arachni/component/options/string.rb +1 -1
  270. data/lib/arachni/component/options/url.rb +1 -1
  271. data/lib/arachni/component/output.rb +1 -1
  272. data/lib/arachni/component/utilities.rb +1 -1
  273. data/lib/arachni/data.rb +1 -1
  274. data/lib/arachni/data/framework.rb +1 -1
  275. data/lib/arachni/data/framework/rpc.rb +1 -1
  276. data/lib/arachni/data/issues.rb +1 -1
  277. data/lib/arachni/data/plugins.rb +1 -1
  278. data/lib/arachni/data/session.rb +1 -1
  279. data/lib/arachni/element/base.rb +19 -5
  280. data/lib/arachni/element/body.rb +1 -1
  281. data/lib/arachni/element/capabilities/analyzable.rb +1 -1
  282. data/lib/arachni/element/capabilities/analyzable/differential.rb +15 -5
  283. data/lib/arachni/element/capabilities/analyzable/signature.rb +147 -89
  284. data/lib/arachni/element/capabilities/analyzable/timeout.rb +43 -16
  285. data/lib/arachni/element/capabilities/auditable.rb +20 -15
  286. data/lib/arachni/element/capabilities/dom_only.rb +5 -4
  287. data/lib/arachni/element/capabilities/inputtable.rb +62 -12
  288. data/lib/arachni/element/capabilities/mutable.rb +74 -13
  289. data/lib/arachni/element/capabilities/refreshable.rb +1 -1
  290. data/lib/arachni/element/capabilities/submittable.rb +5 -2
  291. data/lib/arachni/element/capabilities/with_auditor.rb +1 -1
  292. data/lib/arachni/element/capabilities/with_auditor/output.rb +5 -5
  293. data/lib/arachni/element/capabilities/with_dom.rb +1 -1
  294. data/lib/arachni/element/capabilities/with_node.rb +2 -2
  295. data/lib/arachni/element/capabilities/with_scope.rb +1 -1
  296. data/lib/arachni/element/capabilities/with_scope/scope.rb +1 -1
  297. data/lib/arachni/element/capabilities/with_source.rb +4 -4
  298. data/lib/arachni/element/cookie.rb +57 -34
  299. data/lib/arachni/element/cookie/capabilities/inputtable.rb +1 -1
  300. data/lib/arachni/element/cookie/capabilities/mutable.rb +10 -1
  301. data/lib/arachni/element/cookie/capabilities/with_dom.rb +1 -1
  302. data/lib/arachni/element/cookie/dom.rb +1 -1
  303. data/lib/arachni/element/dom.rb +1 -15
  304. data/lib/arachni/element/dom/capabilities/auditable.rb +1 -1
  305. data/lib/arachni/element/dom/capabilities/inputtable.rb +1 -1
  306. data/lib/arachni/element/dom/capabilities/locatable.rb +29 -0
  307. data/lib/arachni/element/dom/capabilities/mutable.rb +11 -1
  308. data/lib/arachni/element/dom/capabilities/submittable.rb +2 -2
  309. data/lib/arachni/element/form.rb +33 -14
  310. data/lib/arachni/element/form/capabilities/auditable.rb +1 -1
  311. data/lib/arachni/element/form/capabilities/mutable.rb +18 -17
  312. data/lib/arachni/element/form/capabilities/submittable.rb +1 -1
  313. data/lib/arachni/element/form/capabilities/with_dom.rb +2 -1
  314. data/lib/arachni/element/form/dom.rb +3 -2
  315. data/lib/arachni/element/generic_dom.rb +1 -1
  316. data/lib/arachni/element/header.rb +16 -4
  317. data/lib/arachni/element/header/capabilities/inputtable.rb +1 -1
  318. data/lib/arachni/element/header/capabilities/mutable.rb +11 -1
  319. data/lib/arachni/element/json.rb +2 -2
  320. data/lib/arachni/element/json/capabilities/inputtable.rb +1 -1
  321. data/lib/arachni/element/json/capabilities/mutable.rb +8 -2
  322. data/lib/arachni/element/link.rb +14 -7
  323. data/lib/arachni/element/link/capabilities/auditable.rb +1 -1
  324. data/lib/arachni/element/link/capabilities/submittable.rb +1 -1
  325. data/lib/arachni/element/link/capabilities/with_dom.rb +8 -1
  326. data/lib/arachni/element/link/dom.rb +2 -1
  327. data/lib/arachni/element/link/dom/capabilities/submittable.rb +1 -1
  328. data/lib/arachni/element/link_template.rb +8 -3
  329. data/lib/arachni/element/link_template/capabilities/auditable.rb +1 -1
  330. data/lib/arachni/element/link_template/capabilities/inputtable.rb +1 -1
  331. data/lib/arachni/element/link_template/capabilities/with_dom.rb +1 -1
  332. data/lib/arachni/element/link_template/dom.rb +2 -1
  333. data/lib/arachni/element/link_template/dom/capabilities/submittable.rb +1 -1
  334. data/lib/arachni/element/path.rb +1 -1
  335. data/lib/arachni/element/server.rb +3 -3
  336. data/lib/arachni/element/ui_form.rb +24 -21
  337. data/lib/arachni/element/ui_form/dom.rb +12 -3
  338. data/lib/arachni/element/ui_input.rb +17 -11
  339. data/lib/arachni/element/{input → ui_input}/dom.rb +11 -2
  340. data/lib/arachni/element/xml.rb +3 -3
  341. data/lib/arachni/element/xml/capabilities/inputtable.rb +7 -1
  342. data/lib/arachni/element/xml/capabilities/mutable.rb +7 -13
  343. data/lib/arachni/element_filter.rb +1 -1
  344. data/lib/arachni/error.rb +1 -1
  345. data/lib/arachni/ethon/easy.rb +1 -1
  346. data/lib/arachni/framework.rb +2 -5
  347. data/lib/arachni/framework/parts/audit.rb +8 -2
  348. data/lib/arachni/framework/parts/browser.rb +8 -9
  349. data/lib/arachni/framework/parts/check.rb +2 -6
  350. data/lib/arachni/framework/parts/data.rb +23 -8
  351. data/lib/arachni/framework/parts/platform.rb +1 -1
  352. data/lib/arachni/framework/parts/plugin.rb +2 -8
  353. data/lib/arachni/framework/parts/report.rb +3 -9
  354. data/lib/arachni/framework/parts/scope.rb +1 -1
  355. data/lib/arachni/framework/parts/state.rb +8 -8
  356. data/lib/arachni/http.rb +1 -1
  357. data/lib/arachni/http/client.rb +72 -68
  358. data/lib/arachni/http/client/dynamic_404_handler.rb +85 -60
  359. data/lib/arachni/http/cookie_jar.rb +48 -27
  360. data/lib/arachni/http/headers.rb +4 -3
  361. data/lib/arachni/http/message.rb +17 -3
  362. data/lib/arachni/http/message/scope.rb +1 -1
  363. data/lib/arachni/http/proxy_server.rb +46 -344
  364. data/lib/arachni/http/proxy_server/connection.rb +316 -0
  365. data/lib/arachni/http/proxy_server/ssl_interceptor.rb +102 -0
  366. data/lib/arachni/http/proxy_server/tunnel.rb +54 -0
  367. data/lib/arachni/http/request.rb +126 -29
  368. data/lib/arachni/http/request/scope.rb +1 -1
  369. data/lib/arachni/http/response.rb +42 -12
  370. data/lib/arachni/http/response/scope.rb +1 -1
  371. data/lib/arachni/issue.rb +2 -2
  372. data/lib/arachni/issue/severity.rb +1 -1
  373. data/lib/arachni/issue/severity/base.rb +1 -1
  374. data/lib/arachni/option_group.rb +1 -1
  375. data/lib/arachni/option_groups.rb +1 -1
  376. data/lib/arachni/option_groups/audit.rb +20 -4
  377. data/lib/arachni/option_groups/browser_cluster.rb +8 -4
  378. data/lib/arachni/option_groups/datastore.rb +1 -1
  379. data/lib/arachni/option_groups/dispatcher.rb +1 -1
  380. data/lib/arachni/option_groups/http.rb +2 -2
  381. data/lib/arachni/option_groups/input.rb +6 -3
  382. data/lib/arachni/option_groups/output.rb +1 -1
  383. data/lib/arachni/option_groups/paths.rb +10 -3
  384. data/lib/arachni/option_groups/rpc.rb +1 -1
  385. data/lib/arachni/option_groups/scope.rb +35 -6
  386. data/lib/arachni/option_groups/session.rb +1 -1
  387. data/lib/arachni/option_groups/snapshot.rb +1 -1
  388. data/lib/arachni/options.rb +1 -1
  389. data/lib/arachni/page.rb +26 -12
  390. data/lib/arachni/page/dom.rb +29 -22
  391. data/lib/arachni/page/dom/transition.rb +2 -2
  392. data/lib/arachni/page/scope.rb +1 -1
  393. data/lib/arachni/parser.rb +42 -5
  394. data/lib/arachni/platform.rb +1 -1
  395. data/lib/arachni/platform/fingerprinter.rb +1 -1
  396. data/lib/arachni/platform/list.rb +1 -1
  397. data/lib/arachni/platform/manager.rb +2 -2
  398. data/lib/arachni/plugin.rb +1 -1
  399. data/lib/arachni/plugin/base.rb +1 -1
  400. data/lib/arachni/plugin/formatter.rb +1 -1
  401. data/lib/arachni/plugin/manager.rb +7 -13
  402. data/lib/arachni/processes.rb +1 -1
  403. data/lib/arachni/processes/dispatchers.rb +2 -2
  404. data/lib/arachni/processes/executables/base.rb +45 -4
  405. data/lib/arachni/processes/executables/browser.rb +91 -0
  406. data/lib/arachni/processes/executables/rest_service.rb +14 -0
  407. data/lib/arachni/processes/helpers.rb +1 -1
  408. data/lib/arachni/processes/helpers/dispatchers.rb +1 -1
  409. data/lib/arachni/processes/helpers/instances.rb +1 -1
  410. data/lib/arachni/processes/helpers/processes.rb +1 -1
  411. data/lib/arachni/processes/instances.rb +5 -5
  412. data/lib/arachni/processes/manager.rb +68 -9
  413. data/lib/arachni/report.rb +1 -1
  414. data/lib/arachni/reporter.rb +1 -1
  415. data/lib/arachni/reporter/base.rb +1 -1
  416. data/lib/arachni/reporter/formatter_manager.rb +4 -2
  417. data/lib/arachni/reporter/manager.rb +3 -2
  418. data/lib/arachni/reporter/options.rb +1 -1
  419. data/lib/arachni/rest/server.rb +231 -0
  420. data/lib/arachni/rest/server/instance_helpers.rb +37 -0
  421. data/lib/arachni/rpc/client/base.rb +1 -1
  422. data/lib/arachni/rpc/client/dispatcher.rb +1 -1
  423. data/lib/arachni/rpc/client/instance.rb +1 -1
  424. data/lib/arachni/rpc/client/instance/framework.rb +1 -1
  425. data/lib/arachni/rpc/client/instance/service.rb +1 -1
  426. data/lib/arachni/rpc/serializer.rb +1 -1
  427. data/lib/arachni/rpc/server/active_options.rb +20 -3
  428. data/lib/arachni/rpc/server/base.rb +1 -1
  429. data/lib/arachni/rpc/server/check/manager.rb +1 -1
  430. data/lib/arachni/rpc/server/dispatcher.rb +4 -4
  431. data/lib/arachni/rpc/server/dispatcher/node.rb +1 -1
  432. data/lib/arachni/rpc/server/dispatcher/service.rb +1 -1
  433. data/lib/arachni/rpc/server/framework.rb +3 -1
  434. data/lib/arachni/rpc/server/framework/distributor.rb +1 -1
  435. data/lib/arachni/rpc/server/framework/master.rb +1 -1
  436. data/lib/arachni/rpc/server/framework/multi_instance.rb +1 -1
  437. data/lib/arachni/rpc/server/framework/slave.rb +1 -1
  438. data/lib/arachni/rpc/server/instance.rb +1 -3
  439. data/lib/arachni/rpc/server/output.rb +1 -1
  440. data/lib/arachni/rpc/server/plugin/manager.rb +1 -1
  441. data/lib/arachni/ruby.rb +1 -2
  442. data/lib/arachni/ruby/array.rb +1 -1
  443. data/lib/arachni/ruby/hash.rb +1 -1
  444. data/lib/arachni/ruby/object.rb +15 -1
  445. data/lib/arachni/ruby/set.rb +1 -1
  446. data/lib/arachni/ruby/string.rb +23 -4
  447. data/lib/arachni/ruby/webrick.rb +1 -1
  448. data/lib/arachni/ruby/webrick/cookie.rb +1 -1
  449. data/lib/arachni/ruby/webrick/httprequest.rb +1 -1
  450. data/lib/arachni/scope.rb +1 -1
  451. data/lib/arachni/{watir → selenium/webdriver}/element.rb +12 -13
  452. data/lib/arachni/session.rb +19 -4
  453. data/lib/arachni/snapshot.rb +9 -5
  454. data/lib/arachni/state.rb +1 -1
  455. data/lib/arachni/state/audit.rb +1 -1
  456. data/lib/arachni/state/element_filter.rb +1 -1
  457. data/lib/arachni/state/framework.rb +1 -1
  458. data/lib/arachni/state/framework/rpc.rb +1 -1
  459. data/lib/arachni/state/http.rb +1 -1
  460. data/lib/arachni/state/options.rb +1 -1
  461. data/lib/arachni/state/plugins.rb +1 -1
  462. data/lib/arachni/support.rb +2 -1
  463. data/lib/arachni/support/buffer.rb +1 -1
  464. data/lib/arachni/support/buffer/autoflush.rb +1 -1
  465. data/lib/arachni/support/buffer/base.rb +1 -1
  466. data/lib/arachni/support/cache.rb +1 -1
  467. data/lib/arachni/support/cache/base.rb +20 -8
  468. data/lib/arachni/support/cache/least_cost_replacement.rb +1 -1
  469. data/lib/arachni/support/cache/least_recently_pushed.rb +1 -1
  470. data/lib/arachni/support/cache/least_recently_used.rb +8 -9
  471. data/lib/arachni/support/cache/preference.rb +7 -20
  472. data/lib/arachni/support/cache/random_replacement.rb +1 -1
  473. data/lib/arachni/support/crypto.rb +1 -1
  474. data/lib/arachni/support/crypto/rsa_aes_cbc.rb +1 -1
  475. data/lib/arachni/support/database.rb +1 -1
  476. data/lib/arachni/support/database/base.rb +2 -2
  477. data/lib/arachni/support/database/hash.rb +1 -1
  478. data/lib/arachni/support/database/queue.rb +1 -1
  479. data/lib/arachni/support/glob.rb +35 -0
  480. data/lib/arachni/support/lookup.rb +1 -1
  481. data/lib/arachni/support/lookup/base.rb +1 -1
  482. data/lib/arachni/support/lookup/hash_set.rb +1 -1
  483. data/lib/arachni/support/lookup/moolb.rb +1 -1
  484. data/lib/arachni/support/mixins.rb +1 -1
  485. data/lib/arachni/support/mixins/observable.rb +1 -1
  486. data/lib/arachni/support/mixins/terminal.rb +1 -1
  487. data/lib/arachni/support/profiler.rb +12 -10
  488. data/lib/arachni/support/signature.rb +12 -5
  489. data/lib/arachni/trainer.rb +18 -4
  490. data/lib/arachni/ui/foo/output.rb +17 -1
  491. data/lib/arachni/uri.rb +285 -203
  492. data/lib/arachni/uri/scope.rb +13 -2
  493. data/lib/arachni/utilities.rb +22 -5
  494. data/lib/arachni/version.rb +1 -1
  495. data/lib/version +1 -1
  496. data/spec/arachni/browser/element_locator_spec.rb +42 -14
  497. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +34 -304
  498. data/spec/arachni/browser/javascript/polyfills_spec.rb +35 -0
  499. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +24 -4
  500. data/spec/arachni/browser/javascript_spec.rb +92 -65
  501. data/spec/arachni/browser_cluster/job_spec.rb +3 -3
  502. data/spec/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/event_trigger/result_spec.rb +1 -1
  503. data/spec/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/event_trigger_spec.rb +4 -4
  504. data/spec/arachni/browser_cluster/jobs/{resource_exploration → dom_exploration}/result_spec.rb +1 -1
  505. data/spec/arachni/browser_cluster/jobs/{resource_exploration_spec.rb → dom_exploration_spec.rb} +4 -4
  506. data/spec/arachni/browser_cluster/jobs/taint_tracer_spec.rb +9 -9
  507. data/spec/arachni/browser_cluster/worker_spec.rb +46 -67
  508. data/spec/arachni/browser_cluster_spec.rb +19 -17
  509. data/spec/arachni/browser_spec.rb +506 -183
  510. data/spec/arachni/check/auditor_spec.rb +70 -25
  511. data/spec/arachni/component/manager_spec.rb +19 -20
  512. data/spec/arachni/data/framework/rpc_spec.rb +1 -1
  513. data/spec/arachni/data/framework_spec.rb +1 -1
  514. data/spec/arachni/data/issues_spec.rb +3 -3
  515. data/spec/arachni/element/capabilities/analyzable/differential_spec.rb +44 -0
  516. data/spec/arachni/element/capabilities/analyzable/signature_spec.rb +33 -162
  517. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +4 -4
  518. data/spec/arachni/element/cookie_spec.rb +98 -49
  519. data/spec/arachni/element/form/dom_spec.rb +1 -22
  520. data/spec/arachni/element/form_spec.rb +7 -7
  521. data/spec/arachni/element/header_spec.rb +2 -2
  522. data/spec/arachni/element/json_spec.rb +2 -2
  523. data/spec/arachni/element/link/dom_spec.rb +1 -22
  524. data/spec/arachni/element/link_spec.rb +17 -1
  525. data/spec/arachni/element/link_template/dom_spec.rb +1 -22
  526. data/spec/arachni/element/link_template_spec.rb +3 -3
  527. data/spec/arachni/element/ui_form/{ui_form_dom_spec.rb → dom_spec.rb} +72 -22
  528. data/spec/arachni/element/ui_form_spec.rb +1 -0
  529. data/spec/arachni/element/ui_input/dom_spec.rb +64 -22
  530. data/spec/arachni/element/ui_input_spec.rb +1 -0
  531. data/spec/arachni/element/xml_spec.rb +1 -0
  532. data/spec/arachni/framework/parts/audit_spec.rb +7 -5
  533. data/spec/arachni/framework/parts/browser_spec.rb +8 -8
  534. data/spec/arachni/framework/parts/check_spec.rb +1 -1
  535. data/spec/arachni/framework/parts/data_spec.rb +4 -4
  536. data/spec/arachni/framework/parts/scope_spec.rb +2 -2
  537. data/spec/arachni/framework_spec.rb +1 -1
  538. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +26 -13
  539. data/spec/arachni/http/client_spec.rb +80 -45
  540. data/spec/arachni/http/cookie_jar_spec.rb +6 -6
  541. data/spec/arachni/http/proxy_server_spec.rb +69 -66
  542. data/spec/arachni/http/request_spec.rb +147 -23
  543. data/spec/arachni/http/response/scope_spec.rb +12 -12
  544. data/spec/arachni/http/response_spec.rb +62 -4
  545. data/spec/arachni/issue_spec.rb +6 -6
  546. data/spec/arachni/option_groups/audit_spec.rb +25 -8
  547. data/spec/arachni/option_groups/browser_cluster_spec.rb +27 -1
  548. data/spec/arachni/option_groups/dispatcher_spec.rb +3 -3
  549. data/spec/arachni/option_groups/input_spec.rb +9 -9
  550. data/spec/arachni/option_groups/paths_spec.rb +2 -2
  551. data/spec/arachni/option_groups/scope_spec.rb +32 -16
  552. data/spec/arachni/options_spec.rb +4 -4
  553. data/spec/arachni/page/dom/transition_spec.rb +17 -10
  554. data/spec/arachni/page/dom_spec.rb +19 -0
  555. data/spec/arachni/page/scope_spec.rb +4 -4
  556. data/spec/arachni/page_spec.rb +15 -15
  557. data/spec/arachni/platform/manager_spec.rb +2 -2
  558. data/spec/arachni/plugin/base_spec.rb +1 -0
  559. data/spec/arachni/reporter/base_spec.rb +2 -2
  560. data/spec/arachni/reporter/manager_spec.rb +2 -2
  561. data/spec/arachni/rest/server_spec.rb +495 -0
  562. data/spec/arachni/rpc/server/active_options_spec.rb +63 -12
  563. data/spec/arachni/rpc/server/base_spec.rb +1 -1
  564. data/spec/arachni/rpc/server/framework/distributor_spec.rb +2 -2
  565. data/spec/arachni/rpc/server/framework_multi_spec.rb +6 -6
  566. data/spec/arachni/rpc/server/framework_spec.rb +4 -4
  567. data/spec/arachni/rpc/server/instance_spec.rb +24 -24
  568. data/spec/arachni/ruby/array_spec.rb +2 -2
  569. data/spec/arachni/ruby/string_spec.rb +52 -0
  570. data/spec/arachni/session_spec.rb +19 -2
  571. data/spec/arachni/snapshot_spec.rb +1 -1
  572. data/spec/arachni/state/audit_spec.rb +1 -1
  573. data/spec/arachni/state/framework_spec.rb +2 -2
  574. data/spec/arachni/support/cache/least_recently_used_spec.rb +0 -2
  575. data/spec/arachni/support/glob_spec.rb +75 -0
  576. data/spec/arachni/support/lookup/hash_set_spec.rb +1 -1
  577. data/spec/arachni/support/lookup/moolb_spec.rb +2 -2
  578. data/spec/arachni/support/signature_spec.rb +4 -4
  579. data/spec/arachni/trainer_spec.rb +48 -4
  580. data/spec/arachni/uri/scope_spec.rb +54 -10
  581. data/spec/arachni/uri_spec.rb +110 -89
  582. data/spec/arachni/utilities_spec.rb +8 -8
  583. data/spec/components/checks/active/code_injection_spec.rb +9 -9
  584. data/spec/components/checks/active/file_inclusion_spec.rb +20 -20
  585. data/spec/components/checks/active/ldap_injection_spec.rb +1 -1
  586. data/spec/components/checks/active/no_sql_injection_spec.rb +1 -1
  587. data/spec/components/checks/active/os_cmd_injection_spec.rb +3 -3
  588. data/spec/components/checks/active/path_traversal_spec.rb +11 -11
  589. data/spec/components/checks/active/response_splitting_spec.rb +2 -2
  590. data/spec/components/checks/active/rfi_spec.rb +3 -3
  591. data/spec/components/checks/active/session_fixation_spec.rb +1 -1
  592. data/spec/components/checks/active/source_code_disclosure_spec.rb +4 -4
  593. data/spec/components/checks/active/sql_injection_spec.rb +58 -59
  594. data/spec/components/checks/active/unvalidated_redirect_spec.rb +2 -2
  595. data/spec/components/checks/active/xpath_injection_spec.rb +3 -3
  596. data/spec/components/checks/active/xss_dom_script_context_spec.rb +1 -1
  597. data/spec/components/checks/active/xss_dom_spec.rb +1 -1
  598. data/spec/components/checks/active/xss_script_context_spec.rb +5 -5
  599. data/spec/components/checks/active/xss_spec.rb +5 -5
  600. data/spec/components/checks/passive/grep/credit_card_spec.rb +1 -1
  601. data/spec/components/checks/passive/grep/emails_spec.rb +12 -2
  602. data/spec/components/checks/passive/grep/ssn_spec.rb +1 -1
  603. data/spec/components/path_extractors/meta_refresh_spec.rb +3 -1
  604. data/spec/components/plugins/exec_spec.rb +2 -2
  605. data/spec/components/plugins/login_script_spec.rb +22 -2
  606. data/spec/components/plugins/vector_feed_spec.rb +3 -3
  607. data/spec/spec_helper.rb +10 -4
  608. data/spec/support/factories/browser_cluster/job.rb +1 -0
  609. data/spec/support/fixtures/check_with_invalid_platforms/with_invalid_platforms.rb +1 -1
  610. data/spec/support/fixtures/checks/test.rb +1 -1
  611. data/spec/support/fixtures/checks/test2.rb +1 -1
  612. data/spec/support/fixtures/checks/test3.rb +1 -1
  613. data/spec/support/fixtures/fingerprinters/test.rb +1 -1
  614. data/spec/support/fixtures/plugins/bad.rb +1 -1
  615. data/spec/support/fixtures/plugins/defaults/default.rb +1 -1
  616. data/spec/support/fixtures/plugins/distributable.rb +1 -1
  617. data/spec/support/fixtures/plugins/loop.rb +1 -1
  618. data/spec/support/fixtures/plugins/suspendable.rb +1 -1
  619. data/spec/support/fixtures/plugins/wait.rb +1 -1
  620. data/spec/support/fixtures/plugins/with_options.rb +1 -1
  621. data/spec/support/fixtures/plugins_with_priorities/p0.rb +1 -1
  622. data/spec/support/fixtures/plugins_with_priorities/p00.rb +1 -1
  623. data/spec/support/fixtures/plugins_with_priorities/p1.rb +1 -1
  624. data/spec/support/fixtures/plugins_with_priorities/p2.rb +1 -1
  625. data/spec/support/fixtures/plugins_with_priorities/p22.rb +1 -1
  626. data/spec/support/fixtures/plugins_with_priorities/p222.rb +1 -1
  627. data/spec/support/fixtures/plugins_with_priorities/p_nil.rb +1 -1
  628. data/spec/support/fixtures/plugins_with_priorities/p_nil2.rb +1 -1
  629. data/spec/support/fixtures/report.afr +0 -0
  630. data/spec/support/fixtures/reporters/base_spec/plugin_formatters/with_formatters/foobar.rb +1 -1
  631. data/spec/support/fixtures/reporters/base_spec/with_formatters.rb +1 -1
  632. data/spec/support/fixtures/reporters/base_spec/with_outfile.rb +1 -1
  633. data/spec/support/fixtures/reporters/base_spec/without_outfile.rb +1 -1
  634. data/spec/support/fixtures/reporters/manager_spec/afr.rb +1 -1
  635. data/spec/support/fixtures/reporters/manager_spec/error.rb +1 -1
  636. data/spec/support/fixtures/reporters/manager_spec/foo.rb +1 -1
  637. data/spec/support/fixtures/run_check/body.rb +1 -1
  638. data/spec/support/fixtures/run_check/cookies.rb +1 -1
  639. data/spec/support/fixtures/run_check/empty.rb +1 -1
  640. data/spec/support/fixtures/run_check/flch.rb +1 -1
  641. data/spec/support/fixtures/run_check/forms.rb +1 -1
  642. data/spec/support/fixtures/run_check/headers.rb +1 -1
  643. data/spec/support/fixtures/run_check/links.rb +1 -1
  644. data/spec/support/fixtures/run_check/nil.rb +1 -1
  645. data/spec/support/fixtures/run_check/path.rb +1 -1
  646. data/spec/support/fixtures/run_check/server.rb +1 -1
  647. data/spec/support/fixtures/signature_check/signature.rb +1 -1
  648. data/spec/support/fixtures/wait_check/wait.rb +1 -1
  649. data/spec/support/helpers/framework.rb +1 -1
  650. data/spec/support/helpers/misc.rb +1 -1
  651. data/spec/support/helpers/paths.rb +1 -1
  652. data/spec/support/helpers/request_helpers.rb +38 -0
  653. data/spec/support/helpers/requires.rb +1 -1
  654. data/spec/support/helpers/resets.rb +1 -1
  655. data/spec/support/helpers/web_server.rb +1 -1
  656. data/spec/support/lib/factory.rb +1 -1
  657. data/spec/support/lib/web_server_client.rb +1 -1
  658. data/spec/support/lib/web_server_dispatcher.rb +1 -1
  659. data/spec/support/lib/web_server_manager.rb +2 -2
  660. data/spec/support/servers/arachni/browser.rb +182 -15
  661. data/spec/support/servers/arachni/browser/javascript/angular-1.2.8.js +1 -1
  662. data/spec/support/servers/arachni/browser/javascript/angular-route.js +1 -1
  663. data/spec/support/servers/arachni/browser/javascript/dom_monitor.rb +27 -4
  664. data/spec/support/servers/arachni/element/capabilities/analyzable/differential.rb +103 -0
  665. data/spec/support/servers/arachni/element/capabilities/analyzable/timeout.rb +5 -2
  666. data/spec/support/servers/arachni/element/header.rb +1 -1
  667. data/spec/support/servers/arachni/http/client.rb +46 -0
  668. data/spec/support/servers/arachni/http/client/dynamic_404_handler.rb +7 -1
  669. data/spec/support/servers/checks/active/code_injection.rb +5 -5
  670. data/spec/support/servers/checks/active/no_sql_injection.rb +0 -6
  671. data/spec/support/servers/checks/active/no_sql_injection_differential.rb +1 -1
  672. data/spec/support/servers/checks/active/sql_injection.rb +5 -2
  673. data/spec/support/servers/checks/active/sql_injection_differential.rb +1 -1
  674. data/spec/support/servers/checks/active/trainer_check.rb +6 -6
  675. data/spec/support/servers/checks/passive/backdoors.rb +1 -0
  676. data/spec/support/servers/checks/passive/backup_directories.rb +2 -0
  677. data/spec/support/servers/checks/passive/backup_files.rb +2 -0
  678. data/spec/support/servers/checks/passive/grep/emails.rb +6 -6
  679. data/spec/support/shared/check.rb +28 -0
  680. data/spec/support/shared/element/capabilities/auditable.rb +76 -13
  681. data/spec/support/shared/element/capabilities/dom_only.rb +5 -6
  682. data/spec/support/shared/element/capabilities/inputtable.rb +74 -4
  683. data/spec/support/shared/element/capabilities/mutable.rb +86 -14
  684. data/spec/support/shared/element/capabilities/submittable.rb +12 -0
  685. data/spec/support/shared/element/capabilities/with_dom.rb +13 -4
  686. data/spec/support/shared/element/capabilities/with_node.rb +1 -1
  687. data/spec/support/shared/element/capabilities/with_source.rb +1 -6
  688. data/spec/support/shared/element/dom/locatable.rb +20 -0
  689. data/spec/support/shared/element/dom/submittable.rb +4 -17
  690. data/spec/support/shared/http/message.rb +37 -5
  691. data/spec/support/shared/support/cache.rb +5 -4
  692. data/ui/cli/framework.rb +4 -3
  693. data/ui/cli/framework/option_parser.rb +20 -8
  694. data/ui/cli/option_parser.rb +1 -1
  695. data/ui/cli/output.rb +40 -4
  696. data/ui/cli/reporter.rb +1 -1
  697. data/ui/cli/reporter/option_parser.rb +4 -4
  698. data/ui/cli/rest/server.rb +43 -0
  699. data/ui/cli/rest/server/option_parser.rb +115 -0
  700. data/ui/cli/restored_framework.rb +1 -1
  701. data/ui/cli/restored_framework/option_parser.rb +1 -1
  702. data/ui/cli/rpc/client/dispatcher_monitor.rb +1 -1
  703. data/ui/cli/rpc/client/dispatcher_monitor/option_parser.rb +1 -1
  704. data/ui/cli/rpc/client/instance.rb +1 -1
  705. data/ui/cli/rpc/client/local.rb +1 -1
  706. data/ui/cli/rpc/client/local/option_parser.rb +1 -1
  707. data/ui/cli/rpc/client/remote.rb +1 -1
  708. data/ui/cli/rpc/client/remote/option_parser.rb +1 -1
  709. data/ui/cli/rpc/server/dispatcher.rb +1 -1
  710. data/ui/cli/rpc/server/dispatcher/option_parser.rb +1 -1
  711. data/ui/cli/utilities.rb +1 -1
  712. metadata +197 -84
  713. data/components/checks/active/no_sql_injection/patterns/mongodb +0 -1
  714. data/components/checks/active/no_sql_injection/regexp_ignore.txt +0 -0
  715. data/components/checks/active/sql_injection/patterns/access +0 -3
  716. data/components/checks/active/sql_injection/patterns/db2 +0 -5
  717. data/components/checks/active/sql_injection/patterns/frontbase +0 -1
  718. data/components/checks/active/sql_injection/patterns/hsqldb +0 -1
  719. data/components/checks/active/sql_injection/patterns/ingres +0 -3
  720. data/components/checks/active/sql_injection/patterns/maxdb +0 -2
  721. data/components/checks/active/sql_injection/patterns/mssql +0 -25
  722. data/components/checks/active/sql_injection/patterns/oracle +0 -6
  723. data/components/checks/active/sql_injection/patterns/sqlite +0 -5
  724. data/components/checks/active/sql_injection/patterns/sybase +0 -3
  725. data/lib/arachni/ruby/io.rb +0 -39
  726. data/lib/arachni/selenium/webdriver/remote/http/typhoeus.rb +0 -63
  727. data/spec/arachni/ruby/io_spec.rb +0 -26
@@ -7,6 +7,8 @@ get '/' do
7
7
  HTML
8
8
  end
9
9
 
10
+ get( '/some_filename.php' ){}
11
+
10
12
  current_check.formats.each do |format|
11
13
  path = format.gsub( '[name]', 'some_filename' ).gsub( '[extension]', 'php' )
12
14
  get '/' + path do
@@ -2,12 +2,12 @@ require 'sinatra'
2
2
  require 'sinatra/contrib'
3
3
 
4
4
  ADDRESSES = [
5
- 'tasos@blah.com',
6
- 'john@foo.blah.com',
7
- 'john32.21d@foo.blah.com',
8
- 'a.little.more.unusual@dept.example.com',
9
- 'a.little.more.unusual[at]dept[dot]example[dot]com',
10
- 'a.little.more.unusual [at] dept [dot] example [dot] com'
5
+ 'tasos@does.not.exist.com',
6
+ 'tasos@example.com',
7
+ 'john@www.example.com',
8
+ 'john32.21d@example.com',
9
+ 'a.little.more.unusual@example.com',
10
+ 'a.little.more.unusual[at]example[dot]com'
11
11
  ]
12
12
 
13
13
  ADDRESSES.each.with_index do |address, i|
@@ -26,8 +26,10 @@ shared_examples_for 'check' do
26
26
  framework.http.headers['User-Agent'] = 'arachni_user'
27
27
 
28
28
  options.audit.parameter_names = true
29
+ options.audit.with_raw_payloads = true
29
30
  options.audit.with_extra_parameter = true
30
31
 
32
+ framework.checks.clear
31
33
  framework.checks.load @name
32
34
 
33
35
  # Do not deduplicate, the check tests need to see everything.
@@ -61,6 +63,32 @@ shared_examples_for 'check' do
61
63
  it 'holds the right elements' do
62
64
  expect(current_check.info[:elements].map(&:to_s).sort).to eq(self.class.elements.map(&:to_s).sort)
63
65
  end
66
+
67
+ context 'when it has references' do
68
+ it 'they are still available' do
69
+ if !(current_check.info[:issue] && current_check.info[:issue][:references])
70
+ next
71
+ end
72
+
73
+ hydra = Typhoeus::Hydra.new
74
+
75
+ current_check.info[:issue][:references].each do |title, url|
76
+ r = Typhoeus::Request.new(
77
+ url,
78
+ followlocation: true,
79
+ headers: {
80
+ 'User-Agent' => 'Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0'
81
+ }
82
+ )
83
+ r.on_complete do |response|
84
+ expect(response.code).to eq(200), "#{response.code} -- #{title} => #{url}"
85
+ end
86
+ hydra.queue r
87
+ end
88
+
89
+ hydra.run
90
+ end
91
+ end
64
92
  end
65
93
 
66
94
  def self.easy_test( run_checks = true, &block )
@@ -224,8 +224,71 @@ shared_examples_for 'auditable' do
224
224
  end
225
225
  end
226
226
 
227
+ context ':submit' do
228
+ it 'forwards :raw_parameters',
229
+ if: !described_class.ancestors.include?( Arachni::Element::DOM ) do
230
+
231
+ param = auditable.inputs.keys.first
232
+ raw_parameters = nil
233
+
234
+ auditable.audit(
235
+ 'stuff',
236
+ format: [ Arachni::Check::Auditor::Format::STRAIGHT ],
237
+ submit: {
238
+ raw_parameters: [ param ]
239
+ },
240
+ skip_original: true
241
+ ) do |response, _|
242
+ raw_parameters = response.request.raw_parameters
243
+ end
244
+
245
+ run
246
+
247
+ expect(raw_parameters).to eq [param]
248
+ end
249
+ end
250
+
251
+ context 'when the response is out of scope' do
252
+ it 'ignores it' do
253
+ called = nil
254
+
255
+ allow_any_instance_of(Arachni::HTTP::Response::Scope).to receive(:out?).and_return(true)
256
+ allow_any_instance_of(Arachni::Page::Scope).to receive(:out?).and_return(true)
257
+
258
+ auditable.audit( 'stuff',
259
+ format: [ Arachni::Check::Auditor::Format::STRAIGHT ],
260
+ skip_original: true
261
+ ) do |_, element|
262
+ called = true
263
+ end
264
+
265
+ run
266
+ expect(called).to be_falsey
267
+ end
268
+
269
+ context 'but the host includes the seed' do
270
+ it 'does not log the issue' do
271
+ called = nil
272
+
273
+ allow_any_instance_of(Arachni::HTTP::Response::Scope).to receive(:out?).and_return(true)
274
+ allow_any_instance_of(Arachni::Page::Scope).to receive(:out?).and_return(true)
275
+ allow_any_instance_of(Arachni::URI).to receive(:seed_in_host?).and_return(true)
276
+
277
+ auditable.audit( 'stuff',
278
+ format: [ Arachni::Check::Auditor::Format::STRAIGHT ],
279
+ skip_original: true
280
+ ) do |_, element|
281
+ called = true
282
+ end
283
+
284
+ run
285
+ expect(called).to be_truthy
286
+ end
287
+ end
288
+ end
289
+
227
290
  context 'when the payloads is' do
228
- context String do
291
+ context 'String' do
229
292
  it 'injects the given payload' do
230
293
  payload = 'stuff-here'
231
294
  injected = nil
@@ -258,7 +321,7 @@ shared_examples_for 'auditable' do
258
321
  end
259
322
  end
260
323
  end
261
- context Array do
324
+ context 'Array' do
262
325
  it 'injects all supplied payload' do
263
326
  payloads = [ 'stuff-here', 'stuff-here-2' ]
264
327
  injected = []
@@ -290,7 +353,7 @@ shared_examples_for 'auditable' do
290
353
  end
291
354
  end
292
355
 
293
- context Hash do
356
+ context 'Hash' do
294
357
  it 'picks payloads applicable to the resource\'s platforms' do
295
358
  payloads = {
296
359
  linux: [ 'linux-payload-1', 'linux-payload-2' ],
@@ -396,7 +459,7 @@ shared_examples_for 'auditable' do
396
459
  end
397
460
 
398
461
  context 'when called with option' do
399
- describe :submit do
462
+ describe ':submit' do
400
463
  it 'uses them for the #submit call' do
401
464
  options = { cookies: { stuff: 'blah' }}
402
465
 
@@ -411,7 +474,7 @@ shared_examples_for 'auditable' do
411
474
  end
412
475
  end
413
476
 
414
- describe :each_mutation do
477
+ describe ':each_mutation' do
415
478
  it 'is passed each generated mutation' do
416
479
  skip if !has_parameter_extractor?
417
480
 
@@ -482,8 +545,8 @@ shared_examples_for 'auditable' do
482
545
  end
483
546
  end
484
547
 
485
- describe :skip_like do
486
- describe Proc do
548
+ describe ':skip_like' do
549
+ describe 'Proc' do
487
550
  it 'skips mutations based on the block\'s return value' do
488
551
  audited = []
489
552
  skip_like = proc { |m| m.affected_input_name != auditable.inputs.keys.first }
@@ -500,7 +563,7 @@ shared_examples_for 'auditable' do
500
563
  end
501
564
  end
502
565
 
503
- describe Array do
566
+ describe 'Array' do
504
567
  it 'skips mutations based on the blocks\' return value' do
505
568
  audited = []
506
569
  skip_like = []
@@ -519,7 +582,7 @@ shared_examples_for 'auditable' do
519
582
  end
520
583
  end
521
584
 
522
- describe :format do
585
+ describe ':format' do
523
586
  describe 'Arachni::Check::Auditor::Format::STRAIGHT' do
524
587
  it 'injects the seed as is' do
525
588
  skip if !has_parameter_extractor?
@@ -601,7 +664,7 @@ shared_examples_for 'auditable' do
601
664
  end
602
665
  end
603
666
 
604
- describe :redundant do
667
+ describe ':redundant' do
605
668
  before do
606
669
  @audit_opts = {
607
670
  format: [ Arachni::Check::Auditor::Format::STRAIGHT ],
@@ -609,7 +672,7 @@ shared_examples_for 'auditable' do
609
672
  }
610
673
  end
611
674
 
612
- context true do
675
+ context 'true' do
613
676
  it 'allows redundant audits' do
614
677
  cnt = 0
615
678
  5.times do |i|
@@ -620,7 +683,7 @@ shared_examples_for 'auditable' do
620
683
  end
621
684
  end
622
685
 
623
- context false do
686
+ context 'false' do
624
687
  it 'does not allow redundant requests/audits' do
625
688
  cnt = 0
626
689
  5.times do |i|
@@ -689,7 +752,7 @@ shared_examples_for 'auditable' do
689
752
  end
690
753
 
691
754
  context "when #{described_class::Scope}#out?" do
692
- context true do
755
+ context 'true' do
693
756
  it 'returns immediately' do
694
757
  allow_any_instance_of(described_class::Scope).to receive(:out?) { true }
695
758
 
@@ -38,21 +38,20 @@ shared_examples_for 'dom_only' do |source|
38
38
  describe '#coverage_id' do
39
39
  it 'delegates to #dom' do
40
40
  allow(subject.dom).to receive(:coverage_id).and_return( 'stuff' )
41
- expect(subject.coverage_id).to eq 'stuff'
41
+ expect(subject.coverage_id).to eq "#{described_class.type}:stuff"
42
42
  end
43
43
  end
44
44
 
45
45
  describe '#coverage_hash' do
46
- it 'delegates to #dom' do
47
- allow(subject.dom).to receive(:coverage_hash).and_return( 123 )
48
- expect(subject.coverage_hash).to eq 123
46
+ it 'hashes #coverage_id' do
47
+ expect(subject.coverage_hash).to eq subject.coverage_id.persistent_hash
49
48
  end
50
49
  end
51
50
 
52
51
  describe '#id' do
53
52
  it 'delegates to #dom' do
54
- allow(subject.dom).to receive(:id).and_return( '123' )
55
- expect(subject.id).to eq '123'
53
+ allow(subject.dom).to receive(:id).and_return( 'stuff' )
54
+ expect(subject.id).to eq "#{described_class.type}:stuff"
56
55
  end
57
56
  end
58
57
 
@@ -52,7 +52,7 @@ shared_examples_for 'inputtable' do |options = {}|
52
52
  describe '#to_rpc_data' do
53
53
  let(:data) { subject.to_rpc_data }
54
54
 
55
- %w(inputs default_inputs).each do |attribute|
55
+ %w(inputs default_inputs raw_inputs).each do |attribute|
56
56
  it "includes '#{attribute}'" do
57
57
  expect(data[attribute]).to eq(subject.send( attribute ))
58
58
  end
@@ -63,7 +63,7 @@ shared_examples_for 'inputtable' do |options = {}|
63
63
  let(:restored) { subject.class.from_rpc_data data }
64
64
  let(:data) { Arachni::RPC::Serializer.rpc_data( subject ) }
65
65
 
66
- %w(inputs default_inputs).each do |attribute|
66
+ %w(inputs default_inputs raw_inputs).each do |attribute|
67
67
  it "restores '#{attribute}'" do
68
68
  expect(restored.send( attribute )).to eq(subject.send( attribute ))
69
69
  end
@@ -76,6 +76,7 @@ shared_examples_for 'inputtable' do |options = {}|
76
76
 
77
77
  k, v = orig.inputs.keys.first, 'value'
78
78
 
79
+ subject.raw_inputs << k
79
80
  subject.update( k => v )
80
81
 
81
82
  expect(subject.inputs).not_to eq(orig.inputs)
@@ -83,6 +84,7 @@ shared_examples_for 'inputtable' do |options = {}|
83
84
  subject.reset
84
85
 
85
86
  expect(subject.inputs).to eq(orig.inputs)
87
+ expect(subject.raw_inputs).to be_empty
86
88
  end
87
89
  end
88
90
 
@@ -110,7 +112,7 @@ shared_examples_for 'inputtable' do |options = {}|
110
112
  end
111
113
  end
112
114
 
113
- context Array do
115
+ context 'Array' do
114
116
  context 'when it has the given inputs' do
115
117
  it 'returns true' do
116
118
  expect(subject.has_inputs?( sym_keys )).to be_truthy
@@ -125,7 +127,7 @@ shared_examples_for 'inputtable' do |options = {}|
125
127
  end
126
128
  end
127
129
 
128
- context Hash do
130
+ context 'Hash' do
129
131
  context 'when it has the given inputs (names and values)' do
130
132
  it 'returns true' do
131
133
  expect(subject.has_inputs?( subject.inputs )).to be_truthy
@@ -173,6 +175,28 @@ shared_examples_for 'inputtable' do |options = {}|
173
175
  expect(e.inputtable_id).not_to eq(c.inputtable_id)
174
176
  end
175
177
 
178
+ it 'takes into account raw inputs' do
179
+ e = subject.dup
180
+ e.inputs = { 1 => 2, 3 => 4 }
181
+ e.raw_inputs = [1]
182
+
183
+ c = subject.dup
184
+ c.inputs = { 1 => 2, 3 => 4 }
185
+ c.raw_inputs = [1]
186
+
187
+ expect(e.inputtable_id).to eq(c.inputtable_id)
188
+
189
+ e = subject.dup
190
+ e.inputs = { 1 => 2, 3 => 4 }
191
+ e.raw_inputs = [1]
192
+
193
+ c = subject.dup
194
+ e.inputs = { 1 => 2, 3 => 4 }
195
+ e.raw_inputs = [2]
196
+
197
+ expect(e.inputtable_id).not_to eq(c.inputtable_id)
198
+ end
199
+
176
200
  it 'takes into account input values' do
177
201
  e = subject.dup
178
202
  e.inputs = { 1 => 2 }
@@ -202,6 +226,49 @@ shared_examples_for 'inputtable' do |options = {}|
202
226
  end
203
227
  end
204
228
 
229
+ describe '#raw_inputs=' do
230
+ it 'converts all inputs to strings' do
231
+ subject.raw_inputs = [valid_key.to_sym]
232
+ expect(subject.raw_inputs).to eq [valid_key.to_s]
233
+ end
234
+
235
+ context 'when a name contains invalid data' do
236
+ it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
237
+ allow(subject).to receive(:valid_input_data?) { |data| data != valid_key }
238
+
239
+ expect do
240
+ subject.raw_inputs = [ valid_key ]
241
+ end.to raise_error Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name
242
+ end
243
+ end
244
+
245
+ context 'when a name is invalid' do
246
+ it "raises #{Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name}" do
247
+ allow(subject).to receive(:valid_input_name?) { false }
248
+
249
+ expect do
250
+ subject.raw_inputs = [ valid_key ]
251
+ end.to raise_error Arachni::Element::Capabilities::Inputtable::Error::InvalidData::Name
252
+ end
253
+ end
254
+ end
255
+
256
+ describe '#raw_input?' do
257
+ context 'if the name is in #raw_inputs' do
258
+ it 'returns true' do
259
+ subject.raw_inputs = [valid_key]
260
+ expect(subject.raw_input?( valid_key )).to be_truthy
261
+ end
262
+ end
263
+
264
+ context 'if the name is not in #raw_inputs' do
265
+ it 'returns false' do
266
+ subject.raw_inputs = []
267
+ expect(subject.raw_input?( valid_key )).to be_falsey
268
+ end
269
+ end
270
+ end
271
+
205
272
  describe '#inputs=' do
206
273
  it 'assigns a hash of auditable inputs' do
207
274
  a = subject.dup
@@ -465,9 +532,12 @@ shared_examples_for 'inputtable' do |options = {}|
465
532
 
466
533
  describe '#to_h' do
467
534
  it 'returns a hash representation of self' do
535
+ subject.raw_inputs = [ subject.inputs.keys.first ]
536
+
468
537
  hash = subject.to_h
469
538
  expect(hash[:inputs]).to eq(subject.inputs)
470
539
  expect(hash[:default_inputs]).to eq(subject.default_inputs)
540
+ expect(hash[:raw_inputs]).to eq(subject.raw_inputs)
471
541
  end
472
542
  end
473
543
 
@@ -85,6 +85,26 @@ shared_examples_for 'mutable' do |options = {}|
85
85
  end
86
86
  end
87
87
 
88
+ describe '#with_raw_payload?' do
89
+ let(:mutation) do
90
+ mutable.mutations( seed ).first
91
+ end
92
+
93
+ context 'when #affected_input_name is in #raw_inputs' do
94
+ it 'returns true' do
95
+ mutation.raw_inputs << mutation.affected_input_name
96
+ expect(mutation).to be_with_raw_payload
97
+ end
98
+ end
99
+
100
+ context 'when #affected_input_name is not in #raw_inputs' do
101
+ it 'returns true' do
102
+ mutation.raw_inputs = []
103
+ expect(mutation).to_not be_with_raw_payload
104
+ end
105
+ end
106
+ end
107
+
88
108
  describe '#affected_input_value' do
89
109
  it 'returns the value of the affected_input_name input' do
90
110
  elem = mutable.mutations( seed ).first
@@ -155,15 +175,15 @@ shared_examples_for 'mutable' do |options = {}|
155
175
  end
156
176
 
157
177
  context 'with option' do
158
- describe :parameter_values do
159
- describe true do
178
+ describe ':parameter_values' do
179
+ describe 'true' do
160
180
  it 'injects the payload into parameter values' do
161
181
  expect(mutable.mutations( seed, parameter_values: true ).
162
182
  find { |m| m.affected_input_value.include? seed }).
163
183
  to be_truthy
164
184
  end
165
185
  end
166
- describe false do
186
+ describe 'false' do
167
187
  it 'does not inject the payload into parameter values' do
168
188
  expect(mutable.mutations( seed, parameter_values: false ).
169
189
  find { |m| m.affected_input_value.include? seed }).
@@ -193,7 +213,59 @@ shared_examples_for 'mutable' do |options = {}|
193
213
  end
194
214
  end
195
215
 
196
- describe :with_extra_parameter,
216
+ describe ':with_raw_payloads',
217
+ if: !described_class.ancestors.include?(
218
+ Arachni::Element::DOM
219
+ ) && described_class != Arachni::Element::JSON &&
220
+ described_class != Arachni::Element::XML &&
221
+ described_class != Arachni::Element::Header &&
222
+ described_class != Arachni::Element::Cookie do
223
+
224
+ describe 'true' do
225
+ it 'adds an unencoded payload' do
226
+ expect(
227
+ mutable.mutations( seed, with_raw_payloads: true ).
228
+ find(&:with_raw_payload?)
229
+ ).to be_truthy
230
+ end
231
+ end
232
+ describe 'false' do
233
+ it 'does not add an unencoded payload' do
234
+ expect(mutable.mutations( seed, with_raw_payloads: false ).find do |m|
235
+ next if !m.audit_options[:submit]
236
+
237
+ m.audit_options[:submit][:raw_parameters] &&
238
+ m.audit_options[:submit][:raw_parameters].include?( m.affected_input_name )
239
+ end).to be_falsey
240
+ end
241
+ end
242
+ describe 'nil' do
243
+ it 'does not add an unencoded payload' do
244
+ expect(mutable.mutations( seed ).find do |m|
245
+ next if !m.audit_options[:submit]
246
+
247
+ m.audit_options[:submit][:raw_parameters] &&
248
+ m.audit_options[:submit][:raw_parameters].include?( m.affected_input_name )
249
+ end).to be_falsey
250
+ end
251
+ end
252
+
253
+ describe "#{Arachni::OptionGroups::Audit}#with_raw_payloads" do
254
+ it 'serves as the default value of :with_raw_payloads' do
255
+ Arachni::Options.audit.with_raw_payloads = true
256
+ expect(
257
+ mutable.mutations( seed ).find(&:with_raw_payload?)
258
+ ).to be_truthy
259
+
260
+ Arachni::Options.audit.with_raw_payloads = false
261
+ expect(
262
+ mutable.mutations( seed ).find(&:with_raw_payload?)
263
+ ).to be_falsey
264
+ end
265
+ end
266
+ end
267
+
268
+ describe 'with_extra_parameter',
197
269
  if: !described_class.ancestors.include?(
198
270
  Arachni::Element::DOM
199
271
  ) && described_class != Arachni::Element::LinkTemplate &&
@@ -201,13 +273,13 @@ shared_examples_for 'mutable' do |options = {}|
201
273
 
202
274
  let(:extra_name) { described_class::EXTRA_NAME }
203
275
 
204
- describe true do
276
+ describe 'true' do
205
277
  it 'injects the payload into an extra parameter' do
206
278
  expect(mutable.mutations( seed, with_extra_parameter: true ).
207
279
  find { |m| m[extra_name].to_s.include? seed }).to be_truthy
208
280
  end
209
281
  end
210
- describe false do
282
+ describe 'false' do
211
283
  it 'does not inject the payload into an extra parameter' do
212
284
  expect(mutable.mutations( seed, with_extra_parameter: false ).
213
285
  find { |m| m[extra_name].to_s.include? seed }).to be_falsey
@@ -233,19 +305,19 @@ shared_examples_for 'mutable' do |options = {}|
233
305
  end
234
306
  end
235
307
 
236
- describe :with_both_http_methods,
308
+ describe 'with_both_http_methods',
237
309
  if: !described_class.ancestors.include?(
238
310
  Arachni::Element::DOM
239
311
  ) && described_class != Arachni::Element::JSON &&
240
312
  described_class != Arachni::Element::XML do
241
313
 
242
- describe false do
314
+ describe 'false' do
243
315
  it 'does not fuzz methods' do
244
316
  expect(mutable.mutations( seed, with_both_http_methods: false ).
245
317
  map(&:method).uniq).to eq [mutable.method]
246
318
  end
247
319
  end
248
- describe true do
320
+ describe 'true' do
249
321
  it 'fuzzes methods' do
250
322
  expect(mutable.mutations( seed, with_both_http_methods: true ).
251
323
  map(&:method).uniq).to eq [:get, :post]
@@ -271,19 +343,19 @@ shared_examples_for 'mutable' do |options = {}|
271
343
  end
272
344
  end
273
345
 
274
- describe :parameter_names,
346
+ describe 'parameter_names',
275
347
  if: !described_class.ancestors.include?( Arachni::Element::DOM) &&
276
348
  described_class != Arachni::Element::LinkTemplate &&
277
349
  described_class != Arachni::Element::XML do
278
350
 
279
- describe true do
351
+ describe 'true' do
280
352
  it 'uses the seed as a parameter name' do
281
353
  expect(mutable.mutations( seed, parameter_names: true ).
282
354
  find { |m| m.inputs.keys.include? seed }).
283
355
  to be_truthy
284
356
  end
285
357
  end
286
- describe false do
358
+ describe 'false' do
287
359
  it 'does not use the seed as a parameter name' do
288
360
  allow_any_instance_of(mutable.class).
289
361
  to receive(:valid_input_name_data?) { |instance, name| name != seed }
@@ -319,13 +391,13 @@ shared_examples_for 'mutable' do |options = {}|
319
391
  end
320
392
  end
321
393
 
322
- describe :skip do
394
+ describe ':skip' do
323
395
  it 'skips mutation of parameters with these names' do
324
396
  mutable.mutations( seed, skip: [ 'input_one' ] )
325
397
  end
326
398
  end
327
399
 
328
- describe :format do
400
+ describe ':format' do
329
401
  describe 'Format::STRAIGHT' do
330
402
  it 'injects the seed as is' do
331
403
  m = mutable.mutations( seed,