watobo 0.9.21 → 0.9.23

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 (283) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -1
  3. data/bin/nfq_server.rb +0 -9
  4. data/bin/watobo_gui.rb +3 -13
  5. data/custom-views/prettify-json.rb +9 -18
  6. data/icons/watobo.ico +0 -0
  7. data/icons/watobo.ico.old +0 -0
  8. data/lib/watobo.rb +10 -19
  9. data/lib/watobo/adapters.rb +5 -14
  10. data/lib/watobo/adapters/data_store.rb +50 -59
  11. data/lib/watobo/adapters/file/file_store.rb +287 -296
  12. data/lib/watobo/adapters/file/marshal_store.rb +293 -296
  13. data/lib/watobo/adapters/session_store.rb +5 -14
  14. data/lib/watobo/ca.rb +1 -10
  15. data/lib/watobo/config.rb +197 -206
  16. data/lib/watobo/constants.rb +0 -9
  17. data/lib/watobo/core.rb +3 -12
  18. data/lib/watobo/core/active_check.rb +72 -135
  19. data/lib/watobo/core/active_checks.rb +49 -58
  20. data/lib/watobo/core/ca.rb +369 -389
  21. data/lib/watobo/core/cert_store.rb +34 -43
  22. data/lib/watobo/core/chat.rb +92 -101
  23. data/lib/watobo/core/chats.rb +271 -280
  24. data/lib/watobo/core/client_cert_store.rb +106 -35
  25. data/lib/watobo/core/conversation.rb +48 -57
  26. data/lib/watobo/core/cookie.rb +23 -32
  27. data/lib/watobo/core/egress_handlers.rb +98 -0
  28. data/lib/watobo/core/finding.rb +66 -75
  29. data/lib/watobo/core/findings.rb +107 -114
  30. data/lib/watobo/core/forwarding_proxy.rb +13 -22
  31. data/lib/watobo/core/fuzz_gen.rb +0 -9
  32. data/lib/watobo/core/intercept_carver.rb +166 -177
  33. data/lib/watobo/core/intercept_filter.rb +235 -244
  34. data/lib/watobo/core/interceptor.rb +98 -107
  35. data/lib/watobo/core/min_class.rb +4 -13
  36. data/lib/watobo/core/netfilter_queue.rb +170 -179
  37. data/lib/watobo/core/ott_cache.rb +132 -141
  38. data/lib/watobo/core/parameter.rb +43 -52
  39. data/lib/watobo/core/passive_check.rb +103 -102
  40. data/lib/watobo/core/passive_checks.rb +48 -57
  41. data/lib/watobo/core/passive_scanner.rb +54 -55
  42. data/lib/watobo/core/plugin.rb +11 -20
  43. data/lib/watobo/core/project.rb +3 -9
  44. data/lib/watobo/core/proxy.rb +43 -52
  45. data/lib/watobo/core/request.rb +125 -123
  46. data/lib/watobo/core/response.rb +44 -53
  47. data/lib/watobo/core/scanner.rb +0 -9
  48. data/lib/watobo/core/scanner3.rb +405 -414
  49. data/lib/watobo/core/scope.rb +83 -92
  50. data/lib/watobo/core/session.rb +1043 -1026
  51. data/lib/watobo/core/sid_cache.rb +98 -107
  52. data/lib/watobo/core/subscriber.rb +25 -34
  53. data/lib/watobo/defaults.rb +21 -30
  54. data/lib/watobo/external/diff/lcs.rb +0 -9
  55. data/lib/watobo/external/diff/lcs/array.rb +0 -9
  56. data/lib/watobo/external/diff/lcs/block.rb +0 -9
  57. data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
  58. data/lib/watobo/external/diff/lcs/change.rb +0 -9
  59. data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
  60. data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
  61. data/lib/watobo/external/diff/lcs/string.rb +0 -9
  62. data/lib/watobo/externals.rb +6 -15
  63. data/lib/watobo/framework.rb +4 -13
  64. data/lib/watobo/framework/create_project.rb +60 -69
  65. data/lib/watobo/framework/init.rb +0 -9
  66. data/lib/watobo/framework/init_modules.rb +0 -9
  67. data/lib/watobo/framework/license_text.rb +28 -37
  68. data/lib/watobo/framework/load_chat.rb +13 -22
  69. data/lib/watobo/gui.rb +132 -123
  70. data/lib/watobo/gui/about_watobo.rb +0 -9
  71. data/lib/watobo/gui/browser_preview.rb +0 -9
  72. data/lib/watobo/gui/certificate_dialog.rb +0 -9
  73. data/lib/watobo/gui/chat_diff.rb +0 -9
  74. data/lib/watobo/gui/chatviewer_frame.rb +73 -72
  75. data/lib/watobo/gui/checkboxtree.rb +0 -9
  76. data/lib/watobo/gui/checks_policy_frame.rb +0 -9
  77. data/lib/watobo/gui/client_cert_dialog.rb +96 -87
  78. data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
  79. data/lib/watobo/gui/conversation_table.rb +158 -164
  80. data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
  81. data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
  82. data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
  83. data/lib/watobo/gui/custom_viewer.rb +374 -383
  84. data/lib/watobo/gui/dashboard.rb +296 -303
  85. data/lib/watobo/gui/define_scope_frame.rb +0 -9
  86. data/lib/watobo/gui/differ_frame.rb +215 -224
  87. data/lib/watobo/gui/edit_comment.rb +0 -9
  88. data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
  89. data/lib/watobo/gui/export_dialog.rb +104 -113
  90. data/lib/watobo/gui/finding_info.rb +0 -9
  91. data/lib/watobo/gui/findings_tree.rb +210 -217
  92. data/lib/watobo/gui/full_scan_dialog.rb +0 -9
  93. data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
  94. data/lib/watobo/gui/fxsave_thread.rb +14 -0
  95. data/lib/watobo/gui/goto_url_dialog.rb +70 -79
  96. data/lib/watobo/gui/hex_viewer.rb +0 -9
  97. data/lib/watobo/gui/html_viewer.rb +287 -296
  98. data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
  99. data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
  100. data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
  101. data/lib/watobo/gui/json_viewer.rb +287 -0
  102. data/lib/watobo/gui/list_box.rb +101 -110
  103. data/lib/watobo/gui/log_file_viewer.rb +32 -41
  104. data/lib/watobo/gui/log_viewer.rb +83 -88
  105. data/lib/watobo/gui/login_wizzard.rb +0 -9
  106. data/lib/watobo/gui/main_window.rb +587 -618
  107. data/lib/watobo/gui/manual_request_editor.rb +620 -565
  108. data/lib/watobo/gui/master_pw_dialog.rb +0 -9
  109. data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
  110. data/lib/watobo/gui/page_tree.rb +217 -226
  111. data/lib/watobo/gui/password_policy_dialog.rb +0 -9
  112. data/lib/watobo/gui/plugin_board.rb +0 -9
  113. data/lib/watobo/gui/preferences_dialog.rb +0 -9
  114. data/lib/watobo/gui/progress_window.rb +17 -27
  115. data/lib/watobo/gui/project_wizzard.rb +0 -9
  116. data/lib/watobo/gui/proxy_dialog.rb +1 -10
  117. data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
  118. data/lib/watobo/gui/request_builder_frame.rb +102 -111
  119. data/lib/watobo/gui/request_editor.rb +181 -137
  120. data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
  121. data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
  122. data/lib/watobo/gui/save_chat_dialog.rb +140 -149
  123. data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
  124. data/lib/watobo/gui/select_chat_dialog.rb +0 -9
  125. data/lib/watobo/gui/session_management_dialog.rb +0 -9
  126. data/lib/watobo/gui/sites_tree.rb +0 -9
  127. data/lib/watobo/gui/status_bar.rb +0 -9
  128. data/lib/watobo/gui/table_editor.rb +0 -9
  129. data/lib/watobo/gui/tagless_viewer.rb +0 -9
  130. data/lib/watobo/gui/templates/plugin.rb +0 -9
  131. data/lib/watobo/gui/templates/plugin2.rb +92 -100
  132. data/lib/watobo/gui/templates/plugin_base.rb +144 -153
  133. data/lib/watobo/gui/text_viewer.rb +0 -9
  134. data/lib/watobo/gui/transcoder_window.rb +0 -9
  135. data/lib/watobo/gui/utils/gui_utils.rb +0 -9
  136. data/lib/watobo/gui/utils/init_icons.rb +86 -95
  137. data/lib/watobo/gui/utils/load_icons.rb +33 -42
  138. data/lib/watobo/gui/utils/load_plugins.rb +116 -119
  139. data/lib/watobo/gui/utils/master_password.rb +68 -77
  140. data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
  141. data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
  142. data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
  143. data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
  144. data/lib/watobo/gui/utils/session_history.rb +112 -121
  145. data/lib/watobo/gui/workspace_dialog.rb +0 -9
  146. data/lib/watobo/gui/www_auth_dialog.rb +0 -9
  147. data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
  148. data/lib/watobo/http.rb +4 -13
  149. data/lib/watobo/http/cookies/cookies.rb +26 -35
  150. data/lib/watobo/http/data/data.rb +45 -54
  151. data/lib/watobo/http/data/json.rb +47 -55
  152. data/lib/watobo/http/url/url.rb +38 -47
  153. data/lib/watobo/http/xml/xml.rb +124 -130
  154. data/lib/watobo/interceptor.rb +3 -12
  155. data/lib/watobo/interceptor/proxy.rb +742 -739
  156. data/lib/watobo/interceptor/transparent.rb +22 -24
  157. data/lib/watobo/mixins.rb +10 -19
  158. data/lib/watobo/mixins/check_info.rb +27 -36
  159. data/lib/watobo/mixins/httpparser.rb +613 -637
  160. data/lib/watobo/mixins/request_parser.rb +88 -97
  161. data/lib/watobo/mixins/shapers.rb +515 -529
  162. data/lib/watobo/mixins/transcoders.rb +3 -11
  163. data/lib/watobo/parser.rb +1 -10
  164. data/lib/watobo/parser/html.rb +83 -92
  165. data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
  166. data/lib/watobo/sockets.rb +3 -12
  167. data/lib/watobo/sockets/agent.rb +828 -837
  168. data/lib/watobo/sockets/client_socket.rb +308 -312
  169. data/lib/watobo/sockets/connection.rb +401 -410
  170. data/lib/watobo/sockets/http_socket.rb +11 -13
  171. data/lib/watobo/sockets/ntlm_auth.rb +129 -138
  172. data/lib/watobo/utils.rb +10 -19
  173. data/lib/watobo/utils/check_regex.rb +0 -9
  174. data/lib/watobo/utils/copy_object.rb +0 -9
  175. data/lib/watobo/utils/crypto.rb +0 -9
  176. data/lib/watobo/utils/expand_range.rb +23 -32
  177. data/lib/watobo/utils/export_xml.rb +97 -106
  178. data/lib/watobo/utils/file_management.rb +9 -11
  179. data/lib/watobo/utils/hexprint.rb +9 -18
  180. data/lib/watobo/utils/load_chat.rb +0 -9
  181. data/lib/watobo/utils/load_icon.rb +0 -9
  182. data/lib/watobo/utils/ntlm.rb +866 -875
  183. data/lib/watobo/utils/print_debug.rb +12 -21
  184. data/lib/watobo/utils/response_builder.rb +90 -99
  185. data/lib/watobo/utils/response_hash.rb +0 -9
  186. data/lib/watobo/utils/secure_eval.rb +0 -9
  187. data/lib/watobo/utils/strings.rb +10 -19
  188. data/lib/watobo/utils/text2request.rb +0 -9
  189. data/lib/watobo/utils/url.rb +23 -32
  190. data/lib/watobo/utils/utf16.rb +11 -20
  191. data/modules/active/Apache/mod_status.rb +0 -9
  192. data/modules/active/Apache/multiview.rb +151 -160
  193. data/modules/active/Flash/crossdomain.rb +0 -9
  194. data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
  195. data/modules/active/cq5/cq5_default_selectors.rb +106 -115
  196. data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
  197. data/modules/active/directories/dirwalker.rb +0 -9
  198. data/modules/active/discovery/fileextensions.rb +0 -9
  199. data/modules/active/discovery/http_methods.rb +0 -9
  200. data/modules/active/discovery/jsmapfiles.rb +79 -0
  201. data/modules/active/domino/domino_db.rb +68 -76
  202. data/modules/active/dotNET/custom_errors.rb +102 -111
  203. data/modules/active/dotNET/dotnet_files.rb +90 -99
  204. data/modules/active/fileinclusion/lfi_simple.rb +0 -9
  205. data/modules/active/jboss/jboss_basic.rb +0 -9
  206. data/modules/active/sap/business_objects.rb +51 -60
  207. data/modules/active/sap/its_commands.rb +0 -9
  208. data/modules/active/sap/its_service_parameter.rb +0 -9
  209. data/modules/active/sap/its_services.rb +0 -9
  210. data/modules/active/sap/its_xss.rb +0 -9
  211. data/modules/active/shell_shock/shell_shock.rb +139 -148
  212. data/modules/active/siebel/siebel_apps.rb +160 -169
  213. data/modules/active/sqlinjection/sql_boolean.rb +0 -9
  214. data/modules/active/sqlinjection/sql_numerical.rb +198 -0
  215. data/modules/active/sqlinjection/sqli_error.rb +0 -9
  216. data/modules/active/sqlinjection/sqli_timing.rb +220 -229
  217. data/modules/active/struts2/default_handler_ognl.rb +106 -115
  218. data/modules/active/struts2/include_params_ognl.rb +105 -114
  219. data/modules/active/xml/xml_xxe.rb +112 -123
  220. data/modules/active/xss/xss_ng.rb +214 -223
  221. data/modules/active/xss/xss_simple.rb +0 -9
  222. data/modules/passive/ajax.rb +68 -77
  223. data/modules/passive/autocomplete.rb +56 -65
  224. data/modules/passive/cookie_options.rb +0 -9
  225. data/modules/passive/cookie_xss.rb +0 -9
  226. data/modules/passive/detect_code.rb +0 -9
  227. data/modules/passive/detect_fileupload.rb +0 -9
  228. data/modules/passive/detect_infrastructure.rb +0 -9
  229. data/modules/passive/detect_one_time_tokens.rb +0 -9
  230. data/modules/passive/dirindexing.rb +0 -9
  231. data/modules/passive/disclosure_domino.rb +55 -64
  232. data/modules/passive/disclosure_emails.rb +0 -9
  233. data/modules/passive/disclosure_ipaddr.rb +55 -53
  234. data/modules/passive/filename_as_parameter.rb +0 -9
  235. data/modules/passive/form_spotter.rb +0 -9
  236. data/modules/passive/hidden_fields.rb +50 -59
  237. data/modules/passive/hotspots.rb +0 -9
  238. data/modules/passive/in_script_parameter.rb +0 -9
  239. data/modules/passive/json_web_token.rb +93 -0
  240. data/modules/passive/multiple_server_headers.rb +0 -9
  241. data/modules/passive/possible_login.rb +0 -9
  242. data/modules/passive/redirect_url.rb +0 -9
  243. data/modules/passive/redirectionz.rb +0 -9
  244. data/modules/passive/sap-headers.rb +56 -65
  245. data/modules/passive/xss_dom.rb +0 -9
  246. data/plugins/aem/aem.rb +11 -20
  247. data/plugins/aem/gui/main.rb +118 -127
  248. data/plugins/aem/gui/tree_view.rb +171 -180
  249. data/plugins/aem/lib/agent.rb +130 -138
  250. data/plugins/aem/lib/dispatcher.rb +45 -51
  251. data/plugins/aem/lib/engine.rb +177 -186
  252. data/plugins/catalog/catalog.rb +345 -355
  253. data/plugins/crawler/crawler.rb +4 -13
  254. data/plugins/crawler/gui.rb +5 -14
  255. data/plugins/crawler/gui/auth_frame.rb +270 -279
  256. data/plugins/crawler/gui/crawler_gui.rb +271 -276
  257. data/plugins/crawler/gui/general_settings_frame.rb +96 -105
  258. data/plugins/crawler/gui/hooks_frame.rb +80 -89
  259. data/plugins/crawler/gui/scope_frame.rb +50 -59
  260. data/plugins/crawler/gui/settings_tabbook.rb +38 -47
  261. data/plugins/crawler/gui/status_frame.rb +59 -68
  262. data/plugins/crawler/lib/bags.rb +18 -27
  263. data/plugins/crawler/lib/constants.rb +11 -20
  264. data/plugins/crawler/lib/engine.rb +488 -497
  265. data/plugins/crawler/lib/grabber.rb +68 -77
  266. data/plugins/crawler/lib/status.rb +71 -80
  267. data/plugins/crawler/lib/uri_mp.rb +12 -21
  268. data/plugins/filefinder/filefinder.rb +326 -333
  269. data/plugins/sqlmap/bin/test.rb +78 -87
  270. data/plugins/sqlmap/gui.rb +4 -13
  271. data/plugins/sqlmap/gui/main.rb +218 -227
  272. data/plugins/sqlmap/gui/options_frame.rb +97 -106
  273. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
  274. data/plugins/sqlmap/sqlmap.rb +2 -11
  275. data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
  276. data/plugins/sslchecker/gui/cipher_table.rb +246 -254
  277. data/plugins/sslchecker/gui/gui.rb +258 -264
  278. data/plugins/sslchecker/gui/sslchecker.rb +4 -13
  279. data/plugins/sslchecker/lib/check.rb +127 -133
  280. data/plugins/wshell/gui/main.rb +119 -117
  281. data/plugins/wshell/lib/core.rb +38 -88
  282. data/plugins/wshell/wshell.rb +11 -20
  283. metadata +170 -164
@@ -1,226 +1,217 @@
1
- #.
2
- # xss_ng.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
- module Watobo#:nodoc: all
12
- module Modules
13
- module Active
14
- module Xss
15
-
16
-
17
- class Xss_ng < Watobo::ActiveCheck
18
-
19
- threat =<<'EOF'
20
- Cross-site Scripting (XSS) is an attack technique that involves echoing attacker-supplied code into a user's browser instance.
21
- A browser instance can be a standard web browser client, or a browser object embedded in a software product such as the browser
22
- within WinAmp, an RSS reader, or an email client. The code itself is usually written in HTML/JavaScript, but may also extend to
23
- VBScript, ActiveX, Java, Flash, or any other browser-supported technology.
24
-
25
- When an attacker gets a user's browser to execute his/her code, the code will run within the security context (or zone) of the
26
- hosting web site. With this level of privilege, the code has the ability to read, modify and transmit any sensitive data accessible
27
- by the browser. A Cross-site Scripted user could have his/her account hijacked (cookie theft), their browser redirected to another
28
- location, or possibly shown fraudulent content delivered by the web site they are visiting. Cross-site Scripting attacks essentially
29
- compromise the trust relationship between a user and the web site. Applications utilizing browser object instances which load content
30
- from the file system may execute code under the local machine zone allowing for system compromise.
31
-
32
- Source: http://projects.webappsec.org/Cross-Site+Scripting
33
- EOF
34
-
35
- measure = "All user input should be filtered and/or escaped using a method appropriate for the output context"
36
-
37
- @info.update(
38
- :check_name => 'NextGeneration Cross Site Scripting Checks', # name of check which briefly describes functionality, will be used for tree and progress views
39
- :check_group => AC_GROUP_XSS,
40
- :description => "XSS Checks with rating. Additional parameters are created by extracting input fields (name/value pairs) of the original response.", # description of checkfunction
41
- :author => "Andreas Schmidt", # author of check
42
- :version => "1.0" # check version
43
- )
44
-
45
- @finding.update(
46
- :threat => threat, # thread of vulnerability, e.g. loss of information
47
- :class => "Reflected XSS", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
48
- :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
49
- :rating => VULN_RATING_HIGH,
50
- :measure => measure
51
- )
52
-
53
- def initialize(project, prefs={})
54
- super(project, prefs)
55
-
56
-
57
- @envelop = "watobo"
58
- @env_count = 0
59
- @evasions = [ "%0a", "%00"]
60
- @xss_chars= %w( < > ' " )
61
- @escape_chars = ['\\']
62
- @additional_parms = []
63
-
64
- def reset
65
- @additional_parms = []
66
- @env_count = 0
67
- end
68
-
69
-
70
- end
71
-
72
-
73
- def generateChecks(chat)
74
- begin
75
- #
76
- if chat.response.respond_to? :input_fields
2
+ module Watobo#:nodoc: all
3
+ module Modules
4
+ module Active
5
+ module Xss
6
+
7
+
8
+ class Xss_ng < Watobo::ActiveCheck
9
+
10
+ threat =<<'EOF'
11
+ Cross-site Scripting (XSS) is an attack technique that involves echoing attacker-supplied code into a user's browser instance.
12
+ A browser instance can be a standard web browser client, or a browser object embedded in a software product such as the browser
13
+ within WinAmp, an RSS reader, or an email client. The code itself is usually written in HTML/JavaScript, but may also extend to
14
+ VBScript, ActiveX, Java, Flash, or any other browser-supported technology.
15
+
16
+ When an attacker gets a user's browser to execute his/her code, the code will run within the security context (or zone) of the
17
+ hosting web site. With this level of privilege, the code has the ability to read, modify and transmit any sensitive data accessible
18
+ by the browser. A Cross-site Scripted user could have his/her account hijacked (cookie theft), their browser redirected to another
19
+ location, or possibly shown fraudulent content delivered by the web site they are visiting. Cross-site Scripting attacks essentially
20
+ compromise the trust relationship between a user and the web site. Applications utilizing browser object instances which load content
21
+ from the file system may execute code under the local machine zone allowing for system compromise.
22
+
23
+ Source: http://projects.webappsec.org/Cross-Site+Scripting
24
+ EOF
25
+
26
+ measure = "All user input should be filtered and/or escaped using a method appropriate for the output context"
27
+
28
+ @info.update(
29
+ :check_name => 'NextGeneration Cross Site Scripting Checks', # name of check which briefly describes functionality, will be used for tree and progress views
30
+ :check_group => AC_GROUP_XSS,
31
+ :description => "XSS Checks with rating. Additional parameters are created by extracting input fields (name/value pairs) of the original response.", # description of checkfunction
32
+ :author => "Andreas Schmidt", # author of check
33
+ :version => "1.0" # check version
34
+ )
35
+
36
+ @finding.update(
37
+ :threat => threat, # thread of vulnerability, e.g. loss of information
38
+ :class => "Reflected XSS", # vulnerability class, e.g. Stored XSS, SQL-Injection, ...
39
+ :type => FINDING_TYPE_VULN, # FINDING_TYPE_HINT, FINDING_TYPE_INFO, FINDING_TYPE_VULN
40
+ :rating => VULN_RATING_HIGH,
41
+ :measure => measure
42
+ )
43
+
44
+ def initialize(project, prefs={})
45
+ super(project, prefs)
46
+
47
+
48
+ @envelop = "watobo"
49
+ @env_count = 0
50
+ @evasions = [ "%0a", "%00"]
51
+ @xss_chars= %w( < > ' " )
52
+ @escape_chars = ['\\']
53
+ @additional_parms = []
54
+
55
+ def reset
56
+ @additional_parms = []
57
+ @env_count = 0
58
+ end
59
+
60
+
61
+ end
62
+
63
+
64
+ def generateChecks(chat)
65
+ begin
66
+ #
67
+ if chat.response.respond_to? :input_fields
77
68
  chat.response.input_fields do |field|
78
-
79
- @additional_parms << field.to_www_form_parm if chat.request.method_post?
69
+
70
+ @additional_parms << field.to_www_form_parm if chat.request.method_post?
80
71
  @additional_parms << field.to_url_parm
81
-
82
- end
83
- end
84
-
85
- @parm_list = chat.request.parameters(:data, :url, :json)
86
- @parm_list.concat @additional_parms
87
- @parm_list.each do |parm|
88
- #log_console( "#{parm.location} - #{parm.name} = #{parm.value}")
89
-
90
- checks = []
91
- @xss_chars.each do |xss|
92
- @env_count += 1
93
-
94
- check_id = "#{@envelop}#{@env_count}"
95
- checks << [ xss.dup, "#{xss}", check_id ]
96
- checks << [xss.dup, "#{parm.value}#{xss}", check_id ]
97
- checks << [xss.dup, "#{xss}#{parm.value}", check_id ]
98
-
99
- end
100
- checker = proc {
101
- results = {}
102
- rating = 0
103
- test_request = nil
104
- test_response = nil
105
-
106
- # first we check, if parameter is injectable
107
- test = chat.copyRequest
108
-
109
- proof = "INJ#{Time.now.to_i.to_s}"
110
- parm.value = proof
111
- test.set parm
112
-
113
- test_request,test_response = doRequest(test)
114
-
115
-
116
- next [ test_request, test_response ] unless test_response.has_body?
117
-
118
- next [ test_request, test_response ] unless test_response.body =~ /#{proof}/i
119
-
120
-
121
- checks.each do |xss, check, check_id|
122
-
123
- # accept only one (escape) char between check_id and check string
124
- proof = "#{check_id}([^#{Regexp.quote(check)}]?(#{Regexp.quote(check)}){1})"
125
- next if results.has_key? xss
126
- test = chat.copyRequest
127
-
128
- parm.value = check_id + CGI.escape(check)
129
- test.set parm
130
-
131
- test_request,test_response = doRequest(test)
132
-
133
- if not test_response then
134
- if $DEBUG
135
- puts "[#{Module.nesting[0].name}] got no response :("
136
- puts test
137
- end
138
- elsif test_response.join =~ /#{proof}/i
139
- match = $1
140
- #puts "MATCH: [ #{match} ] / [ #{check} ]"
141
- if match == check
142
- results[xss] = { :match => :full, :check => check, :proof => proof }
143
- end
144
-
145
- unless results.has_key? xss
146
- @escape_chars.each do |ec|
147
- ep = Regexp.quote("#{ec}#{xss}")
148
- # puts "Escaped: #{match} / #{ep}"
149
- results[xss] = { :match => :escaped, :check => check, :proof => proof, :escape_char => "#{ec}"} if match =~ /#{ep}/
150
- end
151
- end
152
-
153
- end
154
-
155
- end
156
-
157
- puts results.to_yaml if $DEBUG
158
- xss_combo = ""
159
- combo_patterns = []
160
- results.each do |k,v|
161
- mp = CGI.escape(k)
162
- rp = CGI.escape(@xss_chars.join)
163
- xss_combo += CGI.escape(k)
164
- #puts "[#{k}] - #{v}"
165
- case v[:match]
166
-
167
- when :full
168
- rating += 100/@xss_chars.length
169
- combo_patterns << k
170
- when :escaped
171
- rating += 100/(@xss_chars.length*4)
172
- combo_patterns << Regexp.quote("#{v[:escape_char]}#{k}")
173
- end
174
- end
175
-
176
- if rating > 0
177
- test = chat.copyRequest
178
- #puts "COMBO-REQUEST: #{xss_combo}"
179
- parm.value = "#{@envelop}#{@env_count}#{xss_combo}"
180
- pattern = "(#{@envelop}#{@env_count}(#{combo_patterns.join("|")})+)"
181
- test.set parm
182
-
183
- match = ""
184
-
185
- test_request,test_response = doRequest(test)
186
- if not test_response then
187
- puts "got no response :("
188
- elsif test_response.join =~ /#{pattern}/i
189
- match = $1
190
- #puts "MATCH: #{match}"
191
- end
192
-
193
- fclass = "Reflected XSS - #{rating}%"
194
- fclass = "Reflected XSS (POST) - #{rating}%" if parm.location == :data
195
- addFinding( test_request, test_response,
196
- :check_pattern => xss_combo,
197
- :proof_pattern => "#{match}",
198
- :test_item => parm.name,
199
- :class => fclass,
200
- :chat => chat,
201
- :title => "[#{parm.name}] - #{test_request.path}"
202
- )
203
- end
204
-
205
- [ test_request, test_response ]
206
- }
207
- yield checker
208
-
209
- end
210
-
211
- rescue => bang
212
- puts bang
213
- puts bang.backtrace if $DEBUG
214
- puts "ERROR!! #{Module.nesting[0].name}"
215
- raise
216
-
217
-
218
- end
219
- end
220
-
221
- end
222
-
223
- end
224
- end
225
- end
226
- end
72
+
73
+ end
74
+ end
75
+
76
+ @parm_list = chat.request.parameters(:data, :url, :json)
77
+ @parm_list.concat @additional_parms
78
+ @parm_list.each do |parm|
79
+ #log_console( "#{parm.location} - #{parm.name} = #{parm.value}")
80
+
81
+ checks = []
82
+ @xss_chars.each do |xss|
83
+ @env_count += 1
84
+
85
+ check_id = "#{@envelop}#{@env_count}"
86
+ checks << [ xss.dup, "#{xss}", check_id ]
87
+ checks << [xss.dup, "#{parm.value}#{xss}", check_id ]
88
+ checks << [xss.dup, "#{xss}#{parm.value}", check_id ]
89
+
90
+ end
91
+ checker = proc {
92
+ results = {}
93
+ rating = 0
94
+ test_request = nil
95
+ test_response = nil
96
+
97
+ # first we check, if parameter is injectable
98
+ test = chat.copyRequest
99
+
100
+ proof = "INJ#{Time.now.to_i.to_s}"
101
+ parm.value = proof
102
+ test.set parm
103
+
104
+ test_request,test_response = doRequest(test)
105
+
106
+
107
+ next [ test_request, test_response ] unless test_response.has_body?
108
+
109
+ next [ test_request, test_response ] unless test_response.body =~ /#{proof}/i
110
+
111
+
112
+ checks.each do |xss, check, check_id|
113
+
114
+ # accept only one (escape) char between check_id and check string
115
+ proof = "#{check_id}([^#{Regexp.quote(check)}]?(#{Regexp.quote(check)}){1})"
116
+ next if results.has_key? xss
117
+ test = chat.copyRequest
118
+
119
+ parm.value = check_id + CGI.escape(check)
120
+ test.set parm
121
+
122
+ test_request,test_response = doRequest(test)
123
+
124
+ if not test_response then
125
+ if $DEBUG
126
+ puts "[#{Module.nesting[0].name}] got no response :("
127
+ puts test
128
+ end
129
+ elsif test_response.join =~ /#{proof}/i
130
+ match = $1
131
+ #puts "MATCH: [ #{match} ] / [ #{check} ]"
132
+ if match == check
133
+ results[xss] = { :match => :full, :check => check, :proof => proof }
134
+ end
135
+
136
+ unless results.has_key? xss
137
+ @escape_chars.each do |ec|
138
+ ep = Regexp.quote("#{ec}#{xss}")
139
+ # puts "Escaped: #{match} / #{ep}"
140
+ results[xss] = { :match => :escaped, :check => check, :proof => proof, :escape_char => "#{ec}"} if match =~ /#{ep}/
141
+ end
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ puts results.to_yaml if $DEBUG
149
+ xss_combo = ""
150
+ combo_patterns = []
151
+ results.each do |k,v|
152
+ mp = CGI.escape(k)
153
+ rp = CGI.escape(@xss_chars.join)
154
+ xss_combo += CGI.escape(k)
155
+ #puts "[#{k}] - #{v}"
156
+ case v[:match]
157
+
158
+ when :full
159
+ rating += 100/@xss_chars.length
160
+ combo_patterns << k
161
+ when :escaped
162
+ rating += 100/(@xss_chars.length*4)
163
+ combo_patterns << Regexp.quote("#{v[:escape_char]}#{k}")
164
+ end
165
+ end
166
+
167
+ if rating > 0
168
+ test = chat.copyRequest
169
+ #puts "COMBO-REQUEST: #{xss_combo}"
170
+ parm.value = "#{@envelop}#{@env_count}#{xss_combo}"
171
+ pattern = "(#{@envelop}#{@env_count}(#{combo_patterns.join("|")})+)"
172
+ test.set parm
173
+
174
+ match = ""
175
+
176
+ test_request,test_response = doRequest(test)
177
+ if not test_response then
178
+ puts "got no response :("
179
+ elsif test_response.join =~ /#{pattern}/i
180
+ match = $1
181
+ #puts "MATCH: #{match}"
182
+ end
183
+
184
+ fclass = "Reflected XSS - #{rating}%"
185
+ fclass = "Reflected XSS (POST) - #{rating}%" if parm.location == :data
186
+ addFinding( test_request, test_response,
187
+ :check_pattern => xss_combo,
188
+ :proof_pattern => "#{match}",
189
+ :test_item => parm.name,
190
+ :class => fclass,
191
+ :chat => chat,
192
+ :title => "[#{parm.name}] - #{test_request.path}"
193
+ )
194
+ end
195
+
196
+ [ test_request, test_response ]
197
+ }
198
+ yield checker
199
+
200
+ end
201
+
202
+ rescue => bang
203
+ puts bang
204
+ puts bang.backtrace if $DEBUG
205
+ puts "ERROR!! #{Module.nesting[0].name}"
206
+ raise
207
+
208
+
209
+ end
210
+ end
211
+
212
+ end
213
+
214
+ end
215
+ end
216
+ end
217
+ end
@@ -1,12 +1,3 @@
1
- #.
2
- # xss_simple.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
2
  module Watobo#:nodoc: all
12
3
  module Modules