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