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,12 +1,3 @@
1
- #.
2
- # sqli_error.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
@@ -1,231 +1,222 @@
1
- #.
2
- # sqli_timing.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
1
+ require 'digest/md5'
2
+ require 'digest/sha1'
9
3
 
10
- require 'digest/md5'
11
- require 'digest/sha1'
12
-
13
4
  # @private
14
- module Watobo#:nodoc: all
15
- module Modules
16
- module Active
17
- module Sqlinjection
18
-
19
-
20
- class Sqli_timing < Watobo::ActiveCheck
21
- @info.update(
22
- :check_name => 'Time-based SQL Injection', # name of check which briefly describes functionality, will be used for tree and progress views
23
- :check_group => AC_GROUP_SQL,
24
- :description => "Checking each parameter for SQL-Injection flaws using timing techniques.", # description of checkfunction
25
- :author => "Andreas Schmidt", # author of check
26
- :version => "0.9" # check version
27
- )
28
-
29
- threat =<<'EOF'
30
- SQL Injection is an attack technique used to exploit applications that construct SQL statements from user-supplied input.
31
- When successful, the attacker is able to change the logic of SQL statements executed against the database.
32
- Structured Query Language (SQL) is a specialized programming language for sending queries to databases.
33
- The SQL programming language is both an ANSI and an ISO standard, though many database products supporting SQL do so with
34
- proprietary extensions to the standard language. Applications often use user-supplied data to create SQL statements.
35
- If an application fails to properly construct SQL statements it is possible for an attacker to alter the statement structure
36
- and execute unplanned and potentially hostile commands. When such commands are executed, they do so under the context of the user
37
- specified by the application executing the statement. This capability allows attackers to gain control of all database resources
38
- accessible by that user, up to and including the ability to execute commands on the hosting system.
39
-
40
- Source: http://projects.webappsec.org/SQL-Injection
41
- EOF
42
-
43
- measure = "All user input must be escaped and/or filtered thoroughly before the sql statement is put together. Additionally prepared statements should be used."
44
-
45
- @finding.update(
46
- :threat => threat, # thread of vulnerability, e.g. loss of information
47
- :class => "SQL-Injection", # 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_CRITICAL,
50
- :measure => measure
51
- )
52
-
53
-
54
- def initialize(project, prefs={})
55
- super(project, prefs)
56
-
57
- end
58
-
59
- def generateChecks(chat)
60
- sql_timing_commands = [
61
- 'and sleep(SLEEP_TIME)',
62
- 'and 1 in (select BENCHMARK(20000000,MD5(CHAR(97))))',
63
- 'and waitfor delay \'0:0:SLEEP_TIME\''
64
- ]
65
-
66
- sqli_vectors = [
67
- '',
68
- '\'',
69
- '\'))',
70
- '\')))',
71
- ')',
72
- '))',
73
- ')))'
74
- ]
75
-
76
- sql_terminators = [
77
- '', '--', ';--'
78
- ]
79
-
80
- sqli_patterns = []
81
- sqli_vectors.each do |v|
82
- sql_timing_commands.each do |stc|
83
- sql_terminators.each do |sts|
84
- sqli_patterns << "#{v} #{stc}#{sts}"
85
- end
86
- end
87
- end
88
-
89
- check_parms = []
90
-
91
- urlParmNames(chat).each do |parm|
92
- pval = chat.request.get_parm_value(parm)
93
- check_parms << { :name => parm, :value => pval, :type => :url }
94
- end
95
-
96
- postParmNames(chat).each do |parm|
97
- pval = chat.request.post_parm_value(parm)
98
- check_parms << { :name => parm, :value => pval, :type => :form }
99
- end
100
-
101
-
102
- checker = proc {
103
- test_request = nil
104
- test_response = nil
105
- output = ""
106
-
107
- check_parms.each do |parm|
108
- # first get multiple response times
109
- rtimes = []
110
-
111
- timing_response = nil
112
-
113
- vulnerable = false
114
-
115
- 4.times do
116
- test = chat.copyRequest
117
- start = Time.now().to_i
118
- timing_request, timing_response = doRequest(test,:default => true)
119
- stop = Time.now().to_i
120
- rtimes << ( stop - start )
121
-
122
- end
123
- # now calculate the average time
124
- average_t = rtimes.inject(:+) / rtimes.length
125
- max_t = rtimes.max > 5 ? rtimes.max : 5
126
- # puts "Analyzing timing behaviour ..."
127
- # rtimes.each do |t|
128
- # puts t.to_s
129
- # end
130
- # puts "Average Response Time: #{average_t}s (max #{max_t}s)"
131
-
132
- # time_to_sleep = 4 * max_t
133
- time_to_sleep = max_t
134
- #timeout_t = time_to_sleep + average_t
135
- timeout_t = 2 * time_to_sleep
136
-
137
- test_value = ""
138
- test = nil
139
- log_request = nil
140
- max_timeouts = 2
141
- timeout_counter = 0
142
- sqli_start = sqli_stop = 0
143
-
144
- sqli_patterns.each do |sql|
145
- timeout_counter = 0
146
- output = ""
147
- break if vulnerable
148
- begin
149
- sqli_start = Time.now().to_i
150
- timeout(timeout_t) do
151
- test = chat.copyRequest
152
- # also need to check if altered parm will change response
153
- test_value = CGI.escape("#{parm[:value]}#{sql.gsub(/SLEEP_TIME/, time_to_sleep.to_s)}")
154
- case parm[:type]
155
- when :url
156
- test.replace_get_parm(parm[:name], test_value)
157
- when :form
158
- test.replace_post_parm(parm[:name], test_value)
159
- end
160
-
161
- test_request, test_response = doRequest(test,:default => true)
162
- sqli_stop = Time.now().to_i
163
- end
164
- rescue Timeout::Error
165
- timeout_counter += 1
166
- # puts "[#{self}] Hit Timeout after #{timeout_t} seconds (#{timeout_counter})."
167
- # puts test
168
- # puts
169
- # puts "... retry after #{max_t} seconds ..."
170
- sleep max_t
171
- retry unless timeout_counter > 2
172
- sqli_stop = Time.now().to_i
173
- output << "Hit Timeout after #{sqli_start - sqli_stop} seconds\n"
174
- # puts "* redo request with sleep_time=0 to get an apropriate server response ..."
175
- test = chat.copyRequest
176
- test_value = CGI.escape("#{parm[:value]}#{sql.gsub(/SLEEP_TIME/, "0")}")
177
- case parm[:type]
178
- when :url
179
- test.replace_get_parm(parm[:name], test_value)
180
- when :form
181
- test.replace_post_parm(parm[:name], test_value)
182
- end
183
-
184
- dummy_request, test_response = doRequest(test, :default => true)
185
-
186
- rescue => bang
187
- puts bang
188
- puts bang.backtrace
189
- end
190
-
191
-
192
- duration = sqli_stop - sqli_start
193
- # puts duration
194
- if ( duration >= time_to_sleep )
195
- puts "Found time-based SQLi in parameter #{parm} !!!"
196
- puts "after #{duration}s / time-to-sleep #{time_to_sleep}s)"
197
- test_request.extend Watobo::Mixin::Parser::Url unless test_request.respond_to? :path
198
- path = "/" + test_request.path
199
-
200
- vulnerable = true
201
- output << "SleepTime: #{time_to_sleep}\nQuery Duration: #{duration}s"
202
-
203
- addFinding( test_request, test_response,
204
- :check_pattern => "#{test_value}",
205
- :chat => chat,
206
- :title => "[#{parm[:name]}] - #{path}",
207
- :proof_pattern => "",
208
- :test_item => parm[:name],
209
- :class => "SQL-Injection (Time-based)",
210
- :output => output
211
- )
212
- #readlines
213
- break
214
- end
215
- end
216
-
217
- end
218
-
219
- [ test_request, test_response ]
220
- }
221
- yield checker
222
-
223
-
224
- end
225
- end
226
-
227
- # --> eo namespace
228
- end
229
- end
230
- end
231
- end
5
+ module Watobo#:nodoc: all
6
+ module Modules
7
+ module Active
8
+ module Sqlinjection
9
+
10
+
11
+ class Sqli_timing < Watobo::ActiveCheck
12
+ @info.update(
13
+ :check_name => 'Time-based SQL Injection', # name of check which briefly describes functionality, will be used for tree and progress views
14
+ :check_group => AC_GROUP_SQL,
15
+ :description => "Checking each parameter for SQL-Injection flaws using timing techniques.", # description of checkfunction
16
+ :author => "Andreas Schmidt", # author of check
17
+ :version => "0.9" # check version
18
+ )
19
+
20
+ threat =<<'EOF'
21
+ SQL Injection is an attack technique used to exploit applications that construct SQL statements from user-supplied input.
22
+ When successful, the attacker is able to change the logic of SQL statements executed against the database.
23
+ Structured Query Language (SQL) is a specialized programming language for sending queries to databases.
24
+ The SQL programming language is both an ANSI and an ISO standard, though many database products supporting SQL do so with
25
+ proprietary extensions to the standard language. Applications often use user-supplied data to create SQL statements.
26
+ If an application fails to properly construct SQL statements it is possible for an attacker to alter the statement structure
27
+ and execute unplanned and potentially hostile commands. When such commands are executed, they do so under the context of the user
28
+ specified by the application executing the statement. This capability allows attackers to gain control of all database resources
29
+ accessible by that user, up to and including the ability to execute commands on the hosting system.
30
+
31
+ Source: http://projects.webappsec.org/SQL-Injection
32
+ EOF
33
+
34
+ measure = "All user input must be escaped and/or filtered thoroughly before the sql statement is put together. Additionally prepared statements should be used."
35
+
36
+ @finding.update(
37
+ :threat => threat, # thread of vulnerability, e.g. loss of information
38
+ :class => "SQL-Injection", # 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_CRITICAL,
41
+ :measure => measure
42
+ )
43
+
44
+
45
+ def initialize(project, prefs={})
46
+ super(project, prefs)
47
+
48
+ end
49
+
50
+ def generateChecks(chat)
51
+ sql_timing_commands = [
52
+ 'and sleep(SLEEP_TIME)',
53
+ 'and 1 in (select BENCHMARK(20000000,MD5(CHAR(97))))',
54
+ 'and waitfor delay \'0:0:SLEEP_TIME\''
55
+ ]
56
+
57
+ sqli_vectors = [
58
+ '',
59
+ '\'',
60
+ '\'))',
61
+ '\')))',
62
+ ')',
63
+ '))',
64
+ ')))'
65
+ ]
66
+
67
+ sql_terminators = [
68
+ '', '--', ';--'
69
+ ]
70
+
71
+ sqli_patterns = []
72
+ sqli_vectors.each do |v|
73
+ sql_timing_commands.each do |stc|
74
+ sql_terminators.each do |sts|
75
+ sqli_patterns << "#{v} #{stc}#{sts}"
76
+ end
77
+ end
78
+ end
79
+
80
+ check_parms = []
81
+
82
+ urlParmNames(chat).each do |parm|
83
+ pval = chat.request.get_parm_value(parm)
84
+ check_parms << { :name => parm, :value => pval, :type => :url }
85
+ end
86
+
87
+ postParmNames(chat).each do |parm|
88
+ pval = chat.request.post_parm_value(parm)
89
+ check_parms << { :name => parm, :value => pval, :type => :form }
90
+ end
91
+
92
+
93
+ checker = proc {
94
+ test_request = nil
95
+ test_response = nil
96
+ output = ""
97
+
98
+ check_parms.each do |parm|
99
+ # first get multiple response times
100
+ rtimes = []
101
+
102
+ timing_response = nil
103
+
104
+ vulnerable = false
105
+
106
+ 4.times do
107
+ test = chat.copyRequest
108
+ start = Time.now().to_i
109
+ timing_request, timing_response = doRequest(test,:default => true)
110
+ stop = Time.now().to_i
111
+ rtimes << ( stop - start )
112
+
113
+ end
114
+ # now calculate the average time
115
+ average_t = rtimes.inject(:+) / rtimes.length
116
+ max_t = rtimes.max > 5 ? rtimes.max : 5
117
+ # puts "Analyzing timing behaviour ..."
118
+ # rtimes.each do |t|
119
+ # puts t.to_s
120
+ # end
121
+ # puts "Average Response Time: #{average_t}s (max #{max_t}s)"
122
+
123
+ # time_to_sleep = 4 * max_t
124
+ time_to_sleep = max_t
125
+ #timeout_t = time_to_sleep + average_t
126
+ timeout_t = 2 * time_to_sleep
127
+
128
+ test_value = ""
129
+ test = nil
130
+ log_request = nil
131
+ max_timeouts = 2
132
+ timeout_counter = 0
133
+ sqli_start = sqli_stop = 0
134
+
135
+ sqli_patterns.each do |sql|
136
+ timeout_counter = 0
137
+ output = ""
138
+ break if vulnerable
139
+ begin
140
+ sqli_start = Time.now().to_i
141
+ timeout(timeout_t) do
142
+ test = chat.copyRequest
143
+ # also need to check if altered parm will change response
144
+ test_value = CGI.escape("#{parm[:value]}#{sql.gsub(/SLEEP_TIME/, time_to_sleep.to_s)}")
145
+ case parm[:type]
146
+ when :url
147
+ test.replace_get_parm(parm[:name], test_value)
148
+ when :form
149
+ test.replace_post_parm(parm[:name], test_value)
150
+ end
151
+
152
+ test_request, test_response = doRequest(test,:default => true)
153
+ sqli_stop = Time.now().to_i
154
+ end
155
+ rescue Timeout::Error
156
+ timeout_counter += 1
157
+ # puts "[#{self}] Hit Timeout after #{timeout_t} seconds (#{timeout_counter})."
158
+ # puts test
159
+ # puts
160
+ # puts "... retry after #{max_t} seconds ..."
161
+ sleep max_t
162
+ retry unless timeout_counter > 2
163
+ sqli_stop = Time.now().to_i
164
+ output << "Hit Timeout after #{sqli_start - sqli_stop} seconds\n"
165
+ # puts "* redo request with sleep_time=0 to get an apropriate server response ..."
166
+ test = chat.copyRequest
167
+ test_value = CGI.escape("#{parm[:value]}#{sql.gsub(/SLEEP_TIME/, "0")}")
168
+ case parm[:type]
169
+ when :url
170
+ test.replace_get_parm(parm[:name], test_value)
171
+ when :form
172
+ test.replace_post_parm(parm[:name], test_value)
173
+ end
174
+
175
+ dummy_request, test_response = doRequest(test, :default => true)
176
+
177
+ rescue => bang
178
+ puts bang
179
+ puts bang.backtrace
180
+ end
181
+
182
+
183
+ duration = sqli_stop - sqli_start
184
+ # puts duration
185
+ if ( duration >= time_to_sleep )
186
+ puts "Found time-based SQLi in parameter #{parm} !!!"
187
+ puts "after #{duration}s / time-to-sleep #{time_to_sleep}s)"
188
+ test_request.extend Watobo::Mixin::Parser::Url unless test_request.respond_to? :path
189
+ path = "/" + test_request.path
190
+
191
+ vulnerable = true
192
+ output << "SleepTime: #{time_to_sleep}\nQuery Duration: #{duration}s"
193
+
194
+ addFinding( test_request, test_response,
195
+ :check_pattern => "#{test_value}",
196
+ :chat => chat,
197
+ :title => "[#{parm[:name]}] - #{path}",
198
+ :proof_pattern => "",
199
+ :test_item => parm[:name],
200
+ :class => "SQL-Injection (Time-based)",
201
+ :output => output
202
+ )
203
+ #readlines
204
+ break
205
+ end
206
+ end
207
+
208
+ end
209
+
210
+ [ test_request, test_response ]
211
+ }
212
+ yield checker
213
+
214
+
215
+ end
216
+ end
217
+
218
+ # --> eo namespace
219
+ end
220
+ end
221
+ end
222
+ end