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
@@ -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