arachni 1.1 → 1.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -6,6 +6,10 @@ get '/' do
6
6
  'Match this!'
7
7
  end
8
8
 
9
+ get '/s.php' do
10
+ 'OK'
11
+ end
12
+
9
13
  get '/each_candidate_element' do
10
14
  cookies['cookie-input'] = 'blah'
11
15
 
@@ -13,7 +13,7 @@ get '/' do
13
13
  </div>
14
14
 
15
15
  <script>
16
- document.getElementById('container').innerHTML = document.cookie;
16
+ document.getElementById('container').innerHTML = decodeURIComponent(document.cookie);
17
17
  </script>
18
18
  </body>
19
19
  </html>
@@ -37,6 +37,11 @@ get '/http_response_max_size' do
37
37
  '1' * 1000000
38
38
  end
39
39
 
40
+ get '/http_response_max_size/without_content_length' do
41
+ headers 'Content-Type' => ''
42
+ '1' * 1000000
43
+ end
44
+
40
45
  get '/auth/simple-chars' do
41
46
  simple_protected!
42
47
  'authenticated!'
@@ -1,5 +1,7 @@
1
1
  require 'sinatra'
2
2
 
3
+ @@erratic = 0
4
+
3
5
  def handler_response_1
4
6
  "Random #{rand( 999 ).to_s} bits #{rand( 999 ).to_s} go #{rand( 999 ).to_s} here #{rand( 999 ).to_s}"
5
7
  end
@@ -21,6 +23,17 @@ get '/static/*' do
21
23
  'This is a custom 404, try to catch it. ;)'
22
24
  end
23
25
 
26
+ get '/dynamic/erratic/*' do
27
+ if @@erratic > 3
28
+ return 500
29
+ end
30
+
31
+ @@erratic += 1
32
+
33
+ 'This is a custom 404 which includes the requested resource, try to catch it. ;)' +
34
+ '<br/>You asked for "' + params[:splat].first.to_s + '", which could not be found.'
35
+ end
36
+
24
37
  get '/dynamic/*' do
25
38
  'This is a custom 404 which includes the requested resource, try to catch it. ;)' +
26
39
  '<br/>You asked for "' + params[:splat].first.to_s + '", which could not be found.'
@@ -8,7 +8,7 @@ REGEXP = {
8
8
  perl: 'sleep\s?\((\d+)\/(\d+)\s?\);',
9
9
  python: 'import time;time.sleep\s?\((\d+)\/(\d+)\s?\);',
10
10
  asp: 'Thread\.Sleep\s?\((\d+)\s?\);',
11
- jsp: 'Thread\.sleep\s?\((\d+)\s?\);',
11
+ java: 'Thread\.sleep\s?\((\d+)\s?\);',
12
12
  ruby: 'sleep\s?\((\d+)\/(\d+)\s?\)'
13
13
  }
14
14
 
@@ -13,7 +13,7 @@ FILE_TO_PLATFORM = {
13
13
  '/winnt/win.ini' => :windows,
14
14
  '/etc/passwd' => :unix,
15
15
  '/proc/self/environ' => :unix,
16
- '/WEB-INF/web.xml' => :tomcat
16
+ '/WEB-INF/web.xml' => :java
17
17
  }
18
18
 
19
19
  OUT = {
@@ -43,7 +43,7 @@ CMCDLLNAME32=mapi32.dll
43
43
  CMCDLLNAME=mapi.dll
44
44
  MAPIX=1
45
45
  ',
46
- tomcat: '<?xml version="1.0" encoding="UTF-8"?>
46
+ java: '<?xml version="1.0" encoding="UTF-8"?>
47
47
  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
48
48
  <display-name>VulnerabilityDetectionChallenge</display-name>
49
49
  <welcome-file-list>
@@ -13,7 +13,7 @@ FILE_TO_PLATFORM = {
13
13
  '/winnt/win.ini' => :windows,
14
14
  '/etc/passwd' => :unix,
15
15
  '/proc/self/environ' => :unix,
16
- '/WEB-INF/web.xml' => :tomcat
16
+ '/WEB-INF/web.xml' => :java
17
17
  }
18
18
 
19
19
  OUT = {
@@ -43,7 +43,7 @@ CMCDLLNAME32=mapi32.dll
43
43
  CMCDLLNAME=mapi.dll
44
44
  MAPIX=1
45
45
  ',
46
- tomcat: '<?xml version="1.0" encoding="UTF-8"?>
46
+ java: '<?xml version="1.0" encoding="UTF-8"?>
47
47
  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
48
48
  <display-name>VulnerabilityDetectionChallenge</display-name>
49
49
  <welcome-file-list>
@@ -5,18 +5,24 @@ require 'sinatra'
5
5
  require 'sinatra/contrib'
6
6
 
7
7
  def default
8
- "default.html"
8
+ 'default.html'
9
9
  end
10
10
 
11
11
  OUT = {
12
- php: '<?php
12
+ php: '<?php
13
13
  $q = $_GET["q"];',
14
- jsp: 'response.setIntHeader( "test" )',
15
- asp: 'Response.Write "stuff"'
14
+ java: 'response.setIntHeader( "test" )',
15
+ asp: 'Response.Write "stuff"'
16
+ }
17
+
18
+ EXTENSIONS = {
19
+ php: 'php',
20
+ java: 'jsp',
21
+ asp: 'asp'
16
22
  }
17
23
 
18
24
  def get_variations( language, str )
19
- return if !str.to_s.end_with? ".#{language}"
25
+ return if !str.to_s.end_with? ".#{EXTENSIONS[language]}"
20
26
  OUT[language]
21
27
  end
22
28
 
@@ -36,6 +42,7 @@ before do
36
42
  end
37
43
 
38
44
  OUT.keys.each do |language|
45
+ ext = EXTENSIONS[language]
39
46
 
40
47
  get "/#{language}" do
41
48
  cookies['cookie'] ||= default
@@ -53,29 +60,29 @@ OUT.keys.each do |language|
53
60
 
54
61
  get "/#{language}/link" do
55
62
  <<-EOHTML
56
- <a href="/#{language}/link/straight.#{language}?input=#{default}">Link</a>
57
- <a href="/#{language}/link/with_null.#{language}?input=#{default}">Link</a>
63
+ <a href="/#{language}/link/straight.#{ext}?input=#{default}">Link</a>
64
+ <a href="/#{language}/link/with_null.#{ext}?input=#{default}">Link</a>
58
65
  EOHTML
59
66
  end
60
67
 
61
- get "/#{language}/link/straight.#{language}" do
68
+ get "/#{language}/link/straight.#{ext}" do
62
69
  return if params['input'].include?( "\0" )
63
70
  get_variations( language, params['input'] )
64
71
  end
65
72
 
66
- get "/#{language}/link/with_null.#{language}" do
73
+ get "/#{language}/link/with_null.#{ext}" do
67
74
  return if !params['input'].end_with?( "\00.html" )
68
75
  get_variations( language, params['input'].split( "\0.html" ).first )
69
76
  end
70
77
 
71
78
  get "/#{language}/link-template" do
72
79
  <<-EOHTML
73
- <a href="/#{language}/link-template/straight/input/default/stuff.#{language}">Link</a>
74
- <a href="/#{language}/link-template/append/input/default/stuff.#{language}">Link</a>
80
+ <a href="/#{language}/link-template/straight/input/default/stuff.#{ext}">Link</a>
81
+ <a href="/#{language}/link-template/append/input/default/stuff.#{ext}">Link</a>
75
82
  EOHTML
76
83
  end
77
84
 
78
- get "/#{language}/link-template/straight/input/*/stuff.#{language}" do
85
+ get "/#{language}/link-template/straight/input/*/stuff.#{ext}" do
79
86
  val = params[:splat].first
80
87
  default = 'default'
81
88
  return if val.start_with?( default )
@@ -83,7 +90,7 @@ OUT.keys.each do |language|
83
90
  get_variations( language, val.split( default ).last )
84
91
  end
85
92
 
86
- get "/#{language}/link-template/with_null/input/*/stuff.#{language}" do
93
+ get "/#{language}/link-template/with_null/input/*/stuff.#{ext}" do
87
94
  val = params[:splat].first
88
95
  return if !val.end_with?( "\00.html" )
89
96
  get_variations( language, val.split( "\0.html" ).first )
@@ -91,44 +98,44 @@ OUT.keys.each do |language|
91
98
 
92
99
  get "/#{language}/form" do
93
100
  <<-EOHTML
94
- <form action="/#{language}/form/straight.#{language}" method='post'>
101
+ <form action="/#{language}/form/straight.#{ext}" method='post'>
95
102
  <input name='input' value='#{default}' />
96
103
  </form>
97
104
 
98
- <form action="/#{language}/form/with_null.#{language}" method='post'>
105
+ <form action="/#{language}/form/with_null.#{ext}" method='post'>
99
106
  <input name='input' value='#{default}' />
100
107
  </form>
101
108
 
102
109
  EOHTML
103
110
  end
104
111
 
105
- post "/#{language}/form/straight.#{language}" do
112
+ post "/#{language}/form/straight.#{ext}" do
106
113
  return if params['input'].include?( "\0" )
107
114
  get_variations( language, params['input'] )
108
115
  end
109
116
 
110
- post "/#{language}/form/with_null.#{language}" do
117
+ post "/#{language}/form/with_null.#{ext}" do
111
118
  return if !params['input'].end_with?( "\00.html" )
112
119
  get_variations( language, params['input'].split( "\0.html" ).first )
113
120
  end
114
121
 
115
122
  get "/#{language}/cookie" do
116
123
  <<-HTML
117
- <a href="/#{language}/cookie/straight.#{language}">Cookie</a>
124
+ <a href="/#{language}/cookie/straight.#{ext}">Cookie</a>
118
125
  HTML
119
126
  end
120
127
 
121
- get "/#{language}/cookie/straight.#{language}" do
128
+ get "/#{language}/cookie/straight.#{ext}" do
122
129
  get_variations( language, cookies['cookie'] )
123
130
  end
124
131
 
125
132
  get "/#{language}/header" do
126
133
  <<-EOHTML
127
- <a href="/#{language}/header/straight.#{language}">Header</a>
134
+ <a href="/#{language}/header/straight.#{ext}">Header</a>
128
135
  EOHTML
129
136
  end
130
137
 
131
- get "/#{language}/header/straight.#{language}" do
138
+ get "/#{language}/header/straight.#{ext}" do
132
139
  default = 'arachni_user'
133
140
  return if env['HTTP_USER_AGENT'].start_with?( default ) || env['HTTP_USER_AGENT'].include?( "\0" )
134
141
 
@@ -139,23 +146,23 @@ OUT.keys.each do |language|
139
146
  <<-EOHTML
140
147
  <script type="application/javascript">
141
148
  http_request = new XMLHttpRequest();
142
- http_request.open( "POST", "/#{language}/json/straight.#{language}", true);
149
+ http_request.open( "POST", "/#{language}/json/straight.#{ext}", true);
143
150
  http_request.send( '{"input": "#{default}"}' );
144
151
 
145
152
  http_request = new XMLHttpRequest();
146
- http_request.open( "POST", "/#{language}/json/with_null.#{language}", true);
153
+ http_request.open( "POST", "/#{language}/json/with_null.#{ext}", true);
147
154
  http_request.send( '{"input": "#{default}"}' );
148
155
  </script>
149
156
  EOHTML
150
157
  end
151
158
 
152
- post "/#{language}/json/straight.#{language}" do
159
+ post "/#{language}/json/straight.#{ext}" do
153
160
  return if !@json
154
161
  return if @json['input'].include?( "\0" )
155
162
  get_variations( language, @json['input'] )
156
163
  end
157
164
 
158
- post "/#{language}/json/with_null.#{language}" do
165
+ post "/#{language}/json/with_null.#{ext}" do
159
166
  return if !@json
160
167
  return if !@json['input'].end_with?( "\00.html" )
161
168
 
@@ -166,25 +173,25 @@ OUT.keys.each do |language|
166
173
  <<-EOHTML
167
174
  <script type="application/javascript">
168
175
  http_request = new XMLHttpRequest();
169
- http_request.open( "POST", "/#{language}/xml/text/straight.#{language}", true);
176
+ http_request.open( "POST", "/#{language}/xml/text/straight.#{ext}", true);
170
177
  http_request.send( '<input>#{default}</input>' );
171
178
 
172
179
  http_request = new XMLHttpRequest();
173
- http_request.open( "POST", "/#{language}/xml/text/with_null.#{language}", true);
180
+ http_request.open( "POST", "/#{language}/xml/text/with_null.#{ext}", true);
174
181
  http_request.send( '<input>#{default}</input>' );
175
182
 
176
183
  http_request = new XMLHttpRequest();
177
- http_request.open( "POST", "/#{language}/xml/attribute/straight.#{language}", true);
184
+ http_request.open( "POST", "/#{language}/xml/attribute/straight.#{ext}", true);
178
185
  http_request.send( '<input my-attribute="#{default}">stuff</input>' );
179
186
 
180
187
  http_request = new XMLHttpRequest();
181
- http_request.open( "POST", "/#{language}/xml/attribute/with_null.#{language}", true);
188
+ http_request.open( "POST", "/#{language}/xml/attribute/with_null.#{ext}", true);
182
189
  http_request.send( '<input my-attribute="#{default}">stuff</input>' );
183
190
  </script>
184
191
  EOHTML
185
192
  end
186
193
 
187
- post "/#{language}/xml/text/straight.#{language}" do
194
+ post "/#{language}/xml/text/straight.#{ext}" do
188
195
  return if !@xml
189
196
 
190
197
  input = @xml.css('input').first.content
@@ -194,7 +201,7 @@ OUT.keys.each do |language|
194
201
  get_variations( language, input )
195
202
  end
196
203
 
197
- post "/#{language}/xml/text/with_null.#{language}" do
204
+ post "/#{language}/xml/text/with_null.#{ext}" do
198
205
  return if !@xml
199
206
 
200
207
  input = @xml.css('input').first.content
@@ -204,7 +211,7 @@ OUT.keys.each do |language|
204
211
  get_variations( language, input.split( "\00.html" ).last )
205
212
  end
206
213
 
207
- post "/#{language}/xml/attribute/straight.#{language}" do
214
+ post "/#{language}/xml/attribute/straight.#{ext}" do
208
215
  return if !@xml
209
216
 
210
217
  input = @xml.css('input').first['my-attribute']
@@ -214,7 +221,7 @@ OUT.keys.each do |language|
214
221
  get_variations( language, input )
215
222
  end
216
223
 
217
- post "/#{language}/xml/attribute/with_null.#{language}" do
224
+ post "/#{language}/xml/attribute/with_null.#{ext}" do
218
225
  return if !@xml
219
226
 
220
227
  input = @xml.css('input').first['my-attribute']
@@ -1,8 +1,7 @@
1
+ require 'ap'
1
2
  require 'sinatra'
2
3
  require 'sinatra/contrib'
3
4
 
4
- require 'ap'
5
-
6
5
  get '/' do
7
6
  <<-EOHTML
8
7
  <a href="/link?input=default">Link</a>
@@ -24,12 +23,12 @@ get "/link/straight" do
24
23
  return if params['input'].start_with?( default ) ||
25
24
  !params['input'].include?( '_arachni_trainer_' )
26
25
 
27
- redirect "/link/straight/trained"
26
+ redirect "/link/straight/redir"
28
27
  end
29
28
 
30
- get "/link/straight/trained" do
29
+ get "/link/straight/redir" do
31
30
  <<-EOHTML
32
- <a href="new stuff">Stuff</a>
31
+ <a href="trained">Stuff</a>
33
32
  EOHTML
34
33
  end
35
34
 
@@ -38,12 +37,12 @@ get "/link/append" do
38
37
  return if !params['input'].start_with?( default ) ||
39
38
  !params['input'].include?( '_arachni_trainer_' )
40
39
 
41
- redirect "/link/append/trained"
40
+ redirect "/link/append/redir"
42
41
  end
43
42
 
44
- get "/link/append/trained" do
43
+ get "/link/append/redir" do
45
44
  <<-EOHTML
46
- <a href="more new stuff">Stuff</a>
45
+ <a href="trained">Stuff</a>
47
46
  EOHTML
48
47
  end
49
48
 
@@ -68,7 +67,7 @@ end
68
67
 
69
68
  get "/form/straight/trained" do
70
69
  <<-EOHTML
71
- <form action="?new stuff"/>Stuff</form>
70
+ <form action="?new_stuff"/>Stuff</form>
72
71
  EOHTML
73
72
  end
74
73
 
@@ -81,7 +80,7 @@ end
81
80
 
82
81
  get "/form/append/trained" do
83
82
  <<-EOHTML
84
- <form action="?more new stuff"/>Stuff</form>
83
+ <form action="?more_new_stuff"/>Stuff</form>
85
84
  EOHTML
86
85
  end
87
86
 
@@ -77,7 +77,7 @@ get '/form/straight' do
77
77
  end
78
78
 
79
79
  get '/cookie' do
80
- headers 'Set-Cookie' => 'input=value'
80
+ headers 'Set-Cookie' => 'input=default'
81
81
 
82
82
  <<-EOHTML
83
83
  <a href="/cookie/straight">Form</a>
@@ -99,7 +99,7 @@ get '/cookie/straight' do
99
99
  var c = ca[i].trim();
100
100
 
101
101
  if( c.indexOf( name ) == 0 ) {
102
- return c.substring( name.length, c.length )
102
+ return decodeURIComponent( c.substring( name.length, c.length ) )
103
103
  }
104
104
  }
105
105
 
@@ -107,8 +107,11 @@ get '/cookie/straight' do
107
107
  }
108
108
 
109
109
  url = getCookie('input');
110
- if( url.indexOf( 'http' ) != 0 ) url = 'http://' + url;
111
- window.location = url;
110
+
111
+ if( url != 'default' ) {
112
+ if( url.indexOf( 'http' ) != 0 ) url = 'http://' + url;
113
+ window.location = url;
114
+ }
112
115
  </script>
113
116
  </body>
114
117
  EOHTML
@@ -52,6 +52,7 @@ get '/link' do
52
52
  <a href="/link/in_comment?input=default">Link</a>
53
53
  <a href="/link/in_textfield?input=default">Link</a>
54
54
  <a href="/link/straight?input=default">Link</a>
55
+ <a href="/link/double_encoded?input=default">Link</a>
55
56
  <a href="/link/append?input=default">Link</a>
56
57
  <a href="/link/dom?input=default">Link</a>
57
58
  EOHTML
@@ -76,6 +77,10 @@ get '/link/straight' do
76
77
  get_variations( params['input'].split( default ).last )
77
78
  end
78
79
 
80
+ get '/link/double_encoded' do
81
+ get_variations( URI.decode( params['input'] ) )
82
+ end
83
+
79
84
  get '/link/append' do
80
85
  default = 'default'
81
86
  return if !params['input'].start_with?( default )
@@ -91,6 +96,7 @@ get '/link-template' do
91
96
  <<-EOHTML
92
97
  <a href="/link-template/in_comment/input/default/stuff">Link</a>
93
98
  <a href="/link-template/straight/input/default/stuff">Link</a>
99
+ <a href="/link-template/double_encoded/input/default/stuff">Link</a>
94
100
  <a href="/link-template/append/input/default/stuff">Link</a>
95
101
  <a href="/link-template/dom/input/default/stuff">Link</a>
96
102
  EOHTML
@@ -112,6 +118,11 @@ get '/link-template/straight/input/*/stuff' do
112
118
  get_variations( val.split( default ).last )
113
119
  end
114
120
 
121
+ get '/link-template/double_encoded/input/*/stuff' do
122
+ val = params[:splat].first
123
+ get_variations( URI.decode( val ) )
124
+ end
125
+
115
126
  get '/link-template/append/input/*/stuff' do
116
127
  val = params[:splat].first
117
128
  default = 'default'
@@ -135,6 +146,10 @@ get '/form' do
135
146
  <input name='input' value='default' />
136
147
  </form>
137
148
 
149
+ <form action="/form/double_encoded">
150
+ <input name='input' value='default' />
151
+ </form>
152
+
138
153
  <form action="/form/append">
139
154
  <input name='input' value='default' />
140
155
  </form>
@@ -162,6 +177,10 @@ get '/form/straight' do
162
177
  get_variations( params['input'].split( default ).last )
163
178
  end
164
179
 
180
+ get '/form/double_encoded' do
181
+ get_variations( URI.decode( params['input'].to_s ) )
182
+ end
183
+
165
184
  get '/form/append' do
166
185
  default = 'default'
167
186
  return if !params['input'] || !params['input'].start_with?( default )
@@ -174,6 +193,7 @@ get '/cookie' do
174
193
  <<-EOHTML
175
194
  <a href="/cookie/in_comment">Cookie</a>
176
195
  <a href="/cookie/straight">Cookie</a>
196
+ <a href="/cookie/double_encoded">Cookie</a>
177
197
  <a href="/cookie/append">Cookie</a>
178
198
  <a href="/cookie/dom">Cookie</a>
179
199
  EOHTML
@@ -204,6 +224,13 @@ get '/cookie/straight' do
204
224
  get_variations( cookies['cookie'].split( default ).last )
205
225
  end
206
226
 
227
+ get '/cookie/double_encoded' do
228
+ default = 'cookie value'
229
+ cookies['cookie'] ||= default
230
+
231
+ get_variations( URI.decode( cookies['cookie'] ) )
232
+ end
233
+
207
234
  get '/cookie/append' do
208
235
  default = 'cookie value'
209
236
  cookies['cookie2'] ||= default
@@ -216,6 +243,7 @@ get '/header' do
216
243
  <<-EOHTML
217
244
  <a href="/header/straight">Header</a>
218
245
  <a href="/header/append">Header</a>
246
+ <a href="/header/double_encoded">Header</a>
219
247
  <a href="/header/dom">Header</a>
220
248
  EOHTML
221
249
  end
@@ -231,6 +259,13 @@ get '/header/straight' do
231
259
  get_variations( env['HTTP_USER_AGENT'].split( default ).last )
232
260
  end
233
261
 
262
+ get '/header/double_encoded' do
263
+ default = 'arachni_user'
264
+ return if !env['HTTP_USER_AGENT']
265
+
266
+ get_variations( URI.decode( env['HTTP_USER_AGENT'] ) )
267
+ end
268
+
234
269
  get '/header/append' do
235
270
  default = 'arachni_user'
236
271
  return if !env['HTTP_USER_AGENT'] || !env['HTTP_USER_AGENT'].start_with?( default )