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
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::Rails do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:ruby, :rack, :rails]
8
+ end
9
+
10
+ context 'when there is an Server header' do
11
+ context 'and it contains Rails' do
12
+ it 'identifies it as Ruby' do
13
+ check_platforms Arachni::Page.from_data(
14
+ url: 'http://stuff.com/blah',
15
+ response: { headers: { 'Server' => 'Rails' } }
16
+ )
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'when there is a X-Powered-By header' do
22
+ context 'and it contains X-Powered-By' do
23
+ it 'identifies it as Rails' do
24
+ check_platforms Arachni::Page.from_data(
25
+ url: 'http://stuff.com/blah',
26
+ response: { headers: { 'X-Powered-By' => 'Rails' } }
27
+ )
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'when there are X-Rails headers' do
33
+ it 'identifies it as Rails' do
34
+ check_platforms Arachni::Page.from_data(
35
+ url: 'http://stuff.com/blah',
36
+ response: { headers: { 'X-Rails-Stuff' => 'Blah' } }
37
+ )
38
+ end
39
+ end
40
+
41
+ context 'when there is a _rails_admin_session cookie' do
42
+ it 'identifies it as Rails' do
43
+ check_platforms Arachni::Page.from_data(
44
+ url: 'http://stuff.com/blah',
45
+ cookies: [Arachni::Cookie.new(
46
+ url: 'http://stuff.com/blah',
47
+ inputs: { '_rails_admin_session' => 'stuff' } )]
48
+
49
+ )
50
+ end
51
+ end
52
+
53
+ end
@@ -3,35 +3,33 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::ASP do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:asp, :windows]
8
+ end
9
+
6
10
  context 'when the page has a .asp extension' do
7
11
  it 'identifies it as ASP' do
8
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.asp' )
9
- platforms_for( page ).should include :asp
10
- platforms_for( page ).should include :windows
12
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.asp' )
11
13
  end
12
14
  end
13
15
 
14
16
  context 'when there is a ASPSESSIONID query parameter' do
15
17
  it 'identifies it as ASP' do
16
- page = Arachni::Page.from_data(
18
+ check_platforms Arachni::Page.from_data(
17
19
  url: 'http://stuff.com/blah?ASPSESSIONID=stuff'
18
20
  )
19
- platforms_for( page ).should include :asp
20
- platforms_for( page ).should include :windows
21
21
  end
22
22
  end
23
23
 
24
24
  context 'when there is a ASPSESSIONID cookie' do
25
25
  it 'identifies it as ASP' do
26
- page = Arachni::Page.from_data(
26
+ check_platforms Arachni::Page.from_data(
27
27
  url: 'http://stuff.com/blah',
28
28
  cookies: [Arachni::Cookie.new(
29
29
  url: 'http://stuff.com/blah',
30
30
  inputs: { 'ASPSESSIONID' => 'stuff' } )]
31
31
 
32
32
  )
33
- platforms_for( page ).should include :asp
34
- platforms_for( page ).should include :windows
35
33
  end
36
34
  end
37
35
 
@@ -3,76 +3,62 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::ASPX do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:asp, :aspx, :windows]
8
+ end
9
+
6
10
  context 'when the page has a .aspx extension' do
7
11
  it 'identifies it as ASPX' do
8
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.aspx' )
9
- platforms_for( page ).should include :asp
10
- platforms_for( page ).should include :aspx
11
- platforms_for( page ).should include :windows
12
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.aspx' )
12
13
  end
13
14
  end
14
15
 
15
16
  context 'when there is a session ID in the path' do
16
17
  it 'identifies it as ASPX' do
17
- page = Arachni::Page.from_data(
18
+ check_platforms Arachni::Page.from_data(
18
19
  url: 'http://blah.com/(S(yn5cby55lgzstcen0ng2b4iq))/stuff'
19
20
  )
20
- platforms_for( page ).should include :asp
21
- platforms_for( page ).should include :aspx
22
- platforms_for( page ).should include :windows
23
21
  end
24
22
  end
25
23
 
26
24
  context 'when there is a ASP.NET_SessionId cookie' do
27
25
  it 'identifies it as ASPX' do
28
- page = Arachni::Page.from_data(
26
+ check_platforms Arachni::Page.from_data(
29
27
  url: 'http://stuff.com/blah',
30
28
  cookies: [Arachni::Cookie.new(
31
29
  url: 'http://stuff.com/blah',
32
30
  inputs: { 'ASP.NET_SessionId' => 'stuff' } )]
33
31
 
34
32
  )
35
- platforms_for( page ).should include :asp
36
- platforms_for( page ).should include :aspx
37
- platforms_for( page ).should include :windows
38
33
  end
39
34
  end
40
35
 
41
36
  context 'when there is an X-Powered-By header' do
42
37
  it 'identifies it as ASPX' do
43
- page = Arachni::Page.from_data(
38
+ check_platforms Arachni::Page.from_data(
44
39
  url: 'http://stuff.com/blah',
45
40
  response: { headers: { 'X-Powered-By' => 'ASP.NET' } }
46
41
  )
47
- platforms_for( page ).should include :asp
48
- platforms_for( page ).should include :aspx
49
- platforms_for( page ).should include :windows
50
42
  end
51
43
  end
52
44
 
53
45
  context 'when there is an X-AspNet-Version header' do
54
46
  it 'identifies it as ASPX' do
55
- page = Arachni::Page.from_data(
47
+ check_platforms Arachni::Page.from_data(
56
48
  url: 'http://stuff.com/blah',
57
49
  response: { headers: { 'X-AspNet-Version' => '4.0.30319' } }
58
50
 
59
51
  )
60
- platforms_for( page ).should include :asp
61
- platforms_for( page ).should include :aspx
62
- platforms_for( page ).should include :windows
63
52
  end
64
53
  end
65
54
 
66
55
  context 'when there is an X-AspNetMvc-Version header' do
67
56
  it 'identifies it as ASPX' do
68
- page = Arachni::Page.from_data(
57
+ check_platforms Arachni::Page.from_data(
69
58
  url: 'http://stuff.com/blah',
70
59
  response: { headers: { 'X-AspNetMvc-Version' => '2.0' } }
71
60
 
72
61
  )
73
- platforms_for( page ).should include :asp
74
- platforms_for( page ).should include :aspx
75
- platforms_for( page ).should include :windows
76
62
  end
77
63
  end
78
64
 
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::Java do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:java]
8
+ end
9
+
10
+ context 'when the page has a .jsp extension' do
11
+ it 'identifies it as JSP' do
12
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.jsp' )
13
+ end
14
+ end
15
+
16
+ context 'when there is a JSESSIONID query parameter' do
17
+ it 'identifies it as Java' do
18
+ check_platforms Arachni::Page.from_data(
19
+ url: 'http://stuff.com/blah?JSESSIONID=stuff'
20
+ )
21
+ end
22
+ end
23
+
24
+ context 'when there is a JSESSIONID cookie' do
25
+ it 'identifies it as Java' do
26
+ check_platforms Arachni::Page.from_data(
27
+ url: 'http://stuff.com/blah',
28
+ cookies: [Arachni::Cookie.new(
29
+ url: 'http://stuff.com/blah',
30
+ inputs: { 'JSESSIONID' => 'stuff' } )]
31
+ )
32
+ end
33
+ end
34
+
35
+ context 'when there is an X-Powered-By header with Servlet' do
36
+ it 'identifies it as Java' do
37
+ check_platforms Arachni::Page.from_data(
38
+ url: 'http://stuff.com/blah',
39
+ response: { headers: { 'X-Powered-By' => 'Servlet/2.4' } }
40
+ )
41
+ end
42
+ end
43
+
44
+ context 'when there is an X-Powered-By header with JSP' do
45
+ it 'identifies it as Java' do
46
+ check_platforms Arachni::Page.from_data(
47
+ url: 'http://stuff.com/blah',
48
+ response: { headers: { 'X-Powered-By' => 'JSP/2.1' } }
49
+ )
50
+ end
51
+ end
52
+
53
+ context 'when there is an X-Powered-By header with JBoss' do
54
+ it 'identifies it as Java' do
55
+ check_platforms Arachni::Page.from_data(
56
+ url: 'http://stuff.com/blah',
57
+ response: { headers: { 'X-Powered-By' => 'JBossWeb-2.1' } }
58
+ )
59
+ end
60
+ end
61
+
62
+ context 'when there is an X-Powered-By header with GlassFish' do
63
+ it 'identifies it as Java' do
64
+ check_platforms Arachni::Page.from_data(
65
+ url: 'http://stuff.com/blah',
66
+ response: { headers: { 'X-Powered-By' => 'GlassFish Server' } }
67
+ )
68
+ end
69
+ end
70
+
71
+ context 'when there is an X-Powered-By header with Java' do
72
+ it 'identifies it as Java' do
73
+ check_platforms Arachni::Page.from_data(
74
+ url: 'http://stuff.com/blah',
75
+ response: { headers: { 'X-Powered-By' => 'Java' } }
76
+ )
77
+ end
78
+ end
79
+
80
+ context 'when there is an X-Powered-By header with Oracle' do
81
+ it 'identifies it as Java' do
82
+ check_platforms Arachni::Page.from_data(
83
+ url: 'http://stuff.com/blah',
84
+ response: { headers: { 'X-Powered-By' => 'Oracle-Application-Server-10g/10.1.3.5.0 Oracle-HTTP-Server' } }
85
+ )
86
+ end
87
+ end
88
+ end
@@ -3,56 +3,63 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::PHP do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:php]
8
+ end
9
+
6
10
  context 'when the page has a .php extension' do
7
11
  it 'identifies it as PHP' do
8
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.php' )
9
- platforms_for( page ).should include :php
12
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.php' )
10
13
  end
11
14
  end
12
15
 
13
16
  context 'when the page has a .php/ rewrite' do
14
17
  it 'identifies it as PHP' do
15
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.php/Stuff/1' )
16
- platforms_for( page ).should include :php
18
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.php/Stuff/1' )
17
19
  end
18
20
  end
19
21
 
20
22
  context 'when the page has a .php5 (or similarly numbered) extension' do
21
23
  it 'identifies it as PHP' do
22
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.php5' )
23
- platforms_for( page ).should include :php
24
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.php5' )
24
25
  end
25
26
  end
26
27
 
27
28
  context 'when there is a PHPSESSID query parameter' do
28
29
  it 'identifies it as PHP' do
29
- page = Arachni::Page.from_data(
30
+ check_platforms Arachni::Page.from_data(
30
31
  url: 'http://stuff.com/blah?PHPSESSID=stuff'
31
32
  )
32
- platforms_for( page ).should include :php
33
33
  end
34
34
  end
35
35
 
36
36
  context 'when there is a PHPSESSID cookie' do
37
37
  it 'identifies it as PHP' do
38
- page = Arachni::Page.from_data(
38
+ check_platforms Arachni::Page.from_data(
39
39
  url: 'http://stuff.com/blah',
40
40
  cookies: [Arachni::Cookie.new(
41
41
  url: 'http://stuff.com/blah',
42
42
  inputs: { 'PHPSESSID' => 'stuff' } )]
43
43
 
44
44
  )
45
- platforms_for( page ).should include :php
46
45
  end
47
46
  end
48
47
 
49
48
  context 'when there is an X-Powered-By header' do
50
49
  it 'identifies it as PHP' do
51
- page = Arachni::Page.from_data(
50
+ check_platforms Arachni::Page.from_data(
52
51
  url: 'http://stuff.com/blah',
53
52
  response: { headers: { 'X-Powered-By' => 'PHP/5.1.2' } }
54
53
  )
55
- platforms_for( page ).should include :php
54
+ end
55
+ end
56
+
57
+ context 'when there is an X-PHP-PID header' do
58
+ it 'identifies it as PHP' do
59
+ check_platforms Arachni::Page.from_data(
60
+ url: 'http://stuff.com/blah',
61
+ response: { headers: { 'X-PHP-PID' => '2212' } }
62
+ )
56
63
  end
57
64
  end
58
65
 
@@ -3,20 +3,33 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Python do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:python]
8
+ end
9
+
6
10
  context 'when the page has a .py extension' do
7
11
  it 'identifies it as Python' do
8
- page = Arachni::Page.from_data( url: 'http://stuff.com/blah.py' )
9
- platforms_for( page ).should include :python
12
+ check_platforms Arachni::Page.from_data( url: 'http://stuff.com/blah.py' )
10
13
  end
11
14
  end
12
15
 
13
- context 'when there is an X-Powered-By header' do
14
- it 'identifies it as Python' do
15
- page = Arachni::Page.from_data(
16
- url: 'http://stuff.com/blah',
17
- response: { headers: { 'X-Powered-By' => 'Python/stuff' } }
18
- )
19
- platforms_for( page ).should include :python
16
+ described_class::IDS.each do |id|
17
+ context "when there is an X-Powered-By header with #{id}" do
18
+ it 'identifies it as Python' do
19
+ check_platforms Arachni::Page.from_data(
20
+ url: 'http://stuff.com/blah',
21
+ response: { headers: { 'X-Powered-By' => "#{id}/stuff" } }
22
+ )
23
+ end
24
+ end
25
+
26
+ context "when there is a Server header with #{id}" do
27
+ it 'identifies it as Python' do
28
+ check_platforms Arachni::Page.from_data(
29
+ url: 'http://stuff.com/blah',
30
+ response: { headers: { 'Server' => "#{id}/stuff" } }
31
+ )
32
+ end
20
33
  end
21
34
  end
22
35
 
@@ -3,15 +3,18 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Ruby do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:ruby]
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 Ruby' 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 :ruby
15
18
  end
16
19
  end
17
20
  end
@@ -21,11 +24,10 @@ describe Arachni::Platform::Fingerprinters::Ruby do
21
24
  described_class::IDs.each do |id|
22
25
  context "and it contains #{id}" do
23
26
  it 'identifies it as Ruby' 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 :ruby
29
31
  end
30
32
  end
31
33
  end
@@ -3,23 +3,25 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::BSD do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:bsd]
8
+ end
9
+
6
10
  context 'when there is an Server header' do
7
11
  it 'identifies it as BSD' 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 (FreeBSD)' } }
11
15
  )
12
- platforms_for( page ).should include :bsd
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 BSD' 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 (FreeBSD)' } }
21
24
  )
22
- platforms_for( page ).should include :bsd
23
25
  end
24
26
  end
25
27