arachni 0.2.2.1
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.
- data/ACKNOWLEDGMENTS.md +14 -0
- data/AUTHORS.md +6 -0
- data/CHANGELOG.md +162 -0
- data/CONTRIBUTORS.md +10 -0
- data/EXPLOITATION.md +429 -0
- data/HACKING.md +101 -0
- data/LICENSE.md +341 -0
- data/README.md +350 -0
- data/Rakefile +86 -0
- data/bin/arachni +22 -0
- data/bin/arachni_web +77 -0
- data/bin/arachni_xmlrpc +21 -0
- data/bin/arachni_xmlrpcd +82 -0
- data/bin/arachni_xmlrpcd_monitor +74 -0
- data/conf/README.webui.yaml.txt +44 -0
- data/conf/webui.yaml +11 -0
- data/external/metasploit/LICENSE +24 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_exec.rb +142 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_path_traversal.rb +113 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_php_eval.rb +150 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_php_include.rb +141 -0
- data/external/metasploit/modules/exploits/unix/webapp/arachni_sqlmap.rb +92 -0
- data/external/metasploit/plugins/arachni.rb +536 -0
- data/getoptslong.rb +241 -0
- data/lib/anemone.rb +2 -0
- data/lib/anemone/cookie_store.rb +35 -0
- data/lib/anemone/core.rb +371 -0
- data/lib/anemone/exceptions.rb +5 -0
- data/lib/anemone/http.rb +144 -0
- data/lib/anemone/page.rb +337 -0
- data/lib/anemone/page_store.rb +160 -0
- data/lib/anemone/storage.rb +34 -0
- data/lib/anemone/storage/base.rb +75 -0
- data/lib/anemone/storage/exceptions.rb +15 -0
- data/lib/anemone/storage/mongodb.rb +89 -0
- data/lib/anemone/storage/pstore.rb +50 -0
- data/lib/anemone/storage/redis.rb +90 -0
- data/lib/anemone/storage/tokyo_cabinet.rb +57 -0
- data/lib/anemone/tentacle.rb +40 -0
- data/lib/arachni.rb +16 -0
- data/lib/audit_store.rb +346 -0
- data/lib/component_manager.rb +293 -0
- data/lib/component_options.rb +395 -0
- data/lib/exceptions.rb +76 -0
- data/lib/framework.rb +637 -0
- data/lib/http.rb +809 -0
- data/lib/issue.rb +302 -0
- data/lib/module.rb +4 -0
- data/lib/module/auditor.rb +455 -0
- data/lib/module/base.rb +188 -0
- data/lib/module/element_db.rb +158 -0
- data/lib/module/key_filler.rb +87 -0
- data/lib/module/manager.rb +87 -0
- data/lib/module/output.rb +68 -0
- data/lib/module/trainer.rb +240 -0
- data/lib/module/utilities.rb +110 -0
- data/lib/options.rb +547 -0
- data/lib/parser.rb +2 -0
- data/lib/parser/auditable.rb +522 -0
- data/lib/parser/elements.rb +296 -0
- data/lib/parser/page.rb +149 -0
- data/lib/parser/parser.rb +717 -0
- data/lib/plugin.rb +4 -0
- data/lib/plugin/base.rb +110 -0
- data/lib/plugin/manager.rb +162 -0
- data/lib/report.rb +4 -0
- data/lib/report/base.rb +119 -0
- data/lib/report/manager.rb +92 -0
- data/lib/rpc/xml/client/base.rb +71 -0
- data/lib/rpc/xml/client/dispatcher.rb +49 -0
- data/lib/rpc/xml/client/instance.rb +88 -0
- data/lib/rpc/xml/server/base.rb +90 -0
- data/lib/rpc/xml/server/dispatcher.rb +357 -0
- data/lib/rpc/xml/server/framework.rb +206 -0
- data/lib/rpc/xml/server/instance.rb +191 -0
- data/lib/rpc/xml/server/module/manager.rb +46 -0
- data/lib/rpc/xml/server/options.rb +124 -0
- data/lib/rpc/xml/server/output.rb +299 -0
- data/lib/rpc/xml/server/plugin/manager.rb +58 -0
- data/lib/ruby.rb +5 -0
- data/lib/ruby/object.rb +32 -0
- data/lib/ruby/string.rb +74 -0
- data/lib/ruby/xmlrpc/server.rb +27 -0
- data/lib/spider.rb +200 -0
- data/lib/typhoeus/request.rb +91 -0
- data/lib/typhoeus/response.rb +34 -0
- data/lib/ui/cli/cli.rb +744 -0
- data/lib/ui/cli/output.rb +279 -0
- data/lib/ui/web/log.rb +82 -0
- data/lib/ui/web/output_stream.rb +94 -0
- data/lib/ui/web/report_manager.rb +222 -0
- data/lib/ui/web/server.rb +903 -0
- data/lib/ui/web/server/db/placeholder +0 -0
- data/lib/ui/web/server/public/banner.png +0 -0
- data/lib/ui/web/server/public/bodybg-small.png +0 -0
- data/lib/ui/web/server/public/bodybg.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/pbar-ani.gif +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/ui/web/server/public/css/smoothness/jquery-ui-1.8.9.custom.css +573 -0
- data/lib/ui/web/server/public/favicon.ico +0 -0
- data/lib/ui/web/server/public/footer.jpg +0 -0
- data/lib/ui/web/server/public/icons/error.png +0 -0
- data/lib/ui/web/server/public/icons/info.png +0 -0
- data/lib/ui/web/server/public/icons/ok.png +0 -0
- data/lib/ui/web/server/public/icons/status.png +0 -0
- data/lib/ui/web/server/public/js/jquery-1.4.4.min.js +167 -0
- data/lib/ui/web/server/public/js/jquery-ui-1.8.9.custom.min.js +781 -0
- data/lib/ui/web/server/public/logo.png +0 -0
- data/lib/ui/web/server/public/nav-left.jpg +0 -0
- data/lib/ui/web/server/public/nav-right.jpg +0 -0
- data/lib/ui/web/server/public/nav-selected-left.jpg +0 -0
- data/lib/ui/web/server/public/nav-selected-right.jpg +0 -0
- data/lib/ui/web/server/public/reports/placeholder +1 -0
- data/lib/ui/web/server/public/sidebar-bottom.jpg +0 -0
- data/lib/ui/web/server/public/sidebar-h4.jpg +0 -0
- data/lib/ui/web/server/public/sidebar-top.jpg +0 -0
- data/lib/ui/web/server/public/spider.png +0 -0
- data/lib/ui/web/server/public/style.css +604 -0
- data/lib/ui/web/server/tmp/placeholder +0 -0
- data/lib/ui/web/server/views/dispatcher.erb +85 -0
- data/lib/ui/web/server/views/dispatcher_error.erb +14 -0
- data/lib/ui/web/server/views/error.erb +1 -0
- data/lib/ui/web/server/views/flash.erb +18 -0
- data/lib/ui/web/server/views/home.erb +14 -0
- data/lib/ui/web/server/views/instance.erb +213 -0
- data/lib/ui/web/server/views/layout.erb +95 -0
- data/lib/ui/web/server/views/log.erb +40 -0
- data/lib/ui/web/server/views/modules.erb +71 -0
- data/lib/ui/web/server/views/options.erb +23 -0
- data/lib/ui/web/server/views/output_results.erb +51 -0
- data/lib/ui/web/server/views/plugins.erb +42 -0
- data/lib/ui/web/server/views/report_formats.erb +30 -0
- data/lib/ui/web/server/views/reports.erb +55 -0
- data/lib/ui/web/server/views/settings.erb +120 -0
- data/lib/ui/web/server/views/welcome.erb +38 -0
- data/lib/ui/xmlrpc/dispatcher_monitor.rb +204 -0
- data/lib/ui/xmlrpc/xmlrpc.rb +843 -0
- data/logs/placeholder +0 -0
- data/metamodules/autothrottle.rb +74 -0
- data/metamodules/timeout_notice.rb +118 -0
- data/metamodules/uniformity.rb +98 -0
- data/modules/audit/code_injection.rb +136 -0
- data/modules/audit/code_injection_timing.rb +115 -0
- data/modules/audit/code_injection_timing/payloads.txt +4 -0
- data/modules/audit/csrf.rb +301 -0
- data/modules/audit/ldapi.rb +103 -0
- data/modules/audit/ldapi/errors.txt +26 -0
- data/modules/audit/os_cmd_injection.rb +103 -0
- data/modules/audit/os_cmd_injection/payloads.txt +2 -0
- data/modules/audit/os_cmd_injection_timing.rb +104 -0
- data/modules/audit/os_cmd_injection_timing/payloads.txt +3 -0
- data/modules/audit/path_traversal.rb +141 -0
- data/modules/audit/response_splitting.rb +105 -0
- data/modules/audit/rfi.rb +193 -0
- data/modules/audit/sqli.rb +120 -0
- data/modules/audit/sqli/regexp_ids.txt +90 -0
- data/modules/audit/sqli_blind_rdiff.rb +321 -0
- data/modules/audit/sqli_blind_timing.rb +103 -0
- data/modules/audit/sqli_blind_timing/payloads.txt +51 -0
- data/modules/audit/trainer.rb +89 -0
- data/modules/audit/unvalidated_redirect.rb +90 -0
- data/modules/audit/xpath.rb +104 -0
- data/modules/audit/xpath/errors.txt +26 -0
- data/modules/audit/xss.rb +99 -0
- data/modules/audit/xss_event.rb +134 -0
- data/modules/audit/xss_path.rb +125 -0
- data/modules/audit/xss_script_tag.rb +112 -0
- data/modules/audit/xss_tag.rb +112 -0
- data/modules/audit/xss_uri.rb +125 -0
- data/modules/recon/allowed_methods.rb +104 -0
- data/modules/recon/backdoors.rb +131 -0
- data/modules/recon/backdoors/filenames.txt +16 -0
- data/modules/recon/backup_files.rb +177 -0
- data/modules/recon/backup_files/extensions.txt +28 -0
- data/modules/recon/common_directories.rb +138 -0
- data/modules/recon/common_directories/directories.txt +265 -0
- data/modules/recon/common_files.rb +138 -0
- data/modules/recon/common_files/filenames.txt +17 -0
- data/modules/recon/directory_listing.rb +171 -0
- data/modules/recon/grep/captcha.rb +62 -0
- data/modules/recon/grep/credit_card.rb +85 -0
- data/modules/recon/grep/cvs_svn_users.rb +73 -0
- data/modules/recon/grep/emails.rb +59 -0
- data/modules/recon/grep/html_objects.rb +53 -0
- data/modules/recon/grep/private_ip.rb +54 -0
- data/modules/recon/grep/ssn.rb +53 -0
- data/modules/recon/htaccess_limit.rb +82 -0
- data/modules/recon/http_put.rb +95 -0
- data/modules/recon/interesting_responses.rb +118 -0
- data/modules/recon/unencrypted_password_forms.rb +119 -0
- data/modules/recon/webdav.rb +126 -0
- data/modules/recon/xst.rb +107 -0
- data/path_extractors/anchors.rb +35 -0
- data/path_extractors/forms.rb +35 -0
- data/path_extractors/frames.rb +38 -0
- data/path_extractors/generic.rb +39 -0
- data/path_extractors/links.rb +35 -0
- data/path_extractors/meta_refresh.rb +39 -0
- data/path_extractors/scripts.rb +37 -0
- data/path_extractors/sitemap.rb +31 -0
- data/plugins/autologin.rb +137 -0
- data/plugins/content_types.rb +90 -0
- data/plugins/cookie_collector.rb +99 -0
- data/plugins/form_dicattack.rb +185 -0
- data/plugins/healthmap.rb +94 -0
- data/plugins/http_dicattack.rb +133 -0
- data/plugins/metamodules.rb +118 -0
- data/plugins/proxy.rb +248 -0
- data/plugins/proxy/server.rb +66 -0
- data/plugins/waf_detector.rb +184 -0
- data/profiles/comprehensive.afp +74 -0
- data/profiles/full.afp +75 -0
- data/reports/afr.rb +59 -0
- data/reports/ap.rb +55 -0
- data/reports/html.rb +179 -0
- data/reports/html/default.erb +967 -0
- data/reports/metareport.rb +139 -0
- data/reports/metareport/arachni_metareport.rb +174 -0
- data/reports/plugin_formatters/html/content_types.rb +82 -0
- data/reports/plugin_formatters/html/cookie_collector.rb +66 -0
- data/reports/plugin_formatters/html/form_dicattack.rb +54 -0
- data/reports/plugin_formatters/html/healthmap.rb +76 -0
- data/reports/plugin_formatters/html/http_dicattack.rb +54 -0
- data/reports/plugin_formatters/html/metaformatters/timeout_notice.rb +65 -0
- data/reports/plugin_formatters/html/metaformatters/uniformity.rb +71 -0
- data/reports/plugin_formatters/html/metamodules.rb +93 -0
- data/reports/plugin_formatters/html/waf_detector.rb +54 -0
- data/reports/plugin_formatters/stdout/content_types.rb +73 -0
- data/reports/plugin_formatters/stdout/cookie_collector.rb +61 -0
- data/reports/plugin_formatters/stdout/form_dicattack.rb +52 -0
- data/reports/plugin_formatters/stdout/healthmap.rb +72 -0
- data/reports/plugin_formatters/stdout/http_dicattack.rb +53 -0
- data/reports/plugin_formatters/stdout/metaformatters/timeout_notice.rb +55 -0
- data/reports/plugin_formatters/stdout/metaformatters/uniformity.rb +68 -0
- data/reports/plugin_formatters/stdout/metamodules.rb +89 -0
- data/reports/plugin_formatters/stdout/waf_detector.rb +48 -0
- data/reports/plugin_formatters/xml/content_types.rb +91 -0
- data/reports/plugin_formatters/xml/cookie_collector.rb +70 -0
- data/reports/plugin_formatters/xml/form_dicattack.rb +57 -0
- data/reports/plugin_formatters/xml/healthmap.rb +82 -0
- data/reports/plugin_formatters/xml/http_dicattack.rb +57 -0
- data/reports/plugin_formatters/xml/metaformatters/timeout_notice.rb +67 -0
- data/reports/plugin_formatters/xml/metaformatters/uniformity.rb +82 -0
- data/reports/plugin_formatters/xml/metamodules.rb +91 -0
- data/reports/plugin_formatters/xml/waf_detector.rb +58 -0
- data/reports/stdout.rb +182 -0
- data/reports/txt.rb +77 -0
- data/reports/xml.rb +231 -0
- data/reports/xml/buffer.rb +98 -0
- metadata +516 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Arachni
|
|
3
|
+
Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
|
4
|
+
|
|
5
|
+
This is free software; you can copy and distribute and modify
|
|
6
|
+
this program under the term of the GPL v2.0 License
|
|
7
|
+
(See LICENSE file for details)
|
|
8
|
+
|
|
9
|
+
=end
|
|
10
|
+
|
|
11
|
+
module Arachni
|
|
12
|
+
|
|
13
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# XSS audit module.<br/>
|
|
17
|
+
# It audits links, forms and cookies.
|
|
18
|
+
#
|
|
19
|
+
#
|
|
20
|
+
# @author: Tasos "Zapotek" Laskos
|
|
21
|
+
# <tasos.laskos@gmail.com>
|
|
22
|
+
# <zapotek@segfault.gr>
|
|
23
|
+
# @version: 0.2
|
|
24
|
+
#
|
|
25
|
+
# @see http://cwe.mitre.org/data/definitions/79.html
|
|
26
|
+
# @see http://ha.ckers.org/xss.html
|
|
27
|
+
# @see http://secunia.com/advisories/9716/
|
|
28
|
+
#
|
|
29
|
+
class XSS < Arachni::Module::Base
|
|
30
|
+
|
|
31
|
+
include Arachni::Module::Utilities
|
|
32
|
+
|
|
33
|
+
def initialize( page )
|
|
34
|
+
super( page )
|
|
35
|
+
|
|
36
|
+
@results = []
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def prepare( )
|
|
40
|
+
@_injection_strs = [
|
|
41
|
+
'<arachni_xss_' + seed,
|
|
42
|
+
'<arachni_xss_\'";_' + seed,
|
|
43
|
+
]
|
|
44
|
+
@_opts = {
|
|
45
|
+
:format => [ Format::APPEND | Format::NULL ],
|
|
46
|
+
:flip_param => true
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def run( )
|
|
51
|
+
@_injection_strs.each {
|
|
52
|
+
|str|
|
|
53
|
+
|
|
54
|
+
opts = {
|
|
55
|
+
:match => str,
|
|
56
|
+
:substring => str
|
|
57
|
+
}.merge( @_opts )
|
|
58
|
+
|
|
59
|
+
audit( str, opts )
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.info
|
|
64
|
+
{
|
|
65
|
+
:name => 'XSS',
|
|
66
|
+
:description => %q{Cross-Site Scripting module},
|
|
67
|
+
:elements => [
|
|
68
|
+
Issue::Element::FORM,
|
|
69
|
+
Issue::Element::LINK,
|
|
70
|
+
Issue::Element::COOKIE,
|
|
71
|
+
Issue::Element::HEADER
|
|
72
|
+
],
|
|
73
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
74
|
+
:version => '0.2',
|
|
75
|
+
:references => {
|
|
76
|
+
'ha.ckers' => 'http://ha.ckers.org/xss.html',
|
|
77
|
+
'Secunia' => 'http://secunia.com/advisories/9716/'
|
|
78
|
+
},
|
|
79
|
+
:targets => { 'Generic' => 'all' },
|
|
80
|
+
:issue => {
|
|
81
|
+
:name => %q{Cross-Site Scripting (XSS)},
|
|
82
|
+
:description => %q{Client-side code (like JavaScript) can
|
|
83
|
+
be injected into the web application which is then returned to the user's browser.
|
|
84
|
+
This can lead to a compromise of the client's system or serve as a pivoting point for other attacks.},
|
|
85
|
+
:tags => [ 'xss', 'regexp', 'injection', 'script' ],
|
|
86
|
+
:cwe => '79',
|
|
87
|
+
:severity => Issue::Severity::HIGH,
|
|
88
|
+
:cvssv2 => '9.0',
|
|
89
|
+
:remedy_guidance => 'User inputs must be validated and filtered
|
|
90
|
+
before being returned as part of the HTML code of a page.',
|
|
91
|
+
:remedy_code => '',
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Arachni
|
|
3
|
+
Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
|
4
|
+
|
|
5
|
+
This is free software; you can copy and distribute and modify
|
|
6
|
+
this program under the term of the GPL v2.0 License
|
|
7
|
+
(See LICENSE file for details)
|
|
8
|
+
|
|
9
|
+
=end
|
|
10
|
+
|
|
11
|
+
module Arachni
|
|
12
|
+
|
|
13
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# XSS in HTML element event attribute. <br/>
|
|
17
|
+
# It injects a string and checks if it appears inside an event attribute of any HTML tag.
|
|
18
|
+
#
|
|
19
|
+
# @author: Tasos "Zapotek" Laskos
|
|
20
|
+
# <tasos.laskos@gmail.com>
|
|
21
|
+
# <zapotek@segfault.gr>
|
|
22
|
+
# @version: 0.1.1
|
|
23
|
+
#
|
|
24
|
+
# @see http://cwe.mitre.org/data/definitions/79.html
|
|
25
|
+
# @see http://ha.ckers.org/xss.html
|
|
26
|
+
# @see http://secunia.com/advisories/9716/
|
|
27
|
+
#
|
|
28
|
+
class XSSEvent < Arachni::Module::Base
|
|
29
|
+
|
|
30
|
+
include Arachni::Module::Utilities
|
|
31
|
+
|
|
32
|
+
EVENT_ATTRS = [
|
|
33
|
+
'onload',
|
|
34
|
+
'onunload',
|
|
35
|
+
'onblur',
|
|
36
|
+
'onchange',
|
|
37
|
+
'onfocus',
|
|
38
|
+
'onreset',
|
|
39
|
+
'onselect',
|
|
40
|
+
'onsubmit',
|
|
41
|
+
'onabort',
|
|
42
|
+
'onkeydown',
|
|
43
|
+
'onkeypress',
|
|
44
|
+
'onkeyup',
|
|
45
|
+
'onclick',
|
|
46
|
+
'ondblclick',
|
|
47
|
+
'onmousedown',
|
|
48
|
+
'onmousemove',
|
|
49
|
+
'onmouseout',
|
|
50
|
+
'onmouseover',
|
|
51
|
+
'onmouseup',
|
|
52
|
+
'src' # not an event but it fits the module structure
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
def initialize( page )
|
|
56
|
+
super( page )
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def prepare( )
|
|
60
|
+
@_injection_strs = [
|
|
61
|
+
";arachni_xss_in_element_event=" + seed + '//',
|
|
62
|
+
"\";arachni_xss_in_element_event=" + seed + '//',
|
|
63
|
+
"';arachni_xss_in_element_event=" + seed + '//',
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
@_opts = {
|
|
67
|
+
:format => [ Format::APPEND ],
|
|
68
|
+
}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def run( )
|
|
72
|
+
@_injection_strs.each {
|
|
73
|
+
|str|
|
|
74
|
+
audit( str, @_opts ) {
|
|
75
|
+
|res, opts|
|
|
76
|
+
log( opts, res ) if !( opts[:id] = _check( res, opts[:injected] ) ).empty?
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def _check( res, injected_str )
|
|
82
|
+
return [] if !res.body || !res.body.substring?( injected_str )
|
|
83
|
+
|
|
84
|
+
doc = Nokogiri::HTML( res.body )
|
|
85
|
+
EVENT_ATTRS.each {
|
|
86
|
+
|attr|
|
|
87
|
+
doc.xpath("//*[@#{attr}]").each {
|
|
88
|
+
|elem|
|
|
89
|
+
if elem.attributes[attr].to_s.substring?( injected_str )
|
|
90
|
+
return elem.to_s
|
|
91
|
+
end
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return []
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.info
|
|
99
|
+
{
|
|
100
|
+
:name => 'XSS in HTML element event attribute',
|
|
101
|
+
:description => %q{Cross-Site Scripting in event tag of HTML element.},
|
|
102
|
+
:elements => [
|
|
103
|
+
Issue::Element::FORM,
|
|
104
|
+
Issue::Element::LINK,
|
|
105
|
+
Issue::Element::COOKIE,
|
|
106
|
+
Issue::Element::HEADER
|
|
107
|
+
],
|
|
108
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
109
|
+
:version => '0.1.1',
|
|
110
|
+
:references => {
|
|
111
|
+
'ha.ckers' => 'http://ha.ckers.org/xss.html',
|
|
112
|
+
'Secunia' => 'http://secunia.com/advisories/9716/'
|
|
113
|
+
},
|
|
114
|
+
:targets => { 'Generic' => 'all' },
|
|
115
|
+
:issue => {
|
|
116
|
+
:name => %q{Cross-Site Scripting in event tag of HTML element.},
|
|
117
|
+
:description => %q{Unvalidated user input is being embedded inside an HMTL event element such as "onmouseover".
|
|
118
|
+
This makes Cross-Site Scripting attacks much easier to mount since the user input
|
|
119
|
+
lands in code waiting to be executed.},
|
|
120
|
+
:tags => [ 'xss', 'event', 'injection', 'regexp', 'dom', 'attribute' ],
|
|
121
|
+
:cwe => '79',
|
|
122
|
+
:severity => Issue::Severity::HIGH,
|
|
123
|
+
:cvssv2 => '9.0',
|
|
124
|
+
:remedy_guidance => 'User inputs must be validated and filtered
|
|
125
|
+
before being included in executable code or not be included at all.',
|
|
126
|
+
:remedy_code => '',
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Arachni
|
|
3
|
+
Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
|
4
|
+
|
|
5
|
+
This is free software; you can copy and distribute and modify
|
|
6
|
+
this program under the term of the GPL v2.0 License
|
|
7
|
+
(See LICENSE file for details)
|
|
8
|
+
|
|
9
|
+
=end
|
|
10
|
+
|
|
11
|
+
module Arachni
|
|
12
|
+
|
|
13
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# XSS in path audit module.
|
|
17
|
+
#
|
|
18
|
+
# @author: Tasos "Zapotek" Laskos
|
|
19
|
+
# <tasos.laskos@gmail.com>
|
|
20
|
+
# <zapotek@segfault.gr>
|
|
21
|
+
# @version: 0.1.2
|
|
22
|
+
#
|
|
23
|
+
# @see http://cwe.mitre.org/data/definitions/79.html
|
|
24
|
+
# @see http://ha.ckers.org/xss.html
|
|
25
|
+
# @see http://secunia.com/advisories/9716/
|
|
26
|
+
#
|
|
27
|
+
class XSSPath < Arachni::Module::Base
|
|
28
|
+
|
|
29
|
+
include Arachni::Module::Utilities
|
|
30
|
+
|
|
31
|
+
def initialize( page )
|
|
32
|
+
super( page )
|
|
33
|
+
|
|
34
|
+
@results = []
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def prepare( )
|
|
38
|
+
@str = '/<arachni_xss_path_' + seed
|
|
39
|
+
@__injection_strs = [
|
|
40
|
+
@str,
|
|
41
|
+
'?>"\'>' + @str,
|
|
42
|
+
'?=>"\'>' + @str
|
|
43
|
+
]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def run( )
|
|
47
|
+
|
|
48
|
+
path = get_path( @page.url )
|
|
49
|
+
|
|
50
|
+
@__injection_strs.each {
|
|
51
|
+
|str|
|
|
52
|
+
|
|
53
|
+
url = path + str
|
|
54
|
+
req = @http.get( url )
|
|
55
|
+
|
|
56
|
+
req.on_complete {
|
|
57
|
+
|res|
|
|
58
|
+
__log_results( res, str )
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def self.info
|
|
66
|
+
{
|
|
67
|
+
:name => 'XSSPath',
|
|
68
|
+
:description => %q{Cross-Site Scripting module for path injection},
|
|
69
|
+
:elements => [ ],
|
|
70
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
71
|
+
:version => '0.1.2',
|
|
72
|
+
:references => {
|
|
73
|
+
'ha.ckers' => 'http://ha.ckers.org/xss.html',
|
|
74
|
+
'Secunia' => 'http://secunia.com/advisories/9716/'
|
|
75
|
+
},
|
|
76
|
+
:targets => { 'Generic' => 'all' },
|
|
77
|
+
:issue => {
|
|
78
|
+
:name => %q{Cross-Site Scripting (XSS) in path},
|
|
79
|
+
:description => %q{Client-side code, like JavaScript, can
|
|
80
|
+
be injected into the web application.},
|
|
81
|
+
:tags => [ 'xss', 'path', 'injection', 'regexp' ],
|
|
82
|
+
:cwe => '79',
|
|
83
|
+
:severity => Issue::Severity::HIGH,
|
|
84
|
+
:cvssv2 => '9.0',
|
|
85
|
+
:remedy_guidance => '',
|
|
86
|
+
:remedy_code => '',
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def __log_results( res, id )
|
|
93
|
+
|
|
94
|
+
if res.body.substring?( id )
|
|
95
|
+
|
|
96
|
+
url = res.effective_url
|
|
97
|
+
# append the result to the results hash
|
|
98
|
+
@results << Issue.new( {
|
|
99
|
+
:var => 'n/a',
|
|
100
|
+
:url => url,
|
|
101
|
+
:injected => id,
|
|
102
|
+
:id => id,
|
|
103
|
+
:regexp => 'n/a',
|
|
104
|
+
:regexp_match => 'n/a',
|
|
105
|
+
:elem => Issue::Element::LINK,
|
|
106
|
+
:response => res.body,
|
|
107
|
+
:headers => {
|
|
108
|
+
:request => res.request.headers,
|
|
109
|
+
:response => res.headers,
|
|
110
|
+
}
|
|
111
|
+
}.merge( self.class.info ) )
|
|
112
|
+
|
|
113
|
+
# inform the user that we have a match
|
|
114
|
+
print_ok( "Match at #{url}" )
|
|
115
|
+
print_verbose( "Inected string: #{id}" )
|
|
116
|
+
|
|
117
|
+
# register our results with the system
|
|
118
|
+
register_results( @results )
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
Arachni
|
|
3
|
+
Copyright (c) 2010-2011 Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
|
4
|
+
|
|
5
|
+
This is free software; you can copy and distribute and modify
|
|
6
|
+
this program under the term of the GPL v2.0 License
|
|
7
|
+
(See LICENSE file for details)
|
|
8
|
+
|
|
9
|
+
=end
|
|
10
|
+
|
|
11
|
+
module Arachni
|
|
12
|
+
|
|
13
|
+
module Modules
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# XSS in HTML script tag. <br/>
|
|
17
|
+
# It injects strings and checks if they appear inside HTML 'script' tags.
|
|
18
|
+
#
|
|
19
|
+
# @author: Tasos "Zapotek" Laskos
|
|
20
|
+
# <tasos.laskos@gmail.com>
|
|
21
|
+
# <zapotek@segfault.gr>
|
|
22
|
+
# @version: 0.1.1
|
|
23
|
+
#
|
|
24
|
+
# @see http://cwe.mitre.org/data/definitions/79.html
|
|
25
|
+
# @see http://ha.ckers.org/xss.html
|
|
26
|
+
# @see http://secunia.com/advisories/9716/
|
|
27
|
+
#
|
|
28
|
+
class XSSScriptTag < Arachni::Module::Base
|
|
29
|
+
|
|
30
|
+
include Arachni::Module::Utilities
|
|
31
|
+
|
|
32
|
+
def initialize( page )
|
|
33
|
+
super( page )
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def prepare( )
|
|
37
|
+
@_injection_strs = [
|
|
38
|
+
"arachni_xss_in_script_tag_" + seed + "",
|
|
39
|
+
"\"arachni_xss_in_script_tag_" + seed + "\"",
|
|
40
|
+
"'arachni_xss_in_script_tag_" + seed + "'"
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
@_opts = {
|
|
44
|
+
:format => [ Format::APPEND ],
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def run( )
|
|
49
|
+
@_injection_strs.each {
|
|
50
|
+
|str|
|
|
51
|
+
audit( str, @_opts ) {
|
|
52
|
+
|res, opts|
|
|
53
|
+
_log( res, opts )
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def _log( res, opts )
|
|
59
|
+
# if we have no body or it doesn't contain the injected string under any
|
|
60
|
+
# context there's no point in parsing the HMTL to verify the vulnerability
|
|
61
|
+
return if !res.body || !res.body.substring?( opts[:injected] )
|
|
62
|
+
|
|
63
|
+
begin
|
|
64
|
+
doc = Nokogiri::HTML( res.body )
|
|
65
|
+
|
|
66
|
+
# see if we managed to inject a working HTML attribute to any
|
|
67
|
+
# elements
|
|
68
|
+
if !(html_elem = doc.xpath("//script")).empty? &&
|
|
69
|
+
html_elem.to_s.substring?( opts[:injected] )
|
|
70
|
+
opts[:match] = html_elem.to_s
|
|
71
|
+
log( opts, res )
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.info
|
|
77
|
+
{
|
|
78
|
+
:name => 'XSS in HTML "script" tag',
|
|
79
|
+
:description => %q{Injects strings and checks if they appear inside HTML 'script' tags.},
|
|
80
|
+
:elements => [
|
|
81
|
+
Issue::Element::FORM,
|
|
82
|
+
Issue::Element::LINK,
|
|
83
|
+
Issue::Element::COOKIE,
|
|
84
|
+
Issue::Element::HEADER
|
|
85
|
+
],
|
|
86
|
+
:author => 'Tasos "Zapotek" Laskos <tasos.laskos@gmail.com> ',
|
|
87
|
+
:version => '0.1.1',
|
|
88
|
+
:references => {
|
|
89
|
+
'ha.ckers' => 'http://ha.ckers.org/xss.html',
|
|
90
|
+
'Secunia' => 'http://secunia.com/advisories/9716/'
|
|
91
|
+
},
|
|
92
|
+
:targets => { 'Generic' => 'all' },
|
|
93
|
+
:issue => {
|
|
94
|
+
:name => %q{Cross-Site Scripting in HTML "script" tag.},
|
|
95
|
+
:description => %q{Unvalidated user input is being embedded inside a <script> element.
|
|
96
|
+
This makes Cross-Site Scripting attacks much easier to mount since user input lands inside
|
|
97
|
+
a trusted script.},
|
|
98
|
+
:tags => [ 'xss', 'script', 'tag', 'regexp', 'dom', 'attribute', 'injection' ],
|
|
99
|
+
:cwe => '79',
|
|
100
|
+
:severity => Issue::Severity::HIGH,
|
|
101
|
+
:cvssv2 => '9.0',
|
|
102
|
+
:remedy_guidance => 'User inputs must be validated and filtered
|
|
103
|
+
before being included in executable code or not be included at all.',
|
|
104
|
+
:remedy_code => '',
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|