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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +46 -1
- data/bin/nfq_server.rb +0 -9
- data/bin/watobo_gui.rb +3 -13
- data/custom-views/prettify-json.rb +9 -18
- data/icons/watobo.ico +0 -0
- data/icons/watobo.ico.old +0 -0
- data/lib/watobo.rb +10 -19
- data/lib/watobo/adapters.rb +5 -14
- data/lib/watobo/adapters/data_store.rb +50 -59
- data/lib/watobo/adapters/file/file_store.rb +287 -296
- data/lib/watobo/adapters/file/marshal_store.rb +293 -296
- data/lib/watobo/adapters/session_store.rb +5 -14
- data/lib/watobo/ca.rb +1 -10
- data/lib/watobo/config.rb +197 -206
- data/lib/watobo/constants.rb +0 -9
- data/lib/watobo/core.rb +3 -12
- data/lib/watobo/core/active_check.rb +72 -135
- data/lib/watobo/core/active_checks.rb +49 -58
- data/lib/watobo/core/ca.rb +369 -389
- data/lib/watobo/core/cert_store.rb +34 -43
- data/lib/watobo/core/chat.rb +92 -101
- data/lib/watobo/core/chats.rb +271 -280
- data/lib/watobo/core/client_cert_store.rb +106 -35
- data/lib/watobo/core/conversation.rb +48 -57
- data/lib/watobo/core/cookie.rb +23 -32
- data/lib/watobo/core/egress_handlers.rb +98 -0
- data/lib/watobo/core/finding.rb +66 -75
- data/lib/watobo/core/findings.rb +107 -114
- data/lib/watobo/core/forwarding_proxy.rb +13 -22
- data/lib/watobo/core/fuzz_gen.rb +0 -9
- data/lib/watobo/core/intercept_carver.rb +166 -177
- data/lib/watobo/core/intercept_filter.rb +235 -244
- data/lib/watobo/core/interceptor.rb +98 -107
- data/lib/watobo/core/min_class.rb +4 -13
- data/lib/watobo/core/netfilter_queue.rb +170 -179
- data/lib/watobo/core/ott_cache.rb +132 -141
- data/lib/watobo/core/parameter.rb +43 -52
- data/lib/watobo/core/passive_check.rb +103 -102
- data/lib/watobo/core/passive_checks.rb +48 -57
- data/lib/watobo/core/passive_scanner.rb +54 -55
- data/lib/watobo/core/plugin.rb +11 -20
- data/lib/watobo/core/project.rb +3 -9
- data/lib/watobo/core/proxy.rb +43 -52
- data/lib/watobo/core/request.rb +125 -123
- data/lib/watobo/core/response.rb +44 -53
- data/lib/watobo/core/scanner.rb +0 -9
- data/lib/watobo/core/scanner3.rb +405 -414
- data/lib/watobo/core/scope.rb +83 -92
- data/lib/watobo/core/session.rb +1043 -1026
- data/lib/watobo/core/sid_cache.rb +98 -107
- data/lib/watobo/core/subscriber.rb +25 -34
- data/lib/watobo/defaults.rb +21 -30
- data/lib/watobo/external/diff/lcs.rb +0 -9
- data/lib/watobo/external/diff/lcs/array.rb +0 -9
- data/lib/watobo/external/diff/lcs/block.rb +0 -9
- data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
- data/lib/watobo/external/diff/lcs/change.rb +0 -9
- data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
- data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
- data/lib/watobo/external/diff/lcs/string.rb +0 -9
- data/lib/watobo/externals.rb +6 -15
- data/lib/watobo/framework.rb +4 -13
- data/lib/watobo/framework/create_project.rb +60 -69
- data/lib/watobo/framework/init.rb +0 -9
- data/lib/watobo/framework/init_modules.rb +0 -9
- data/lib/watobo/framework/license_text.rb +28 -37
- data/lib/watobo/framework/load_chat.rb +13 -22
- data/lib/watobo/gui.rb +132 -123
- data/lib/watobo/gui/about_watobo.rb +0 -9
- data/lib/watobo/gui/browser_preview.rb +0 -9
- data/lib/watobo/gui/certificate_dialog.rb +0 -9
- data/lib/watobo/gui/chat_diff.rb +0 -9
- data/lib/watobo/gui/chatviewer_frame.rb +73 -72
- data/lib/watobo/gui/checkboxtree.rb +0 -9
- data/lib/watobo/gui/checks_policy_frame.rb +0 -9
- data/lib/watobo/gui/client_cert_dialog.rb +96 -87
- data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
- data/lib/watobo/gui/conversation_table.rb +158 -164
- data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
- data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
- data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
- data/lib/watobo/gui/custom_viewer.rb +374 -383
- data/lib/watobo/gui/dashboard.rb +296 -303
- data/lib/watobo/gui/define_scope_frame.rb +0 -9
- data/lib/watobo/gui/differ_frame.rb +215 -224
- data/lib/watobo/gui/edit_comment.rb +0 -9
- data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
- data/lib/watobo/gui/export_dialog.rb +104 -113
- data/lib/watobo/gui/finding_info.rb +0 -9
- data/lib/watobo/gui/findings_tree.rb +210 -217
- data/lib/watobo/gui/full_scan_dialog.rb +0 -9
- data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
- data/lib/watobo/gui/fxsave_thread.rb +14 -0
- data/lib/watobo/gui/goto_url_dialog.rb +70 -79
- data/lib/watobo/gui/hex_viewer.rb +0 -9
- data/lib/watobo/gui/html_viewer.rb +287 -296
- data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
- data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
- data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
- data/lib/watobo/gui/json_viewer.rb +287 -0
- data/lib/watobo/gui/list_box.rb +101 -110
- data/lib/watobo/gui/log_file_viewer.rb +32 -41
- data/lib/watobo/gui/log_viewer.rb +83 -88
- data/lib/watobo/gui/login_wizzard.rb +0 -9
- data/lib/watobo/gui/main_window.rb +587 -618
- data/lib/watobo/gui/manual_request_editor.rb +620 -565
- data/lib/watobo/gui/master_pw_dialog.rb +0 -9
- data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
- data/lib/watobo/gui/page_tree.rb +217 -226
- data/lib/watobo/gui/password_policy_dialog.rb +0 -9
- data/lib/watobo/gui/plugin_board.rb +0 -9
- data/lib/watobo/gui/preferences_dialog.rb +0 -9
- data/lib/watobo/gui/progress_window.rb +17 -27
- data/lib/watobo/gui/project_wizzard.rb +0 -9
- data/lib/watobo/gui/proxy_dialog.rb +1 -10
- data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
- data/lib/watobo/gui/request_builder_frame.rb +102 -111
- data/lib/watobo/gui/request_editor.rb +181 -137
- data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
- data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
- data/lib/watobo/gui/save_chat_dialog.rb +140 -149
- data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
- data/lib/watobo/gui/select_chat_dialog.rb +0 -9
- data/lib/watobo/gui/session_management_dialog.rb +0 -9
- data/lib/watobo/gui/sites_tree.rb +0 -9
- data/lib/watobo/gui/status_bar.rb +0 -9
- data/lib/watobo/gui/table_editor.rb +0 -9
- data/lib/watobo/gui/tagless_viewer.rb +0 -9
- data/lib/watobo/gui/templates/plugin.rb +0 -9
- data/lib/watobo/gui/templates/plugin2.rb +92 -100
- data/lib/watobo/gui/templates/plugin_base.rb +144 -153
- data/lib/watobo/gui/text_viewer.rb +0 -9
- data/lib/watobo/gui/transcoder_window.rb +0 -9
- data/lib/watobo/gui/utils/gui_utils.rb +0 -9
- data/lib/watobo/gui/utils/init_icons.rb +86 -95
- data/lib/watobo/gui/utils/load_icons.rb +33 -42
- data/lib/watobo/gui/utils/load_plugins.rb +116 -119
- data/lib/watobo/gui/utils/master_password.rb +68 -77
- data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
- data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
- data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
- data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
- data/lib/watobo/gui/utils/session_history.rb +112 -121
- data/lib/watobo/gui/workspace_dialog.rb +0 -9
- data/lib/watobo/gui/www_auth_dialog.rb +0 -9
- data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
- data/lib/watobo/http.rb +4 -13
- data/lib/watobo/http/cookies/cookies.rb +26 -35
- data/lib/watobo/http/data/data.rb +45 -54
- data/lib/watobo/http/data/json.rb +47 -55
- data/lib/watobo/http/url/url.rb +38 -47
- data/lib/watobo/http/xml/xml.rb +124 -130
- data/lib/watobo/interceptor.rb +3 -12
- data/lib/watobo/interceptor/proxy.rb +742 -739
- data/lib/watobo/interceptor/transparent.rb +22 -24
- data/lib/watobo/mixins.rb +10 -19
- data/lib/watobo/mixins/check_info.rb +27 -36
- data/lib/watobo/mixins/httpparser.rb +613 -637
- data/lib/watobo/mixins/request_parser.rb +88 -97
- data/lib/watobo/mixins/shapers.rb +515 -529
- data/lib/watobo/mixins/transcoders.rb +3 -11
- data/lib/watobo/parser.rb +1 -10
- data/lib/watobo/parser/html.rb +83 -92
- data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
- data/lib/watobo/sockets.rb +3 -12
- data/lib/watobo/sockets/agent.rb +828 -837
- data/lib/watobo/sockets/client_socket.rb +308 -312
- data/lib/watobo/sockets/connection.rb +401 -410
- data/lib/watobo/sockets/http_socket.rb +11 -13
- data/lib/watobo/sockets/ntlm_auth.rb +129 -138
- data/lib/watobo/utils.rb +10 -19
- data/lib/watobo/utils/check_regex.rb +0 -9
- data/lib/watobo/utils/copy_object.rb +0 -9
- data/lib/watobo/utils/crypto.rb +0 -9
- data/lib/watobo/utils/expand_range.rb +23 -32
- data/lib/watobo/utils/export_xml.rb +97 -106
- data/lib/watobo/utils/file_management.rb +9 -11
- data/lib/watobo/utils/hexprint.rb +9 -18
- data/lib/watobo/utils/load_chat.rb +0 -9
- data/lib/watobo/utils/load_icon.rb +0 -9
- data/lib/watobo/utils/ntlm.rb +866 -875
- data/lib/watobo/utils/print_debug.rb +12 -21
- data/lib/watobo/utils/response_builder.rb +90 -99
- data/lib/watobo/utils/response_hash.rb +0 -9
- data/lib/watobo/utils/secure_eval.rb +0 -9
- data/lib/watobo/utils/strings.rb +10 -19
- data/lib/watobo/utils/text2request.rb +0 -9
- data/lib/watobo/utils/url.rb +23 -32
- data/lib/watobo/utils/utf16.rb +11 -20
- data/modules/active/Apache/mod_status.rb +0 -9
- data/modules/active/Apache/multiview.rb +151 -160
- data/modules/active/Flash/crossdomain.rb +0 -9
- data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
- data/modules/active/cq5/cq5_default_selectors.rb +106 -115
- data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
- data/modules/active/directories/dirwalker.rb +0 -9
- data/modules/active/discovery/fileextensions.rb +0 -9
- data/modules/active/discovery/http_methods.rb +0 -9
- data/modules/active/discovery/jsmapfiles.rb +79 -0
- data/modules/active/domino/domino_db.rb +68 -76
- data/modules/active/dotNET/custom_errors.rb +102 -111
- data/modules/active/dotNET/dotnet_files.rb +90 -99
- data/modules/active/fileinclusion/lfi_simple.rb +0 -9
- data/modules/active/jboss/jboss_basic.rb +0 -9
- data/modules/active/sap/business_objects.rb +51 -60
- data/modules/active/sap/its_commands.rb +0 -9
- data/modules/active/sap/its_service_parameter.rb +0 -9
- data/modules/active/sap/its_services.rb +0 -9
- data/modules/active/sap/its_xss.rb +0 -9
- data/modules/active/shell_shock/shell_shock.rb +139 -148
- data/modules/active/siebel/siebel_apps.rb +160 -169
- data/modules/active/sqlinjection/sql_boolean.rb +0 -9
- data/modules/active/sqlinjection/sql_numerical.rb +198 -0
- data/modules/active/sqlinjection/sqli_error.rb +0 -9
- data/modules/active/sqlinjection/sqli_timing.rb +220 -229
- data/modules/active/struts2/default_handler_ognl.rb +106 -115
- data/modules/active/struts2/include_params_ognl.rb +105 -114
- data/modules/active/xml/xml_xxe.rb +112 -123
- data/modules/active/xss/xss_ng.rb +214 -223
- data/modules/active/xss/xss_simple.rb +0 -9
- data/modules/passive/ajax.rb +68 -77
- data/modules/passive/autocomplete.rb +56 -65
- data/modules/passive/cookie_options.rb +0 -9
- data/modules/passive/cookie_xss.rb +0 -9
- data/modules/passive/detect_code.rb +0 -9
- data/modules/passive/detect_fileupload.rb +0 -9
- data/modules/passive/detect_infrastructure.rb +0 -9
- data/modules/passive/detect_one_time_tokens.rb +0 -9
- data/modules/passive/dirindexing.rb +0 -9
- data/modules/passive/disclosure_domino.rb +55 -64
- data/modules/passive/disclosure_emails.rb +0 -9
- data/modules/passive/disclosure_ipaddr.rb +55 -53
- data/modules/passive/filename_as_parameter.rb +0 -9
- data/modules/passive/form_spotter.rb +0 -9
- data/modules/passive/hidden_fields.rb +50 -59
- data/modules/passive/hotspots.rb +0 -9
- data/modules/passive/in_script_parameter.rb +0 -9
- data/modules/passive/json_web_token.rb +93 -0
- data/modules/passive/multiple_server_headers.rb +0 -9
- data/modules/passive/possible_login.rb +0 -9
- data/modules/passive/redirect_url.rb +0 -9
- data/modules/passive/redirectionz.rb +0 -9
- data/modules/passive/sap-headers.rb +56 -65
- data/modules/passive/xss_dom.rb +0 -9
- data/plugins/aem/aem.rb +11 -20
- data/plugins/aem/gui/main.rb +118 -127
- data/plugins/aem/gui/tree_view.rb +171 -180
- data/plugins/aem/lib/agent.rb +130 -138
- data/plugins/aem/lib/dispatcher.rb +45 -51
- data/plugins/aem/lib/engine.rb +177 -186
- data/plugins/catalog/catalog.rb +345 -355
- data/plugins/crawler/crawler.rb +4 -13
- data/plugins/crawler/gui.rb +5 -14
- data/plugins/crawler/gui/auth_frame.rb +270 -279
- data/plugins/crawler/gui/crawler_gui.rb +271 -276
- data/plugins/crawler/gui/general_settings_frame.rb +96 -105
- data/plugins/crawler/gui/hooks_frame.rb +80 -89
- data/plugins/crawler/gui/scope_frame.rb +50 -59
- data/plugins/crawler/gui/settings_tabbook.rb +38 -47
- data/plugins/crawler/gui/status_frame.rb +59 -68
- data/plugins/crawler/lib/bags.rb +18 -27
- data/plugins/crawler/lib/constants.rb +11 -20
- data/plugins/crawler/lib/engine.rb +488 -497
- data/plugins/crawler/lib/grabber.rb +68 -77
- data/plugins/crawler/lib/status.rb +71 -80
- data/plugins/crawler/lib/uri_mp.rb +12 -21
- data/plugins/filefinder/filefinder.rb +326 -333
- data/plugins/sqlmap/bin/test.rb +78 -87
- data/plugins/sqlmap/gui.rb +4 -13
- data/plugins/sqlmap/gui/main.rb +218 -227
- data/plugins/sqlmap/gui/options_frame.rb +97 -106
- data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
- data/plugins/sqlmap/sqlmap.rb +2 -11
- data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
- data/plugins/sslchecker/gui/cipher_table.rb +246 -254
- data/plugins/sslchecker/gui/gui.rb +258 -264
- data/plugins/sslchecker/gui/sslchecker.rb +4 -13
- data/plugins/sslchecker/lib/check.rb +127 -133
- data/plugins/wshell/gui/main.rb +119 -117
- data/plugins/wshell/lib/core.rb +38 -88
- data/plugins/wshell/wshell.rb +11 -20
- 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
|
-
|
|
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
|