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,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe name_from_filename do
4
+ include_examples 'plugin'
5
+
6
+ before( :all ) do
7
+ options.url = url
8
+ end
9
+
10
+ it 'audits only the page at the specific DOM state' do
11
+ options.plugins[component_name] = { 'fragment' => 'stuff/blah' }
12
+
13
+ run
14
+ framework.sitemap.should == { "#{options.url}#stuff/blah" => 200 }
15
+ end
16
+ end
@@ -45,6 +45,16 @@ describe name_from_filename do
45
45
  'type' => 'header',
46
46
  'action' => "#{url}header",
47
47
  'inputs' => { 'User-Agent' => "Blah/2" }
48
+ },
49
+ {
50
+ 'type' => 'json',
51
+ 'action' => "#{url}json",
52
+ 'source' => '{"name": "value"}'
53
+ },
54
+ {
55
+ 'type' => 'xml',
56
+ 'action' => "#{url}xml",
57
+ 'source' => '<forgot><username>admin</username></forgot>'
48
58
  }
49
59
  ]
50
60
  end
@@ -116,9 +126,37 @@ describe name_from_filename do
116
126
 
117
127
  oks += 1
118
128
  end
129
+
130
+ if page.jsons.any?
131
+ json = v.select { |vector| vector['type'] == 'json' }.first
132
+ page.jsons.first.action.should == json['action']
133
+ page.jsons.first.source.should == json['source']
134
+ page.jsons.first.inputs.should == { 'name' => 'value' }
135
+
136
+ page.url.should == json['action']
137
+ page.code.should == 200
138
+ page.body.should == ''
139
+
140
+ oks += 1
141
+ end
142
+
143
+ if page.xmls.any?
144
+ xml = v.select { |vector| vector['type'] == 'xml' }.first
145
+ page.xmls.first.action.should == xml['action']
146
+ page.xmls.first.source.should == xml['source']
147
+ page.xmls.first.inputs.should == {
148
+ 'forgot > username > text()' => 'admin'
149
+ }
150
+
151
+ page.url.should == xml['action']
152
+ page.code.should == 200
153
+ page.body.should == ''
154
+
155
+ oks += 1
156
+ end
119
157
  end
120
158
 
121
- oks.should == 5
159
+ oks.should == 7
122
160
  end
123
161
 
124
162
  def run_test
@@ -1,9 +1,14 @@
1
1
  Factory.define :dom_data do
2
2
  {
3
- skip_states: Arachni::Support::LookUp::HashSet.new.tap { |h| h << 0 },
4
- transitions: [ Factory[:transition]],
5
- digest: 'stuff',
6
- data_flow_sinks: [ Factory[:data_flow] ],
3
+ skip_states: Arachni::Support::LookUp::HashSet.new.tap { |h| h << 0 },
4
+ transitions: [
5
+ Factory[:page_load_with_cookies_transition].complete,
6
+ Factory[:request_transition].complete,
7
+ Factory[:input_transition].complete,
8
+ Factory[:form_input_transition].complete
9
+ ],
10
+ digest: 'stuff',
11
+ data_flow_sinks: [ Factory[:data_flow] ],
7
12
  execution_flow_sinks: [ Factory[:execution_flow] ]
8
13
  }
9
14
  end
@@ -7,13 +7,11 @@ Factory.define :running_transition do
7
7
  end
8
8
 
9
9
  Factory.define :completed_transition do
10
- Arachni::Page::DOM::Transition.new( :page, :load,
11
- extra: {
12
- options: {
13
- stuff: 'here'
14
- }
15
- }
16
- ).complete
10
+ Arachni::Page::DOM::Transition.new( :page, :load, stuff: 'here' ).complete
11
+ end
12
+
13
+ Factory.define :request_transition do
14
+ Arachni::Page::DOM::Transition.new( 'http://test.com', :request )
17
15
  end
18
16
 
19
17
  Factory.define :empty_transition do
@@ -24,6 +22,16 @@ Factory.define :empty_transition do
24
22
  Arachni::Page::DOM::Transition.new
25
23
  end
26
24
 
25
+ Factory.define :page_load_with_cookies_transition do
26
+ Arachni::Page::DOM::Transition.new(
27
+ :page, :load,
28
+ url: 'http://a-url.com/?myvar=my%20value',
29
+ cookies: {
30
+ 'myname' => 'myvalue'
31
+ }
32
+ )
33
+ end
34
+
27
35
  Factory.define :input_transition do
28
36
  Arachni::Page::DOM::Transition.new(
29
37
  Arachni::Browser::ElementLocator.new(
@@ -35,8 +43,22 @@ Factory.define :input_transition do
35
43
  }
36
44
  ),
37
45
  :input,
38
- options: {
39
- value: "<some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2></some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2> "
46
+ value: "<some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2></some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2> "
47
+ )
48
+ end
49
+
50
+ Factory.define :form_input_transition do
51
+ Arachni::Page::DOM::Transition.new(
52
+ Arachni::Browser::ElementLocator.new(
53
+ tag_name: :form,
54
+ attributes: {
55
+ "id" => "my-form",
56
+ "name" => "my-form"
57
+ }
58
+ ),
59
+ :submit,
60
+ inputs: {
61
+ 'input-name' => "<some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2></some_dangerous_input_a9838b473d1f6db80b6342d1c61f9fa2> "
40
62
  }
41
63
  )
42
64
  end
@@ -1,13 +1,15 @@
1
1
  Factory.define :report_data do
2
+ issues = Arachni::Data::Issues.new
3
+
4
+ (0..10).map do |i|
5
+ issues << Factory[:passive_issue].tap { |issue| issue.vector.action += i.to_s }
6
+ issues << Factory[:active_issue].tap { |issue| issue.vector.action += i.to_s }
7
+ end
8
+
2
9
  {
3
10
  options: Arachni::Options.to_hash,
4
11
  sitemap: { Arachni::Options.url => 200 },
5
- issues: (0..10).map do |i|
6
- [
7
- Factory[:passive_issue].tap { |issue| issue.vector.action += i.to_s },
8
- Factory[:active_issue].tap { |issue| issue.vector.action += i.to_s }
9
- ]
10
- end.flatten,
12
+ issues: issues,
11
13
  plugins: {
12
14
  plugin_name: {
13
15
  results: 'stuff',
@@ -0,0 +1,18 @@
1
+ =begin
2
+ Copyright 2010-2015 Tasos Laskos <tasos.laskos@arachni-scanner.com>
3
+
4
+ This file is part of the Arachni Framework project and is subject to
5
+ redistribution and commercial restrictions. Please see the Arachni Framework
6
+ web site for more information on licensing and terms of use.
7
+ =end
8
+
9
+ class Arachni::Reporters::Error < Arachni::Reporter::Base
10
+
11
+ def run
12
+ fail
13
+ end
14
+
15
+ def self.info
16
+ super.merge( options: [ Options.outfile( 'foo' ) ] )
17
+ end
18
+ end
@@ -2,7 +2,8 @@ require 'sinatra'
2
2
  require 'sinatra/contrib'
3
3
  require_relative '../../../../lib/arachni'
4
4
 
5
- @@hit_count ||= 0
5
+ @@hit_count ||= 0
6
+ @@image_hit_count ||= 0
6
7
 
7
8
  get '/' do
8
9
  @@hit_count += 1
@@ -27,6 +28,111 @@ get '/' do
27
28
  HTML
28
29
  end
29
30
 
31
+ get '/If-None-Match' do
32
+ etag '1'
33
+
34
+ <<HTML
35
+ <html>
36
+ <script src="/If-None-Match/asset"></script>
37
+
38
+ <body>
39
+ </body>
40
+ </html>
41
+ HTML
42
+ end
43
+
44
+ get '/If-None-Match/asset' do
45
+ etag '1'
46
+ ''
47
+ end
48
+
49
+ get '/If-Modified-Since' do
50
+ last_modified Time.now - 24*60*60
51
+ expires -1
52
+
53
+ <<HTML
54
+ <html>
55
+ <script src="/If-Modified-Since/asset"></script>
56
+
57
+ <body>
58
+ </body>
59
+ </html>
60
+ HTML
61
+ end
62
+
63
+ get '/If-Modified-Since/asset' do
64
+ last_modified Time.now - 24*60*60
65
+ expires -1
66
+
67
+ ''
68
+ end
69
+
70
+ get '/wait_for_elements' do
71
+ <<HTML
72
+ <html>
73
+ <body>
74
+ </body>
75
+
76
+ <script>
77
+ setInterval( function(){ document.write( '<button id="matchThis" />' ); }, 5000 );
78
+ </script>
79
+ </html>
80
+ HTML
81
+ end
82
+
83
+ get '/asset_domains' do
84
+ end
85
+
86
+ get '/asset_domains/link' do
87
+ <<HTML
88
+ <html>
89
+ <body>
90
+ <link href="http://blah.link.stuff/link.css" />
91
+ </body>
92
+ </html>
93
+ HTML
94
+ end
95
+
96
+ get '/asset_domains/input' do
97
+ <<HTML
98
+ <html>
99
+ <body>
100
+ <input type="image" src="http://blah.input.stuff/input.png" />
101
+ </body>
102
+ </html>
103
+ HTML
104
+ end
105
+
106
+ get '/asset_domains/script' do
107
+ <<HTML
108
+ <html>
109
+ <body>
110
+ <script src="http://blah.script.stuff/script"></script>
111
+ </body>
112
+ </html>
113
+ HTML
114
+ end
115
+
116
+ get '/asset_domains/img' do
117
+ <<HTML
118
+ <html>
119
+ <body>
120
+ <img src="http://blah.img.stuff/img.png" />
121
+ </body>
122
+ </html>
123
+ HTML
124
+ end
125
+
126
+ get '/asset_domains/extension/js' do
127
+ <<HTML
128
+ <html>
129
+ <body>
130
+ <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
131
+ </body>
132
+ </html>
133
+ HTML
134
+ end
135
+
30
136
  get '/ajax_sleep' do
31
137
  <<HTML
32
138
  <html>
@@ -286,6 +392,10 @@ get '/fire_event/form/image-input' do
286
392
  HTML
287
393
  end
288
394
 
395
+ get '/test.png' do
396
+ @@image_hit_count += 1
397
+ end
398
+
289
399
  Arachni::Browser::Javascript::EVENTS_PER_ELEMENT[:input].each do |event|
290
400
  get "/fire_event/input/#{event}" do
291
401
  <<-EOHTML
@@ -367,7 +477,7 @@ get '/form-with-image-button' do
367
477
  <html>
368
478
  <form>
369
479
  <input type="text" name="stuff" value="blah">
370
- <input type="image" name="myImageButton" src="/__sinatra__/404.png">
480
+ <input type="image" name="myImageButton" src="/test.png">
371
481
  </form>
372
482
  </html>
373
483
  HTML
@@ -697,14 +807,6 @@ get '/dom-cookies-values' do
697
807
  HTML
698
808
  end
699
809
 
700
- get '/image.png' do
701
- @@image_hit = true
702
- end
703
-
704
- get '/image-hit' do
705
- @@image_hit.to_s
706
- end
707
-
708
810
  get '/explore' do
709
811
  <<HTML
710
812
  <html>
@@ -936,6 +1038,10 @@ get '/hit-count' do
936
1038
  @@hit_count.to_s
937
1039
  end
938
1040
 
1041
+ get '/image-hit-count' do
1042
+ @@image_hit_count.to_s
1043
+ end
1044
+
939
1045
  get '/clear-hit-count' do
940
- @@hit_count = 0
1046
+ @@image_hit_count = @@hit_count = 0
941
1047
  end
@@ -1,6 +1,8 @@
1
1
  require 'sinatra'
2
2
  require 'sinatra/contrib'
3
3
 
4
+ JS_LIB = "#{File.dirname( __FILE__ )}/"
5
+
4
6
  get '/' do
5
7
  <<HTML
6
8
  <html>
@@ -85,11 +87,21 @@ get '/intervals' do
85
87
  HTML
86
88
  end
87
89
 
88
- get '/elements_with_events' do
90
+ get '/elements_with_events/attributes' do
89
91
  <<HTML
90
- <button onclick="handler_1()" id="my-button">Click me</button>
91
- <button onclick="handler_2()" id="my-button2">Click me too</button>
92
- <button onclick="handler_3()" id="my-button3">Don't bother clicking me</button>
92
+ <body>
93
+ <button onclick="handler_1()" id="my-button">Click me</button>
94
+ <button onclick="handler_2()" id="my-button2">Click me too</button>
95
+ <button onclick="handler_3()" id="my-button3">Don't bother clicking me</button>
96
+ </body>
97
+ HTML
98
+ end
99
+
100
+ get '/elements_with_events/listeners' do
101
+ <<HTML
102
+ <button id="my-button">Click me</button>
103
+ <button id="my-button2">Click me too</button>
104
+ <button id="my-button3">Don't bother clicking me</button>
93
105
 
94
106
  <script>
95
107
  document.getElementById( "my-button" ).addEventListener( "click", function( my_button_click ){}, false );
@@ -101,6 +113,121 @@ get '/elements_with_events' do
101
113
  HTML
102
114
  end
103
115
 
116
+ get '/elements_with_events/listeners/custom' do
117
+ <<HTML
118
+ <button id="my-button">Click me</button>
119
+
120
+ <script>
121
+ document.getElementById( "my-button" ).addEventListener( "custom_event", function(){}, false );
122
+ </script>
123
+ HTML
124
+ end
125
+
126
+ get '/elements_with_events/jQuery.on' do
127
+ <<HTML
128
+ <script src="/jquery.js"></script>
129
+
130
+ <body>
131
+ <button id="my-button">Click me</button>
132
+ </body>
133
+
134
+ <script>
135
+ $('#my-button').on( 'click', function (){});
136
+ </script>
137
+ HTML
138
+ end
139
+
140
+ get '/elements_with_events/jQuery.on-object-types' do
141
+ <<HTML
142
+ <script src="/jquery.js"></script>
143
+
144
+ <body>
145
+ <button id="my-button">Click me</button>
146
+ </body>
147
+
148
+ <script>
149
+ $('#my-button').on({
150
+ click: function (){},
151
+ hover: function (){}
152
+ });
153
+ </script>
154
+ HTML
155
+ end
156
+
157
+ get '/elements_with_events/jQuery.on-selector' do
158
+ <<HTML
159
+ <script src="/jquery.js"></script>
160
+
161
+ <body id='body'>
162
+ <script>
163
+ $('body').on( 'click', '#my-button', function (){
164
+
165
+ });
166
+
167
+ $('body').on( 'hover', '#my-button', function (){
168
+
169
+ });
170
+
171
+ $('body').on( 'click', '#my-button-2', function (){
172
+
173
+ });
174
+ </script>
175
+
176
+ <button id="my-button">Click me</button>
177
+ <button id="my-button-2">Click me</button>
178
+ </body>
179
+ HTML
180
+ end
181
+
182
+ get '/elements_with_events/jQuery.on-object-types-selector' do
183
+ <<HTML
184
+ <script src="/jquery.js"></script>
185
+
186
+ <body id='body'>
187
+ <script>
188
+ $('body').on({
189
+ click: function (){},
190
+ hover: function (){}
191
+ }, '#my-button');
192
+ </script>
193
+
194
+ <button id="my-button">Click me</button>
195
+ <button id="my-button-2">Click me</button>
196
+ </body>
197
+ HTML
198
+ end
199
+
200
+ get '/elements_with_events/jQuery.delegate' do
201
+ <<HTML
202
+ <script src="/jquery.js"></script>
203
+
204
+ <body id='body'>
205
+ <script>
206
+ $('body').delegate( '#my-button', 'click', function (){});
207
+ </script>
208
+
209
+ <button id="my-button">Click me</button>
210
+ </body>
211
+ HTML
212
+ end
213
+
214
+ get '/elements_with_events/jQuery.delegate-object-types' do
215
+ <<HTML
216
+ <script src="/jquery.js"></script>
217
+
218
+ <body id='body'>
219
+ <script>
220
+ $('body').delegate( '#my-button', {
221
+ click: function (){},
222
+ hover: function (){}
223
+ });
224
+ </script>
225
+
226
+ <button id="my-button">Click me</button>
227
+ </body>
228
+ HTML
229
+ end
230
+
104
231
  get '/elements_with_events/with-hidden' do
105
232
  <<HTML
106
233
  <button onclick="handler_1()" id="my-button">Click me</button>
@@ -112,6 +239,18 @@ get '/elements_with_events/with-hidden' do
112
239
  HTML
113
240
  end
114
241
 
242
+ get '/elements_with_events/custom-dot-delimited' do
243
+ <<HTML
244
+ <script src="/jquery.js"></script>
245
+
246
+ <button id="my-button">Click me</button>
247
+
248
+ <script>
249
+ $('#my-button').on( 'click.stuff', function (){});
250
+ </script>
251
+ HTML
252
+ end
253
+
115
254
  get '/set_element_ids' do
116
255
  <<HTML
117
256
  <a name="1" href="by-ajax" id="by-ajax">Stuff 1</a>
@@ -126,3 +265,8 @@ get '/set_element_ids' do
126
265
  </script>
127
266
  HTML
128
267
  end
268
+
269
+ get '/jquery.js' do
270
+ content_type 'text/javascript'
271
+ IO.read "#{JS_LIB}/jquery-2.0.3.js"
272
+ end