arachni 1.1 → 1.2

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 (287) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +159 -0
  3. data/LICENSE.md +126 -196
  4. data/README.md +32 -24
  5. data/arachni.gemspec +7 -7
  6. data/components/checks/active/code_injection_timing.rb +3 -3
  7. data/components/checks/active/csrf.rb +2 -2
  8. data/components/checks/active/file_inclusion.rb +6 -7
  9. data/components/checks/active/os_cmd_injection.rb +3 -3
  10. data/components/checks/active/path_traversal.rb +7 -7
  11. data/components/checks/active/response_splitting.rb +9 -4
  12. data/components/checks/active/session_fixation.rb +7 -3
  13. data/components/checks/active/source_code_disclosure.rb +5 -5
  14. data/components/checks/active/unvalidated_redirect.rb +12 -3
  15. data/components/checks/active/unvalidated_redirect_dom.rb +3 -3
  16. data/components/checks/active/xss.rb +23 -10
  17. data/components/checks/active/xss_dom_inputs.rb +113 -11
  18. data/components/checks/active/xxe.rb +3 -3
  19. data/components/checks/passive/backdoors.rb +6 -5
  20. data/components/checks/passive/backup_directories.rb +6 -6
  21. data/components/checks/passive/backup_files.rb +6 -6
  22. data/components/checks/passive/common_admin_interfaces.rb +58 -0
  23. data/components/checks/passive/common_admin_interfaces/admin-panels.txt +49 -0
  24. data/components/checks/passive/common_directories/directories.txt +0 -16
  25. data/components/checks/passive/common_files.rb +6 -5
  26. data/components/checks/passive/common_files/filenames.txt +0 -2
  27. data/components/checks/passive/directory_listing.rb +6 -6
  28. data/components/checks/passive/grep/cookie_set_for_parent_domain.rb +3 -3
  29. data/components/checks/passive/grep/hsts.rb +6 -3
  30. data/components/checks/passive/grep/http_only_cookies.rb +3 -3
  31. data/components/checks/passive/grep/insecure_cookies.rb +2 -2
  32. data/components/checks/passive/grep/insecure_cors_policy.rb +6 -4
  33. data/components/checks/passive/grep/x_frame_options.rb +6 -4
  34. data/components/checks/passive/htaccess_limit.rb +6 -2
  35. data/components/checks/passive/http_put.rb +8 -4
  36. data/components/checks/passive/interesting_responses.rb +3 -2
  37. data/components/checks/passive/localstart_asp.rb +6 -2
  38. data/components/checks/passive/origin_spoof_access_restriction_bypass.rb +5 -1
  39. data/components/checks/passive/xst.rb +6 -2
  40. data/components/fingerprinters/frameworks/aspx_mvc.rb +43 -0
  41. data/components/fingerprinters/frameworks/cakephp.rb +28 -0
  42. data/components/fingerprinters/frameworks/cherrypy.rb +31 -0
  43. data/components/fingerprinters/frameworks/django.rb +33 -0
  44. data/components/fingerprinters/frameworks/jsf.rb +30 -0
  45. data/components/fingerprinters/frameworks/rack.rb +5 -7
  46. data/components/fingerprinters/frameworks/rails.rb +43 -0
  47. data/components/fingerprinters/languages/aspx.rb +11 -11
  48. data/components/fingerprinters/languages/{jsp.rb → java.rb} +11 -7
  49. data/components/fingerprinters/languages/php.rb +6 -6
  50. data/components/fingerprinters/languages/python.rb +14 -6
  51. data/components/fingerprinters/languages/ruby.rb +3 -5
  52. data/components/fingerprinters/servers/apache.rb +5 -4
  53. data/components/fingerprinters/servers/gunicorn.rb +33 -0
  54. data/components/fingerprinters/servers/jetty.rb +1 -1
  55. data/components/fingerprinters/servers/tomcat.rb +11 -4
  56. data/components/path_extractors/anchors.rb +5 -12
  57. data/components/path_extractors/areas.rb +5 -13
  58. data/components/path_extractors/comments.rb +5 -3
  59. data/components/path_extractors/data_url.rb +21 -0
  60. data/components/path_extractors/forms.rb +5 -13
  61. data/components/path_extractors/frames.rb +6 -13
  62. data/components/path_extractors/generic.rb +3 -12
  63. data/components/path_extractors/links.rb +5 -13
  64. data/components/path_extractors/meta_refresh.rb +5 -13
  65. data/components/path_extractors/scripts.rb +8 -14
  66. data/components/plugins/autologin.rb +17 -5
  67. data/components/plugins/defaults/meta/remedies/discovery.rb +11 -29
  68. data/components/plugins/login_script.rb +40 -10
  69. data/components/plugins/metrics.rb +235 -0
  70. data/components/plugins/proxy.rb +21 -4
  71. data/components/plugins/proxy/panel/page_accordion.html.erb +34 -2
  72. data/components/plugins/restrict_to_dom_state.rb +70 -0
  73. data/components/plugins/vector_feed.rb +38 -9
  74. data/components/reporters/plugin_formatters/html/metrics.rb +290 -0
  75. data/components/reporters/plugin_formatters/stdout/metrics.rb +80 -0
  76. data/components/reporters/plugin_formatters/xml/metrics.rb +29 -0
  77. data/components/reporters/stdout.rb +4 -2
  78. data/components/reporters/xml.rb +4 -4
  79. data/components/reporters/xml/schema.xsd +95 -0
  80. data/lib/arachni.rb +2 -0
  81. data/lib/arachni/browser.rb +132 -77
  82. data/lib/arachni/browser/javascript.rb +173 -45
  83. data/lib/arachni/browser/javascript/scripts/dom_monitor.js +81 -6
  84. data/lib/arachni/browser/javascript/scripts/taint_tracer.js +31 -3
  85. data/lib/arachni/browser_cluster.rb +41 -15
  86. data/lib/arachni/browser_cluster/job.rb +4 -0
  87. data/lib/arachni/browser_cluster/jobs/resource_exploration.rb +0 -9
  88. data/lib/arachni/browser_cluster/worker.rb +8 -5
  89. data/lib/arachni/check/auditor.rb +20 -8
  90. data/lib/arachni/check/base.rb +38 -6
  91. data/lib/arachni/element/base.rb +18 -1
  92. data/lib/arachni/element/capabilities/analyzable/differential.rb +0 -1
  93. data/lib/arachni/element/capabilities/analyzable/taint.rb +40 -10
  94. data/lib/arachni/element/capabilities/analyzable/timeout.rb +27 -23
  95. data/lib/arachni/element/capabilities/auditable/dom.rb +22 -0
  96. data/lib/arachni/element/capabilities/inputtable.rb +6 -2
  97. data/lib/arachni/element/capabilities/submittable.rb +1 -1
  98. data/lib/arachni/element/cookie.rb +37 -23
  99. data/lib/arachni/element/cookie/capabilities/mutable.rb +6 -6
  100. data/lib/arachni/element/cookie/dom.rb +0 -8
  101. data/lib/arachni/element/form.rb +28 -14
  102. data/lib/arachni/element/form/capabilities/auditable.rb +2 -2
  103. data/lib/arachni/element/form/capabilities/mutable.rb +5 -5
  104. data/lib/arachni/element/form/dom.rb +0 -8
  105. data/lib/arachni/element/generic_dom.rb +1 -1
  106. data/lib/arachni/element/json.rb +2 -1
  107. data/lib/arachni/element/json/capabilities/inputtable.rb +6 -6
  108. data/lib/arachni/element/json/capabilities/mutable.rb +1 -1
  109. data/lib/arachni/element/link.rb +13 -16
  110. data/lib/arachni/element/link/dom.rb +1 -14
  111. data/lib/arachni/element/link_template.rb +3 -2
  112. data/lib/arachni/element/link_template/dom.rb +0 -16
  113. data/lib/arachni/element/server.rb +51 -9
  114. data/lib/arachni/element/xml.rb +1 -0
  115. data/lib/arachni/ethon/easy.rb +4 -1
  116. data/lib/arachni/framework/parts/audit.rb +26 -77
  117. data/lib/arachni/framework/parts/browser.rb +50 -55
  118. data/lib/arachni/framework/parts/check.rb +4 -3
  119. data/lib/arachni/framework/parts/data.rb +41 -6
  120. data/lib/arachni/framework/parts/state.rb +16 -7
  121. data/lib/arachni/http/client.rb +66 -38
  122. data/lib/arachni/http/client/dynamic_404_handler.rb +46 -14
  123. data/lib/arachni/http/headers.rb +22 -10
  124. data/lib/arachni/http/proxy_server.rb +67 -22
  125. data/lib/arachni/http/proxy_server/ssl-interceptor-cacert.pem +34 -0
  126. data/lib/arachni/http/proxy_server/ssl-interceptor-cakey.pem +51 -0
  127. data/lib/arachni/http/request.rb +71 -18
  128. data/lib/arachni/issue.rb +17 -3
  129. data/lib/arachni/option_groups/browser_cluster.rb +34 -1
  130. data/lib/arachni/option_groups/http.rb +1 -1
  131. data/lib/arachni/page.rb +26 -13
  132. data/lib/arachni/page/dom/transition.rb +2 -2
  133. data/lib/arachni/parser.rb +28 -11
  134. data/lib/arachni/platform/fingerprinter.rb +5 -0
  135. data/lib/arachni/platform/manager.rb +65 -32
  136. data/lib/arachni/plugin/base.rb +8 -0
  137. data/lib/arachni/processes/instances.rb +25 -11
  138. data/lib/arachni/reporter/manager.rb +2 -2
  139. data/lib/arachni/rpc/client/instance.rb +4 -0
  140. data/lib/arachni/rpc/server/framework/master.rb +3 -3
  141. data/lib/arachni/rpc/server/framework/multi_instance.rb +0 -8
  142. data/lib/arachni/rpc/server/instance.rb +2 -1
  143. data/lib/arachni/ruby/array.rb +5 -0
  144. data/lib/arachni/ruby/hash.rb +5 -0
  145. data/lib/arachni/ruby/string.rb +2 -3
  146. data/lib/arachni/session.rb +32 -6
  147. data/lib/arachni/state/framework.rb +6 -2
  148. data/lib/arachni/support/cache.rb +1 -0
  149. data/lib/arachni/support/cache/base.rb +12 -8
  150. data/lib/arachni/support/cache/least_recently_pushed.rb +29 -0
  151. data/lib/arachni/support/cache/least_recently_used.rb +5 -8
  152. data/lib/arachni/support/cache/preference.rb +1 -1
  153. data/lib/arachni/support/cache/random_replacement.rb +1 -25
  154. data/lib/arachni/support/database/queue.rb +21 -8
  155. data/lib/arachni/support/lookup/base.rb +7 -1
  156. data/lib/arachni/support/mixins/observable.rb +3 -1
  157. data/lib/arachni/support/profiler.rb +51 -10
  158. data/lib/arachni/support/signature.rb +11 -2
  159. data/lib/arachni/trainer.rb +8 -2
  160. data/lib/arachni/uri.rb +28 -25
  161. data/lib/arachni/uri/scope.rb +1 -1
  162. data/lib/arachni/utilities.rb +8 -0
  163. data/lib/arachni/watir/element.rb +1 -1
  164. data/lib/version +1 -1
  165. data/spec/arachni/browser/javascript/dom_monitor_spec.rb +388 -53
  166. data/spec/arachni/browser/javascript/taint_tracer_spec.rb +41 -0
  167. data/spec/arachni/browser/javascript_spec.rb +235 -61
  168. data/spec/arachni/browser_cluster/jobs/resource_exploration_spec.rb +0 -9
  169. data/spec/arachni/browser_cluster_spec.rb +58 -10
  170. data/spec/arachni/browser_spec.rb +170 -26
  171. data/spec/arachni/check/auditor_spec.rb +22 -3
  172. data/spec/arachni/check/base_spec.rb +84 -0
  173. data/spec/arachni/element/body_spec.rb +1 -1
  174. data/spec/arachni/element/capabilities/analyzable/taint_spec.rb +3 -3
  175. data/spec/arachni/element/capabilities/analyzable/timeout_spec.rb +1 -1
  176. data/spec/arachni/element/cookie/dom_spec.rb +0 -9
  177. data/spec/arachni/element/cookie_spec.rb +85 -0
  178. data/spec/arachni/element/form/dom_spec.rb +0 -9
  179. data/spec/arachni/element/form_spec.rb +46 -3
  180. data/spec/arachni/element/json_spec.rb +20 -0
  181. data/spec/arachni/element/link/dom_spec.rb +0 -9
  182. data/spec/arachni/element/link_spec.rb +40 -15
  183. data/spec/arachni/element/link_template/dom_spec.rb +0 -8
  184. data/spec/arachni/element/link_template_spec.rb +2 -6
  185. data/spec/arachni/element/server_spec.rb +94 -8
  186. data/spec/arachni/element/xml_spec.rb +20 -0
  187. data/spec/arachni/framework/parts/audit_spec.rb +12 -14
  188. data/spec/arachni/framework/parts/browser_spec.rb +0 -171
  189. data/spec/arachni/framework/parts/platform_spec.rb +14 -8
  190. data/spec/arachni/framework/parts/report_spec.rb +1 -1
  191. data/spec/arachni/framework/parts/state_spec.rb +0 -9
  192. data/spec/arachni/http/client/dynamic_404_handlers_spec.rb +19 -0
  193. data/spec/arachni/http/client_spec.rb +169 -42
  194. data/spec/arachni/http/headers_spec.rb +18 -0
  195. data/spec/arachni/http/request_spec.rb +23 -0
  196. data/spec/arachni/issue_spec.rb +17 -6
  197. data/spec/arachni/page_spec.rb +22 -2
  198. data/spec/arachni/parser_spec.rb +5 -0
  199. data/spec/arachni/platform/manager_spec.rb +57 -25
  200. data/spec/arachni/reporter/manager_spec.rb +26 -0
  201. data/spec/arachni/rpc/server/active_options_spec.rb +9 -4
  202. data/spec/arachni/state/framework_spec.rb +2 -8
  203. data/spec/arachni/support/cache/least_recently_pushed_spec.rb +90 -0
  204. data/spec/arachni/support/cache/least_recently_used_spec.rb +5 -13
  205. data/spec/arachni/support/database/queue_spec.rb +7 -0
  206. data/spec/arachni/support/mixins/observable_spec.rb +15 -1
  207. data/spec/arachni/trainer_spec.rb +2 -2
  208. data/spec/components/checks/active/code_injection_timing_spec.rb +1 -1
  209. data/spec/components/checks/active/file_inclusion_spec.rb +6 -6
  210. data/spec/components/checks/active/path_traversal_spec.rb +2 -2
  211. data/spec/components/checks/active/source_code_disclosure_spec.rb +2 -2
  212. data/spec/components/checks/active/unvalidated_redirect_spec.rb +6 -6
  213. data/spec/components/checks/active/xss_dom_inputs_spec.rb +3 -5
  214. data/spec/components/checks/active/xss_dom_script_context_spec.rb +1 -1
  215. data/spec/components/checks/active/xss_spec.rb +5 -5
  216. data/spec/components/checks/passive/common_admin_interfaces_spec.rb +15 -0
  217. data/spec/components/checks/passive/interesting_responses_spec.rb +14 -1
  218. data/spec/components/fingerprinters/frameworks/aspx_mvc_spec.rb +31 -0
  219. data/spec/components/fingerprinters/frameworks/cakephp_spec.rb +22 -0
  220. data/spec/components/fingerprinters/frameworks/cherrypy_spec.rb +28 -0
  221. data/spec/components/fingerprinters/frameworks/django_spec.rb +37 -0
  222. data/spec/components/fingerprinters/frameworks/jsf_spec.rb +27 -0
  223. data/spec/components/fingerprinters/frameworks/rack_spec.rb +11 -14
  224. data/spec/components/fingerprinters/frameworks/rails_spec.rb +53 -0
  225. data/spec/components/fingerprinters/languages/asp_spec.rb +7 -9
  226. data/spec/components/fingerprinters/languages/aspx_spec.rb +10 -24
  227. data/spec/components/fingerprinters/languages/java_spec.rb +88 -0
  228. data/spec/components/fingerprinters/languages/php_spec.rb +19 -12
  229. data/spec/components/fingerprinters/languages/python_spec.rb +22 -9
  230. data/spec/components/fingerprinters/languages/ruby.rb +6 -4
  231. data/spec/components/fingerprinters/os/bsd_spec.rb +6 -4
  232. data/spec/components/fingerprinters/os/linux_spec.rb +6 -4
  233. data/spec/components/fingerprinters/os/solaris_spec.rb +6 -4
  234. data/spec/components/fingerprinters/os/unix_spec.rb +6 -4
  235. data/spec/components/fingerprinters/os/windows_spec.rb +6 -4
  236. data/spec/components/fingerprinters/servers/apache_spec.rb +15 -4
  237. data/spec/components/fingerprinters/servers/gunicorn_spec.rb +28 -0
  238. data/spec/components/fingerprinters/servers/iis_spec.rb +6 -6
  239. data/spec/components/fingerprinters/servers/jetty_spec.rb +6 -6
  240. data/spec/components/fingerprinters/servers/nginx_spec.rb +6 -4
  241. data/spec/components/fingerprinters/servers/tomcat_spec.rb +15 -6
  242. data/spec/components/path_extractors/data_url_spec.rb +19 -0
  243. data/spec/components/plugins/autologin_spec.rb +23 -0
  244. data/spec/components/plugins/login_script_spec.rb +112 -24
  245. data/spec/components/plugins/restrict_to_dom_state_spec.rb +16 -0
  246. data/spec/components/plugins/vector_feed_spec.rb +39 -1
  247. data/spec/support/factories/page/dom.rb +9 -4
  248. data/spec/support/factories/page/dom/transition.rb +31 -9
  249. data/spec/support/factories/scan_report.rb +8 -6
  250. data/spec/support/fixtures/empty/placeholder +0 -0
  251. data/spec/support/fixtures/report.afr +0 -0
  252. data/spec/support/fixtures/reporters/manager_spec/error.rb +18 -0
  253. data/spec/support/servers/arachni/browser.rb +117 -11
  254. data/spec/support/servers/arachni/browser/javascript/dom_monitor.rb +148 -4
  255. data/spec/support/servers/arachni/check/auditor.rb +4 -0
  256. data/spec/support/servers/arachni/element/cookie/cookie_dom.rb +1 -1
  257. data/spec/support/servers/arachni/http/client.rb +5 -0
  258. data/spec/support/servers/arachni/http/client/dynamic_404_handler.rb +13 -0
  259. data/spec/support/servers/checks/active/code_injection_timing.rb +1 -1
  260. data/spec/support/servers/checks/active/file_inclusion.rb +2 -2
  261. data/spec/support/servers/checks/active/path_traversal.rb +2 -2
  262. data/spec/support/servers/checks/active/source_code_disclosure.rb +40 -33
  263. data/spec/support/servers/checks/active/trainer_check.rb +9 -10
  264. data/spec/support/servers/checks/active/unvalidated_redirect_dom.rb +7 -4
  265. data/spec/support/servers/checks/active/xss.rb +35 -0
  266. data/spec/support/servers/checks/active/xss_dom.rb +1 -1
  267. data/spec/support/servers/checks/active/xss_dom_inputs.rb +24 -0
  268. data/spec/support/servers/checks/active/xss_dom_script_context.rb +1 -1
  269. data/spec/support/servers/checks/passive/common_admin_interfaces.rb +6 -0
  270. data/spec/support/servers/plugins/autologin.rb +9 -0
  271. data/spec/support/servers/plugins/restrict_to_dom_state.rb +4 -0
  272. data/spec/support/shared/element/base.rb +42 -0
  273. data/spec/support/shared/element/capabilities/auditable.rb +4 -4
  274. data/spec/support/shared/element/capabilities/auditable/dom.rb +26 -0
  275. data/spec/support/shared/element/capabilities/inputtable.rb +16 -11
  276. data/spec/support/shared/element/capabilities/submitable.rb +7 -2
  277. data/spec/support/shared/fingerprinter.rb +8 -0
  278. data/spec/support/shared/path_extractor.rb +1 -1
  279. data/ui/cli/framework.rb +3 -3
  280. data/ui/cli/framework/option_parser.rb +9 -0
  281. data/ui/cli/output.rb +9 -0
  282. data/ui/cli/reporter.rb +5 -2
  283. data/ui/cli/utilities.rb +4 -2
  284. metadata +76 -17
  285. data/lib/arachni/http/proxy_server/ssl-interceptor-cert.pem +0 -34
  286. data/lib/arachni/http/proxy_server/ssl-interceptor-pkey.pem +0 -51
  287. data/spec/components/fingerprinters/languages/jsp_spec.rb +0 -56
@@ -3,15 +3,18 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Linux do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:linux]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  described_class::IDs.each do |id|
8
12
  context "and it contains #{id}" do
9
13
  it 'identifies it as Linux' do
10
- page = Arachni::Page.from_data(
14
+ check_platforms Arachni::Page.from_data(
11
15
  url: 'http://stuff.com/blah',
12
16
  response: { headers: { 'Server' => "Apache/2.2.21 (#{id})" } }
13
17
  )
14
- platforms_for( page ).should include :linux
15
18
  end
16
19
  end
17
20
  end
@@ -21,11 +24,10 @@ describe Arachni::Platform::Fingerprinters::Linux do
21
24
  described_class::IDs.each do |id|
22
25
  context "and it contains #{id}" do
23
26
  it 'identifies it as Linux' do
24
- page = Arachni::Page.from_data(
27
+ check_platforms Arachni::Page.from_data(
25
28
  url: 'http://stuff.com/blah',
26
29
  response: { headers: { 'X-Powered-By' => "Apache/2.2.21 (#{id})" } }
27
30
  )
28
- platforms_for( page ).should include :linux
29
31
  end
30
32
  end
31
33
  end
@@ -3,15 +3,18 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Solaris do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:solaris]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  described_class::IDs.each do |id|
8
12
  context "and it contains #{id}" do
9
13
  it 'identifies it as Solaris' do
10
- page = Arachni::Page.from_data(
14
+ check_platforms Arachni::Page.from_data(
11
15
  url: 'http://stuff.com/blah',
12
16
  response: { headers: { 'Server' => "Apache/2.2.21 (#{id})" } }
13
17
  )
14
- platforms_for( page ).should include :solaris
15
18
  end
16
19
  end
17
20
  end
@@ -21,11 +24,10 @@ describe Arachni::Platform::Fingerprinters::Solaris do
21
24
  described_class::IDs.each do |id|
22
25
  context "and it contains #{id}" do
23
26
  it 'identifies it as Solaris' do
24
- page = Arachni::Page.from_data(
27
+ check_platforms Arachni::Page.from_data(
25
28
  url: 'http://stuff.com/blah',
26
29
  response: { headers: { 'X-Powered-By' => "Apache/2.2.21 (#{id})" } }
27
30
  )
28
- platforms_for( page ).should include :solaris
29
31
  end
30
32
  end
31
33
  end
@@ -3,23 +3,25 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Unix do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:unix]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as Unix' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'Apache/2.2.21 (Unix)' } }
11
15
  )
12
- platforms_for( page ).should include :unix
13
16
  end
14
17
  end
15
18
 
16
19
  context 'when there is a X-Powered-By header' do
17
20
  it 'identifies it as Unix' do
18
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
19
22
  url: 'http://stuff.com/blah',
20
23
  response: { headers: { 'X-Powered-By' => 'Stuf/0.4 (Unix)' } }
21
24
  )
22
- platforms_for( page ).should include :unix
23
25
  end
24
26
  end
25
27
 
@@ -3,15 +3,18 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Windows do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:windows]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  described_class::IDs.each do |id|
8
12
  context "and it contains #{id}" do
9
13
  it 'identifies it as Windows' do
10
- page = Arachni::Page.from_data(
14
+ check_platforms Arachni::Page.from_data(
11
15
  url: 'http://stuff.com/blah',
12
16
  response: { headers: { 'Server' => "Apache/2.2.21 (#{id})" } }
13
17
  )
14
- platforms_for( page ).should include :windows
15
18
  end
16
19
  end
17
20
  end
@@ -21,11 +24,10 @@ describe Arachni::Platform::Fingerprinters::Windows do
21
24
  described_class::IDs.each do |id|
22
25
  context "and it contains #{id}" do
23
26
  it 'identifies it as Windows' do
24
- page = Arachni::Page.from_data(
27
+ check_platforms Arachni::Page.from_data(
25
28
  url: 'http://stuff.com/blah',
26
29
  response: { headers: { 'X-Powered-By' => "PHP/5.0 (#{id})" } }
27
30
  )
28
- platforms_for( page ).should include :windows
29
31
  end
30
32
  end
31
33
  end
@@ -3,23 +3,34 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Apache do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:apache]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as Apache' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'Apache/2.2.21' } }
11
15
  )
12
- platforms_for( page ).should include :apache
13
16
  end
14
17
  end
15
18
 
16
19
  context 'when there is a X-Powered-By header' do
17
20
  it 'identifies it as Apache' do
18
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
19
22
  url: 'http://stuff.com/blah',
20
23
  response: { headers: { 'X-Powered-By' => 'Stuf/0.4 (Apache)' } }
21
24
  )
22
- platforms_for( page ).should include :apache
25
+ end
26
+ end
27
+
28
+ context 'when there is an Server header that includes Coyote' do
29
+ it 'does not identify it as Apache' do
30
+ platforms_for( Arachni::Page.from_data(
31
+ url: 'http://stuff.com/blah',
32
+ response: { headers: { 'Server' => 'Apache-Coyote/1.1' } }
33
+ )).to_a.should be_empty
23
34
  end
24
35
  end
25
36
 
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::Gunicorn do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:python, :gunicorn]
8
+ end
9
+
10
+ context 'when there is a Server header' do
11
+ it 'identifies it as Gunicorn' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ response: { headers: { 'Server' => 'gunicorn/18.0' } }
15
+ )
16
+ end
17
+ end
18
+
19
+ context 'when there are X-Gunicorn headers' do
20
+ it 'identifies it as Gunicorn' do
21
+ check_platforms Arachni::Page.from_data(
22
+ url: 'http://stuff.com/blah',
23
+ response: { headers: { 'X-Gunicorn-Stuff' => 'Blah' } }
24
+ )
25
+ end
26
+ end
27
+
28
+ end
@@ -3,25 +3,25 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::IIS do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:iis, :windows]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as IIS' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'IIS/2.2.21' } }
11
15
  )
12
- platforms_for( page ).should include :iis
13
- platforms_for( page ).should include :windows
14
16
  end
15
17
  end
16
18
 
17
19
  context 'when there is a X-Powered-By header' do
18
20
  it 'identifies it as IIS' do
19
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
20
22
  url: 'http://stuff.com/blah',
21
23
  response: { headers: { 'X-Powered-By' => 'Stuf/0.4 (IIS)' } }
22
24
  )
23
- platforms_for( page ).should include :iis
24
- platforms_for( page ).should include :windows
25
25
  end
26
26
  end
27
27
 
@@ -3,25 +3,25 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Jetty do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:jetty, :java]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as Jetty' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'Jetty/2.2.21' } }
11
15
  )
12
- platforms_for( page ).should include :jetty
13
- platforms_for( page ).should include :jsp
14
16
  end
15
17
  end
16
18
 
17
19
  context 'when there is a X-Powered-By header' do
18
20
  it 'identifies it as Jetty' do
19
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
20
22
  url: 'http://stuff.com/blah',
21
23
  response: { headers: { 'X-Powered-By' => 'Stuff/0.4 (Jetty)' } }
22
24
  )
23
- platforms_for( page ).should include :jetty
24
- platforms_for( page ).should include :jsp
25
25
  end
26
26
  end
27
27
 
@@ -3,23 +3,25 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Nginx do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:nginx]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as Nginx' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'Nginx/2.2.21' } }
11
15
  )
12
- platforms_for( page ).should include :nginx
13
16
  end
14
17
  end
15
18
 
16
19
  context 'when there is a X-Powered-By header' do
17
20
  it 'identifies it as Nginx' do
18
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
19
22
  url: 'http://stuff.com/blah',
20
23
  response: { headers: { 'X-Powered-By' => 'Stuf/0.4 (Nginx)' } }
21
24
  )
22
- platforms_for( page ).should include :nginx
23
25
  end
24
26
  end
25
27
 
@@ -3,25 +3,34 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Tomcat do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:tomcat, :java]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as Tomcat' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  response: { headers: { 'Server' => 'Tomcat/2.2.21' } }
11
15
  )
12
- platforms_for( page ).should include :tomcat
13
- platforms_for( page ).should include :jsp
14
16
  end
15
17
  end
16
18
 
17
19
  context 'when there is a X-Powered-By header' do
18
20
  it 'identifies it as Tomcat' do
19
- page = Arachni::Page.from_data(
21
+ check_platforms Arachni::Page.from_data(
20
22
  url: 'http://stuff.com/blah',
21
23
  response: { headers: { 'X-Powered-By' => 'Stuf/0.4 (Tomcat)' } }
22
24
  )
23
- platforms_for( page ).should include :tomcat
24
- platforms_for( page ).should include :jsp
25
+ end
26
+ end
27
+
28
+ context 'when there is an Server header' do
29
+ it 'identifies it as Tomcat' do
30
+ check_platforms Arachni::Page.from_data(
31
+ url: 'http://stuff.com/blah',
32
+ response: { headers: { 'Server' => 'Apache-Coyote/1.1' } }
33
+ )
25
34
  end
26
35
  end
27
36
 
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe name_from_filename do
4
+ include_examples 'path_extractor'
5
+
6
+ def results
7
+ [
8
+ 'http://test.com',
9
+ 'test',
10
+ 'test.com'
11
+ ]
12
+ end
13
+
14
+ def text
15
+ results.map { |u| "<a data-url='#{u}'>Stuff</a>" }.join
16
+ end
17
+
18
+ easy_test
19
+ end
@@ -76,6 +76,29 @@ describe name_from_filename do
76
76
  end
77
77
  end
78
78
 
79
+ context 'when the form is not visible' do
80
+ before do
81
+ options.plugins[component_name] = {
82
+ 'url' => url + '/hidden_login',
83
+ 'parameters' => 'username=john&password=doe',
84
+ 'check' => 'Hi there logged-in user'
85
+ }
86
+ end
87
+
88
+ it 'complains about not the form being invisible' do
89
+ run
90
+
91
+ actual_results['status'].should == 'form_not_visible'
92
+ actual_results['message'].should == plugin::STATUSES[:form_not_visible]
93
+ end
94
+
95
+ it 'aborts the scan' do
96
+ run
97
+
98
+ framework.status.should == :aborted
99
+ end
100
+ end
101
+
79
102
  context 'when the verifier does not match' do
80
103
  before do
81
104
  options.plugins[component_name] = {
@@ -14,6 +14,8 @@ describe name_from_filename do
14
14
  IO.write( script_path, script )
15
15
 
16
16
  options.plugins[component_name] = { 'script' => script_path }
17
+
18
+ framework.options.scope.dom_depth_limit = 1
17
19
  end
18
20
 
19
21
  after(:each) { FileUtils.rm_f script_path }
@@ -22,27 +24,84 @@ describe name_from_filename do
22
24
  let(:script_path) { "#{Dir.tmpdir}/login_script_#{Time.now.to_i}" }
23
25
 
24
26
  context 'when a browser' do
25
- let(:script) do
26
- <<EOSCRIPT
27
+ context 'is available' do
28
+ context 'when using a Ruby script' do
29
+ let(:script) do
30
+ <<EOSCRIPT
27
31
  framework.options.datastore.browser = browser
28
32
  EOSCRIPT
29
- end
33
+ end
30
34
 
31
- context 'is available' do
32
- it "exposes a Watir::Browser interface via the 'browser' variable" do
33
- run
35
+ it "exposes a Watir::Browser interface via the 'browser' variable" do
36
+ run
34
37
 
35
- options.datastore.browser.should be_kind_of Watir::Browser
38
+ options.datastore.browser.should be_kind_of Watir::Browser
39
+ end
40
+ end
41
+
42
+ context 'when using a Javascript script' do
43
+ let(:script) do
44
+ <<EOSCRIPT
45
+ document.cookie = 'mycookie=myvalue'
46
+ EOSCRIPT
47
+ end
48
+ let(:script_path) { "#{super()}.js" }
49
+
50
+ it 'runs the code' do
51
+ run
52
+
53
+ framework.http.cookies.
54
+ find { |c| c.name == 'mycookie' }.value.should == 'myvalue'
55
+ end
36
56
  end
37
57
  end
38
58
 
39
59
  context 'is not available' do
40
- it "sets 'browser' to 'nil'" do
60
+ before do
41
61
  framework.options.scope.dom_depth_limit = 0
42
- run
62
+ end
63
+
64
+ context 'when using a Ruby script' do
65
+ let(:script) do
66
+ <<EOSCRIPT
67
+ framework.options.datastore.browser = browser
68
+ EOSCRIPT
69
+ end
70
+
71
+ it "sets 'browser' to 'nil'" do
72
+ run
43
73
 
44
- options.datastore.browser.should be_nil
74
+ options.datastore.browser.should be_nil
75
+ end
45
76
  end
77
+
78
+ context 'when using a Javascript script' do
79
+ let(:script) do
80
+ <<EOSCRIPT
81
+ document.cookie = 'mycookie=myvalue'
82
+ EOSCRIPT
83
+ end
84
+ let(:script_path) { "#{super()}.js" }
85
+
86
+ it 'sets the status' do
87
+ run
88
+
89
+ actual_results['status'].should == 'missing_browser'
90
+ end
91
+
92
+ it 'sets the message' do
93
+ run
94
+
95
+ actual_results['message'].should == plugin::STATUSES[:missing_browser]
96
+ end
97
+
98
+ it 'aborts the scan' do
99
+ run
100
+
101
+ framework.status.should == :aborted
102
+ end
103
+ end
104
+
46
105
  end
47
106
  end
48
107
 
@@ -129,28 +188,57 @@ EOSCRIPT
129
188
  end
130
189
 
131
190
  context 'when there is a runtime error in the script' do
132
- let(:script) do
133
- <<EOSCRIPT
134
- fail
191
+ context 'when using Ruby' do
192
+ let(:script) do
193
+ <<EOSCRIPT
194
+ fail
135
195
  EOSCRIPT
136
- end
196
+ end
137
197
 
138
- it 'sets the status' do
139
- run
198
+ it 'sets the status' do
199
+ run
140
200
 
141
- actual_results['status'].should == 'error'
142
- end
201
+ actual_results['status'].should == 'error'
202
+ end
143
203
 
144
- it 'sets the message' do
145
- run
204
+ it 'sets the message' do
205
+ run
206
+
207
+ actual_results['message'].should == plugin::STATUSES[:error]
208
+ end
146
209
 
147
- actual_results['message'].should == plugin::STATUSES[:error]
210
+ it 'aborts the scan' do
211
+ run
212
+
213
+ framework.status.should == :aborted
214
+ end
148
215
  end
149
216
 
150
- it 'aborts the scan' do
151
- run
217
+ context 'when using Javascript' do
218
+ let(:script) do
219
+ <<EOSCRIPT
220
+ document.cookie = '
221
+ EOSCRIPT
222
+ end
223
+ let(:script_path) { "#{super()}.js" }
152
224
 
153
- framework.status.should == :aborted
225
+ it 'sets the status' do
226
+ run
227
+
228
+ actual_results['status'].should == 'error'
229
+ end
230
+
231
+ it 'sets the message' do
232
+ run
233
+
234
+ actual_results['message'].should == plugin::STATUSES[:error]
235
+ end
236
+
237
+ it 'aborts the scan' do
238
+ run
239
+
240
+ framework.status.should == :aborted
241
+ end
154
242
  end
155
243
  end
156
244