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
@@ -8,26 +8,18 @@ describe Arachni::Support::Cache::LeastRecentlyUsed do
8
8
 
9
9
  subject[:k] = '1'
10
10
  subject[:k2] = '2'
11
+ subject[:k]
11
12
  subject[:k3] = '3'
12
13
  subject[:k4] = '4'
13
- subject.size.should == 3
14
-
15
- subject[:k4].should be_true
16
- subject[:k3].should be_true
17
- subject[:k2].should be_true
18
- subject[:k].should be_nil
19
14
 
20
- subject.clear
15
+ subject.size.should == 3
21
16
 
22
- subject.max_size = 1
23
- subject[:k] = '1'
24
- subject[:k2] = '3'
25
- subject[:k3] = '4'
26
- subject.size.should == 1
17
+ ap subject
27
18
 
19
+ subject[:k].should be_true
20
+ subject[:k4].should be_true
28
21
  subject[:k3].should be_true
29
22
  subject[:k2].should be_nil
30
- subject[:k].should be_nil
31
23
  end
32
24
 
33
25
  describe '#[]=' do
@@ -167,6 +167,13 @@ describe Arachni::Support::Database::Queue do
167
167
  end
168
168
  end
169
169
 
170
+ describe '#free_buffer_size' do
171
+ it 'returns the size of the available buffer' do
172
+ (subject.max_buffer_size - 2).times { |i| subject << i }
173
+ subject.free_buffer_size.should == 2
174
+ end
175
+ end
176
+
170
177
  describe '#buffer_size' do
171
178
  it 'returns the size of the in-memory entries' do
172
179
  subject.buffer_size.should == 0
@@ -57,11 +57,25 @@ describe Arachni::Support::Mixins::Observable do
57
57
  end
58
58
  end
59
59
 
60
- describe '#call_<event>' do
60
+ describe '#notify' do
61
61
  it 'returns nil' do
62
62
  subject.my_event { }
63
63
  subject.notify( :my_event ).should be_nil
64
64
  end
65
+
66
+ context 'when a callback raises an exception' do
67
+ it 'does not affect other callbacks' do
68
+ called = []
69
+
70
+ subject.my_event { called << 1 }
71
+ subject.my_event { called << 2; raise }
72
+ subject.my_event { called << 3 }
73
+
74
+ subject.notify( :my_event )
75
+
76
+ called.should == [1, 2, 3]
77
+ end
78
+ end
65
79
  end
66
80
 
67
81
  describe '#clear_observers' do
@@ -99,9 +99,9 @@ describe Arachni::Trainer do
99
99
  @framework.pages.size.should == 0
100
100
 
101
101
  Arachni::HTTP::Client.request( @url + '/elems', train: true )
102
- @framework.run
103
102
 
104
- @framework.pages.size.should == 1
103
+ @trainer.should receive(:push)
104
+ @framework.run
105
105
  end
106
106
 
107
107
  context 'when a redirection leads to new elements' do
@@ -4,7 +4,7 @@ describe name_from_filename do
4
4
  include_examples 'check'
5
5
 
6
6
  def self.platforms
7
- [:ruby, :php, :perl, :python, :jsp, :asp]
7
+ [:ruby, :php, :perl, :python, :java, :asp]
8
8
  end
9
9
 
10
10
  def self.elements
@@ -4,7 +4,7 @@ describe name_from_filename do
4
4
  include_examples 'check'
5
5
 
6
6
  def self.platforms
7
- [:unix, :windows, :tomcat, :php, :perl]
7
+ [:unix, :windows, :php, :perl, :java]
8
8
  end
9
9
 
10
10
  def self.elements
@@ -32,7 +32,7 @@ describe name_from_filename do
32
32
  Element::JSON => 96,
33
33
  Element::XML => 192
34
34
  },
35
- tomcat: {
35
+ java: {
36
36
  Element::Form => 8,
37
37
  Element::Link => 8,
38
38
  Element::Cookie => 8,
@@ -44,11 +44,11 @@ describe name_from_filename do
44
44
  php: {
45
45
  Element::Form => 120,
46
46
  Element::Link => 120,
47
- Element::Cookie => 120,
48
- Element::Header => 60,
47
+ Element::Cookie => 112,
48
+ Element::Header => 56,
49
49
  Element::LinkTemplate => 60,
50
- Element::JSON => 120,
51
- Element::XML => 240
50
+ Element::JSON => 112,
51
+ Element::XML => 224
52
52
  },
53
53
  perl: {
54
54
  Element::Form => 120,
@@ -4,7 +4,7 @@ describe name_from_filename do
4
4
  include_examples 'check'
5
5
 
6
6
  def self.platforms
7
- [:unix, :windows, :tomcat]
7
+ [:unix, :windows, :java]
8
8
  end
9
9
 
10
10
  def self.elements
@@ -32,7 +32,7 @@ describe name_from_filename do
32
32
  Element::JSON => 504,
33
33
  Element::XML => 672
34
34
  },
35
- tomcat: {
35
+ java: {
36
36
  Element::Form => 8,
37
37
  Element::Link => 8,
38
38
  Element::Cookie => 8,
@@ -4,7 +4,7 @@ describe name_from_filename do
4
4
  include_examples 'check'
5
5
 
6
6
  def self.platforms
7
- [:php, :asp, :jsp]
7
+ [:php, :asp, :java]
8
8
  end
9
9
 
10
10
  def self.elements
@@ -17,7 +17,7 @@ describe name_from_filename do
17
17
  Element::Form => 6,
18
18
  Element::Link => 6,
19
19
  Element::Cookie => 4,
20
- Element::Header => 3,
20
+ Element::Header => 4,
21
21
  Element::LinkTemplate => 5,
22
22
  Element::JSON => 6,
23
23
  Element::XML => 16
@@ -10,12 +10,12 @@ describe name_from_filename do
10
10
 
11
11
  def issue_count_per_element
12
12
  {
13
- Element::Form => 16,
14
- Element::Link => 16,
15
- Element::Cookie => 16,
16
- Element::Header => 8,
17
- Element::JSON => 12,
18
- Element::XML => 24
13
+ Element::Form => 5,
14
+ Element::Link => 5,
15
+ Element::Cookie => 5,
16
+ Element::Header => 5,
17
+ Element::JSON => 3,
18
+ Element::XML => 6
19
19
  }
20
20
  end
21
21
 
@@ -9,7 +9,7 @@ describe name_from_filename do
9
9
 
10
10
  def issue_count_per_element
11
11
  {
12
- Element::GenericDOM => 16
12
+ Element::GenericDOM => 9
13
13
  }
14
14
  end
15
15
 
@@ -20,13 +20,11 @@ describe name_from_filename do
20
20
  end
21
21
 
22
22
  easy_test do
23
- issues.each do |issue|
24
- issue.vector.type.should == :input
25
- end
23
+ issues.select { |i| i.vector.type == :input }.size.should == 8
24
+ issues.select { |i| i.vector.type == :button }.size.should == 1
26
25
 
27
26
  Arachni::Browser::Javascript::EVENTS_PER_ELEMENT[:input].each do |event|
28
27
  find_issue( event ).vector.action.should end_with event.to_s
29
28
  end
30
-
31
29
  end
32
30
  end
@@ -12,7 +12,7 @@ describe name_from_filename do
12
12
  {
13
13
  Element::Form::DOM => 2,
14
14
  Element::Link::DOM => 2,
15
- Element::Cookie::DOM => 1,
15
+ Element::Cookie::DOM => 2,
16
16
  Element::LinkTemplate::DOM => 2
17
17
  }
18
18
  end
@@ -10,11 +10,11 @@ describe name_from_filename do
10
10
 
11
11
  def issue_count_per_element
12
12
  {
13
- Element::Link => 9,
14
- Element::Form => 6,
15
- Element::Cookie => 6,
16
- Element::Header => 5,
17
- Element::LinkTemplate => 6
13
+ Element::Link => 13,
14
+ Element::Form => 12,
15
+ Element::Cookie => 12,
16
+ Element::Header => 11,
17
+ Element::LinkTemplate => 12
18
18
  }
19
19
  end
20
20
 
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe name_from_filename do
4
+ include_examples 'check'
5
+
6
+ def self.elements
7
+ [ Element::Server ]
8
+ end
9
+
10
+ def issue_count
11
+ current_check.resources.count
12
+ end
13
+
14
+ easy_test
15
+ end
@@ -7,7 +7,7 @@ describe name_from_filename do
7
7
  [ Element::Server ]
8
8
  end
9
9
 
10
- it 'intercepts all HTTP responses and log ones with status codes other than 200 or 404' do
10
+ it 'logs HTTP responses with status codes other than 200 or 404' do
11
11
  run
12
12
  current_check.acceptable.each do |code|
13
13
  http.get( url + code.to_s )
@@ -20,4 +20,17 @@ describe name_from_filename do
20
20
  max_issues = current_check.max_issues
21
21
  issues.size.should == max_issues
22
22
  end
23
+
24
+ it 'skips HTTP responses which are out of scope' do
25
+ options.scope.exclude_path_patterns << /blah/
26
+
27
+ run
28
+
29
+ current_check.acceptable.each do |code|
30
+ http.get( url + 'blah/' + code.to_s )
31
+ end
32
+ http.run
33
+
34
+ issues.should be_empty
35
+ end
23
36
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::ASPXMVC do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:asp, :aspx, :windows, :aspx_mvc]
8
+ end
9
+
10
+ context 'when there is a __requestverificationtoken cookie' do
11
+ it 'identifies it as ASP.NET MVC' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ cookies: [Arachni::Cookie.new(
15
+ url: 'http://stuff.com/blah',
16
+ inputs: { '__requestverificationtoken' => 'stuff' } )]
17
+
18
+ )
19
+ end
20
+ end
21
+
22
+ context 'when there is an X-AspNetMvc-Version header' do
23
+ it 'identifies it as ASP.NET MVC' do
24
+ check_platforms Arachni::Page.from_data(
25
+ url: 'http://stuff.com/blah',
26
+ response: { headers: { 'X-AspNetMvc-Version' => '2.0' } }
27
+ )
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::CakePHP do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:php, :cakephp]
8
+ end
9
+
10
+ context 'when there is a CAKEPHP cookie' do
11
+ it 'identifies it as CakePHP' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ cookies: [Arachni::Cookie.new(
15
+ url: 'http://stuff.com/blah',
16
+ inputs: { 'CAKEPHP' => 'stuff' } )]
17
+
18
+ )
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::CherryPy do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:python, :cherrypy]
8
+ end
9
+
10
+ context 'when there is a Server header' do
11
+ it 'identifies it as CherryPy' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ response: { headers: { 'Server' => 'CherryPy/0.1' } }
15
+ )
16
+ end
17
+ end
18
+
19
+ context 'when there is an X-Powered-By header' do
20
+ it 'identifies it as CherryPy' do
21
+ check_platforms Arachni::Page.from_data(
22
+ url: 'http://stuff.com/blah',
23
+ response: { headers: { 'X-Powered-By' => 'CherryPy/0.1' } }
24
+ )
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::Django do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:python, :django]
8
+ end
9
+
10
+ context 'when there is a Server header' do
11
+ it 'identifies it as Django' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ response: { headers: { 'Server' => 'WSGIServer/0.1mt Django/2.7.4' } }
15
+ )
16
+ end
17
+ end
18
+
19
+ context 'when there is an X-Powered-By header' do
20
+ it 'identifies it as Django' do
21
+ check_platforms Arachni::Page.from_data(
22
+ url: 'http://stuff.com/blah',
23
+ response: { headers: { 'X-Powered-By' => 'Django' } }
24
+ )
25
+ end
26
+ end
27
+
28
+ context 'when there are X-Django headers' do
29
+ it 'identifies it as Django' do
30
+ check_platforms Arachni::Page.from_data(
31
+ url: 'http://stuff.com/blah',
32
+ response: { headers: { 'X-Django-Stuff' => 'Blah' } }
33
+ )
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arachni::Platform::Fingerprinters::JSF do
4
+ include_examples 'fingerprinter'
5
+
6
+ def platforms
7
+ [:java, :jsf]
8
+ end
9
+
10
+ context 'when there is an X-Powered-By header with JSF' do
11
+ it 'identifies it as JSF' do
12
+ check_platforms Arachni::Page.from_data(
13
+ url: 'http://stuff.com/blah',
14
+ response: { headers: { 'X-Powered-By' => 'JSF/2.1' } }
15
+ )
16
+ end
17
+ end
18
+
19
+ context 'when there is a javax.faces.Token query parameter' do
20
+ it 'identifies it as JSF' do
21
+ check_platforms Arachni::Page.from_data(
22
+ url: 'http://stuff.com/blah?javax.faces.Token=stuff'
23
+ )
24
+ end
25
+ end
26
+
27
+ end
@@ -3,40 +3,37 @@ require 'spec_helper'
3
3
  describe Arachni::Platform::Fingerprinters::Rack do
4
4
  include_examples 'fingerprinter'
5
5
 
6
+ def platforms
7
+ [:ruby, :rack]
8
+ end
9
+
6
10
  context 'when there is a rack.session cookie' do
7
11
  it 'identifies it as Rack' do
8
- page = Arachni::Page.from_data(
12
+ check_platforms Arachni::Page.from_data(
9
13
  url: 'http://stuff.com/blah',
10
14
  cookies: [Arachni::Cookie.new(
11
15
  url: 'http://stuff.com/blah',
12
16
  inputs: { 'rack.session' => 'stuff' } )]
13
17
 
14
18
  )
15
- platforms_for( page ).should include :ruby
16
- platforms_for( page ).should include :rack
17
19
  end
18
20
  end
19
21
 
20
- context 'when there is a Server header' do
22
+ context 'when there is an X-Powered-By header' do
21
23
  it 'identifies it as Rack' do
22
- page = Arachni::Page.from_data(
24
+ check_platforms Arachni::Page.from_data(
23
25
  url: 'http://stuff.com/blah',
24
- response: { headers: { 'Server' => 'mod_rack' } }
26
+ response: { headers: { 'X-Powered-By' => 'mod_rack' } }
25
27
  )
26
- platforms_for( page ).should include :ruby
27
- platforms_for( page ).should include :rack
28
28
  end
29
29
  end
30
30
 
31
- context 'when there is an X-Powered-By header' do
31
+ context 'when there is an X-Rack-* header' do
32
32
  it 'identifies it as Rack' do
33
- page = Arachni::Page.from_data(
33
+ check_platforms Arachni::Page.from_data(
34
34
  url: 'http://stuff.com/blah',
35
- response: { headers: { 'X-Powered-By' => 'mod_rack' } }
35
+ response: { headers: { 'X-Rack-Stuff' => 'Blah' } }
36
36
  )
37
- platforms_for( page ).should include :ruby
38
- platforms_for( page ).should include :rack
39
37
  end
40
38
  end
41
-
42
39
  end