A Web Application Vulnerability
A Web Application Vulnerability
Work Completed
The site crawler has been designed and implemented, and finds all inputs on pages reachable with
the given credentials or cookies. Both reflected and stored XSS detection have been implemented,
detecting many known vulnerabilities on tested websites. Both *NIX and Windows command
injection have been implemented, using a range of methods to discover vulnerabilities on a range
of systems. I have also implemented code injection, path traversal, and ShellShock vulnerability
tests as extensions. Vulnerability reports are created, indicating the vulnerability locations, and
optionally providing explanations and mitigations for the vulnerabilities.
Special Difficulties
Pandemic.
1
Counted with TeXCount
2
Counted with cat ∗{,/∗}.py ∗.sh | wc −l
2
Contents
1 Introduction 5
1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Related Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Preparation 7
2.1 Requirements Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Cross Site Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Command Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Code Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 ShellShock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Path Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 Technologies Used . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8 Professional Practice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8.1 Development Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8.2 Legality & Disclaimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8.3 Licences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.9 Starting Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 Implementation 15
3.1 System Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Scanner Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 Crawling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3.1 Finding Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.2 Finding Inputs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.3 Additional URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 OS Fingerprinting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Cross Site Scripting (XSS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5.1 XSS Payloads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6 Command Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6.1 Web Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6.2 Sleeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6.3 Command Injection Payloads . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7 Code Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7.1 Disambiguation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7.2 Collision with Command Injection . . . . . . . . . . . . . . . . . . . . . . . . 22
3.8 ShellShock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.9 Path Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3
3.9.1 Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.10 Repository Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 Evaluation 25
4.1 Vulnerabilities Discovered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 Comparison to other many-vulnerability scanners . . . . . . . . . . . . . . . . . . . 27
4.3 Comparison to other single-purpose scanners . . . . . . . . . . . . . . . . . . . . . . 29
4.3.1 XSS Scanners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.2 Command and Code Injection Scanners . . . . . . . . . . . . . . . . . . . . . 30
4.3.3 Path Traversal Scanners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.3.4 ShellShock scanners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.4 Discovered Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 Conclusions 34
5.1 Successes and Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.2 The Project in Hindsight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3 Possible Continuations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
List of Figures
List of Tables
4
Chapter 1
Introduction
Web-applications are often subject to attacks from hackers for a variety of reasons, from gathering
data stored by the website to replacing files served with malicious ones. There is a large range
of well-known vulnerabilities in web-applications that can be used to attack a site, and it is vital
that these are detected before they are exploited. In this dissertation, I present Pinpoint: a
web-application vulnerability scanner for automated detection and reporting of common website
vulnerabilities.
1.1 Motivation
Many common vulnerabilities go unknown by website developers, as well as the methods for their
mitigation and prevention. This leads to many severe issues being present on websites, likely to be
unpatched until they are exploited and cause major damage to the site owners. A common way to
avoid being vulnerable to such attacks is to hire a penetration tester (or “pentester”), to attempt
to break into the website or server and report any vulnerabilities found so that the application
developers can fix them.
Pentesters make use of a variety of tools to aid discovery and exploitation of these vulnerabilities.
For example, ZAP [10] and W3AF [14] are both scanners that test for a wide range of common
vulnerabilities in websites. There are also many tools that test for single vulnerabilities, such as
XSSer [6] for cross site scripting and Commix [3] for command injection.
The most common and most dangerous vulnerabilities are documented by publications such as
the OWASP top ten critical web-application security risks [11] and the HackerOne top ten most
impactful and rewarded vulnerability types [7]. The major vulnerabilities seen on both of these
lists include XSS, various types of injection, broken authentication and CSRF. Many of these can
be discovered by hiring a pentester, or automatically through use of vulnerability-detection tools.
In this project, I aim to create a tool that scans for a variety of common website vulnerabilities,
focusing on the most commonly reported vulnerability, XSS, and one of the most dangerous
vulnerabilities, command injection. The core design feature is extensibility, such that new vulnerability
tests can be easily added in the future.
5
1.2 Related Work
There exist many tools for detecting and exploiting vulnerabilities that are widely used by pentesters
and hackers alike. The OWASP Zed Attack Proxy (ZAP) [10] project is created by OWASP to
find instances of their top ten vulnerabilities, as well as various other vulnerabilities. W3AF [14]
is a similar project created in Python, and aims to become “the nmap for the Web” over time.
For the problem of XSS, there are tools such as XSSer [6], which discovers XSS vulnerabilities by
searching for parameters that could be injected into, then submitting an attack vector combined
with a payload containing a hash for this test. If the payload is triggered and the hash part of
the result, then a vulnerability can be reported. XSSer tests over 1300 different vectors for XSS,
discovering the majority of possible vulnerabilities.
The most popular tool for command injection is Commix [3]. Commix attacks the given pages
by attempting to force all inputs to execute a command that Commix can validate has executed
correctly. Commix also proves a “psuedo-terminal” to the user on success, allowing them to run
commands like in a terminal, while Commix repeatedly exploits the found vulnerability.
6
Chapter 2
Preparation
This chapter begins with an analysis of what is required of the project in section 2.1, identifying a
set of required features as well as a set of extensions. This is followed by discussions the results of my
background research into each of the vulnerabilities in sections 2.2 through 2.6, including what each
vulnerability is, how it is exploited, and how it can be prevented. The end of this chapter contains
notes on the technologies used for this project and professional practices in sections 2.7 and 2.8,
and the starting point of the project in section 2.9.
7
The two proposed interfaces are a GUI and a browser plugin, both of which would make the
application much more user-friendly. On the other hand, they would both be considerable amounts
of work, and the vulnerability extensions shall be prioritised over the interfaces.
In reflected XSS, an HTTP request causes JavaScript to be run on the resulting page. If this
is a get request, the malicious code can be obfuscated to avoid suspicion, and the link can then
be shared in phishing attacks to run code on victim’s browsers. This can occur whenever a user
supplied value appears somewhere in the resulting page.
In persistent XSS, JavaScript can be submitted to a page which is stored on the website indefinitely.
Any user visiting the page unknowingly runs the malicious code provided previously. This is
possible anywhere input is shown to all users of a site — common examples are comment or review
forms.
In DOM XSS [8], the malicious code is not part of the raw HTML of our page, but instead is
loaded into the DOM at parse time - for example, JavaScript can be included in the URL, and
if the code that runs as a result evaluates document.URL at run-time, the malicious code will
be executed without it appearing on the page. This is a niche method for exploiting XSS and
nowadays is prevented by the browser, and so we are not concerned with its detection.
XSS attacks can be used to steal information from or to control the victim’s browser. One of the
most common attacks is cookie stealing, in which an attacker provides a payload such as
<img s r c=” h t t p : / / a t t a c k e r −i p / ”+document . c o o k i e />
and then sets up a local web server to listen for incoming HTTP requests. Whenever this payload
runs on a victim’s browser, an HTTP request is made to the attacker’s server which includes the
cookies from the browser, and so the attacker can record the cookies to be able to log in as the
victim at a later date.
Much more complex attacks can also be run even by low skilled hackers, or “script kiddies”, due
to the availability of websites such as xss-payloads1 which provide ready to run payloads, covering
attacks such as keylogging and forcing a malicious file to be downloaded. Frameworks such as
BeEF [2] also allow for many attacks to be run easily, by providing a “hook” script that turns all
victim browsers into “zombies” that can be forced to run any of over 300 readily available payloads
at any time. This can be injected into a vulnerable site with a payload as simple as
< s c r i p t s r c=” h t t p : / / a t t a c k e r −i p : 3 0 0 0 / hook . j s ”></ s c r i p t >
which the BeEf framework provides for the user, alongside some example sites to test it out on.
1
http://www.xss-payloads.com/
8
To prevent XSS, extensive filtering needs to be put in place on user input. It is advisable to
use existing XSS filtering functions provided by web frameworks, as it is easy to miss an attack
vector when implementing one’s own filtering. OWASP provides cheat sheets for preventing XSS
[13], aiding website developers, as well as evading filters that prevent XSS [12] for the benefit of
penetration testers.
9
Code injection is not limited to eval - some programming languages have additional vulnerabilities
that are easily left unknown by developers and are present in their site. For example, in Perl there
are two versions of the “open” method for files: one with two arguments and one with a third
that defines the mode to open the file. In the two argument version, the file is opened through the
command line, meaning that if there are any pipes or other redirect characters in the file name
system commands can be executed through file open. Consider the example:
$user input = ” f i l e | ls | ” ;
open (my $fh , ” / p a t h / t o / f o l d e r / ” . $ u s e r i n p u t ) ;
In this example, a file is opened, redirects the data to ls - which ignores the input and executes -
then the output of ls is sent to the file handler $fh. This is effectively equivalent to running
cat / path / to / f o l d e r / f i l e | l s |
in Bash, and hence ls can be replaced with any system command and run these commands on the
server, through Perl.
Code injection can generally be prevented by avoiding the use of eval in any programming language.
Specific examples such as the Perl open vulnerability often require knowledge of the vulnerability,
however modern programming tutorials tend to hide this from programmers by attempting to
avoid awareness of the vulnerable version entirely, showing only the safe version of the command.
For example, the Perl open documentation2 shows many examples of 3 argument open, and only
explicitly mentions the 2 argument version to say that “it is safe to use the two-argument form of
open if the filename argument is a known literal”.
2.5 ShellShock
ShellShock is a vulnerability in old versions of Bash in which a user defined environment variable
can be used to run arbitrary commands. When a new instance of Bash is created, Bash looks
through the table of environment variables for any encoded scripts, creates a command that defines
these scripts and then runs the command. In CVE-2014-62713 , it was discovered that any trailing
strings after a function defined in an environment variable are executed when Bash parses the
environment variable table. As such, anyone with the ability to define environment variables could
run arbitrary code on the server. The main attack vectors for this are web servers using Apache’s
Common Gateway Interface (CGI), scripts run by some DHCP clients, and the ForceCommand
feature of OpenSSH. Shortly after the vulnerability was first disclosed and an initial patch released,
several other new CVEs456 featuring methods to exploit ShellShock were announced despite the
initial patch.
The principle CVE explains an exploit similar to the following:
env x= ’ ( ) { : ; } ; echo S h e l l Shocked ’ b a s h −c ” echo t e s t i n g ”
In which an environment variable’s definition includes an empty function, as well as a command
to print “Shell Shocked”, which should never run. It then invokes a new Bash instances which
2
https://perldoc.perl.org/functions/open.html
3
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
4
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6277
5
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6278
6
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
10
then prints “testing”. On vulnerable machines, the new Bash instance evaluates the environment
variable x, including the trailing command, and hence also print “Shell Shocked”.
The fix for this vulnerability is to update the server’s version of Bash.
In the Apache CGI case, an attacker can submit carefully crafted HTTP requests to files in the
cgi-bin directory (or equivalent directory reserved for storing CGI scripts) on the web server. The
headers from this request are copied to environment variables before the target CGI script is run.
Bash scripts or files which otherwise call Bash (using system() calls for example) are vulnerable
to ShellShock through the environment variables sent in the request, and run the malicious code
placed in the HTTP headers.
http://www.mywebsite.com/image-viewer.php?file=example.jpg
which allows the user to select one of the available files uploaded to a directory. The malicious
user can then escape this directory with a filename such as
http://www.mywebsite.com/image-viewer.php?file=../../../etc/passwd
to be able to access any file available on the system. If this system adds an extension to the file
provided, for example above if the url contained ? file =example and the .jpg is added by the web
server, it is often possible to provide a null terminator (%00 at the end of the URL) so that the file
extension is never read and we can still access non-jpg files from the server. This does not always
work, for example when strings have fixed length and do not rely on null terminators or if the null
character is escaped.
It is possible for this vulnerability to leak more sensitive information than the example /etc/passwd
- if the web server needs to access an external site or service that requires a login, it is common
for this to be stored in plaintext somewhere on the server. If this is true, the login information
can be obtained through a path traversal vulnerability. Equally, if a database is in use by the web
server, the local login credentials must be stored in plaintext and accessible by the website - which
the malicious user is now acting as. This allows the user to gain remote access to the website
database, potentially causing a large data breach.
11
Path traversal can be prevented in multiple ways. The main method is to never use user input,
or user controllable input, as part of a file path name. If this is not possible, validation can be
performed on the input provided, either ensuring it is one of a set of known safe paths (by comparing
to a list of files in a folder, for example) or by performing filtering of dot and slash characters in
the path after “normalising” the input (by decoding from URL encoding and replacing overloaded
Unicode characters with their ASCII variants). If available, a chroot jail can additionally be used
to limit potential path traversal to the website root directory (for example, Apache2 on *NIX
systems stores all files in /var/www/html).
12
In the United Kingdom, unauthorised access to computer material is illegal under the Computer
Misuse Act 1990 [1], section 1, even if it is not directed at any specific program or data (article 2):
Furthermore, access with intent to facilitate further offences is illegal under the Computer Misuse
Act 1990, section 2, article 1:
(1) A person is guilty of an offence under this section if he commits an offence under
section 1 above (“the unauthorised access offence”) with intent—
(a) to commit an offence to which this section applies; or
(b) to facilitate the commission of such an offence (whether by himself or by any
other person);
Existing vulnerability scanning tools often include a disclaimer to warn users of this fact and to
avoid liability. Having researched the disclaimers used by a variety of tools, it is noted that many
are almost identical. I have chosen the disclaimer used by XSSSniper [4], as it is not worded
specifically to the program and it is in the same format observed with other scanners. On program
launch, the disclaimer states:
Scanning targets without prior mutual consent is illegal. It is the end user’s responsibility
to obey all applicable local, state and federal laws. Authors assume no liability and
are not responsible for any misuse or damage caused by this program.
13
2.8.3 Licences
This project has two dependencies with licences: Selenium Webdriver and Webhook-Listener.
Selenium Webdriver is shared under the Apache 2.0 License7 , permitting use, modification and
distribution of the software. It is required that a licence and copyright notice is included if my
project is a copy or derivative of Selenium, in addition to stating any changes made to the software,
however Pinpoint simply uses the software and hence this is not necessary.
Webhook-Listener is distributed under the MIT license8 , permitting the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the software. A notice must be included
in all copies or substantial portions of the software, however as Pinpoint uses the package and is
not modifying it this is not necessary.
I have chosen to include an Apache 2.0 License with Pinpoint. This preserves my copyright while
allowing the use, modification and derivation of the project for those who wish to.
7
https://www.apache.org/licenses/LICENSE-2.0.html
8
https://opensource.org/licenses/MIT
14
Chapter 3
Implementation
This chapter commences with a discussion of the structure of the project and the major design
decisions made in section 3.1. The core functionality of the scanner is described in section 3.2,
followed by detail of the pre-scan crawling (section 3.3) and OS fingerprinting (section 3.4). The
scans for each of the vulnerabilities are then explored in sections 3.5 through 3.9. A detailed
overview of the repository structure is provided in section 3.10.
15
Figure 3.1: Pinpoint UML diagram
16
The crawler is its own class, enabling a single instance to combine the different methods of locating
possible vulnerable locations on the website. The main functions for exploring the website are
crawl page, which finds all URLs and Locators on a given page, and crawl from, which performs
a breadth-first search crawl of the website. Additionally, crawl robots and crawl sitemap provide
additional methods of finding URLs to explore later.
The main report object combines all of the VulnReports found by the various Exploits of the
scanner. It abstracts away the work of removing duplicate reports, as well as sorting the reports
into the pages they are attacking.
3.3 Crawling
The web crawler begins by loading the given start page from the user. It then repeatedly finds URLs
and forms on the current web page, adding all found URLs to to explore and storing the Locators
representing the forms for later use. The crawler uses a breadth first search, implemented by using
a deque as the to explore queue and storing the URLs already seen in a set called explored. The use
of a set allows for constant time lookup and insert, which are the two operations required during
crawling. Python does not provide a queue structure, and hence a deque is used for to explore,
ignoring the additional functionality provided.
The crawler allows for both a maximum depth to be set, as well as a maximum time. To allow
the depth to be limited, the point in the queue where the depth of pages being explored changes
is tracked. This is done by appending the current depth after all URLs at that depth: appending
17
“1” to the initial set of URLs, then upon finding an integer in the queue, add one and append to
the end of the list if it does not indicate that the maximum depth has been reached.
There are two methods to limit the execution time of a process in Python: through Signals, which
throw an exception after a given period, or by running the process in another thread and limiting
the execution of this thread. Python signals can be ignored, notably by a Request waiting for a
reply, whereas thread joins always force the thread to terminate and hence time limiting has been
implemented with threads.
The web crawler was implemented with Python Requests and Beautiful Soup, as Requests provides
a fast HTTP request interface and Beautiful Soup allows simple parsing and querying of the HTML
result.
18
3.4 OS Fingerprinting
During various vulnerability tests, the payloads used are often specific to either Windows or *NIX
systems. As such, it is useful to attempt to identify the operating system being run by the web
server, known as fingerprinting. This allows payloads that do not work on the given operating
system to be removed, using all payloads if the OS family in use cannot be identified.
To achieve this, Pinpoint uses banner grabbing: using the HTTP request headers sent by the server
to identify information about the server. Pinpoint sends a HEAD request to the page given in
the command line over a raw socket, which the server replies to with the standard headers for the
website. Within these headers should be the “server” header, in which the web server identifies
what system it is running. This commonly includes keywords such as “ubuntu”, “freebsd” or
“windows”, allowing us to identify the operating system in use. This is not always the case, as
some servers may state the server software in use (such as “cloudflare” or “apache”) without listing
the operating system. If this is the case, Pinpoint identifies the OS as “unknown” and does not
use the optimisations that would be available from knowing the operating system.
19
3.5.1 XSS Payloads
There are multiple methods of running an alert in the browser. The most simple cases are plain
JavaScript, and JavaScript which is surrounded by <script> tags. JavaScript can also run inside
certain properties of HTML tags, such as image sources. Furthermore, event handlers can be
defined on HTML tags to run custom code on load or error, and force these scenarios to occur if they
do not already. For example, an onerror event handler containing malicious code can be created,
providing another invalid attribute such as the source in <img src=/ onerror=’malicious code()’ />
to trigger the error handler.
Our code may not be placed in the page in a way where it can run on its own: it may instead be
in a certain “context” that can be escaped, such as an HTML comment, HTML element or inside
quotes. Pinpoint contains a list of escapes that can optionally be combined with each of the other
payloads to improve XSS coverage.
The solution to XSS is to use input filtering, however it is often possible to work around filters
that have not been extensively tested. As such, Pinpoint is also capable of encoding all payloads
in a variety of methods to evade badly implemented filters. Methods for doing this are largely
taken from the OWASP XSS filter evasion cheatsheet [12]. The encodings chosen attempt to hide
from filters in two ways: encoding special characters, and encoding the alert that runs.
Special characters can be encoded using URL encoding or double URL encoding, in which %hex
or %25hex are used to encode special characters. %25 is the encoding of %, which allows %25hex
to reduce to %hex and then be evaluated while avoiding filters that are aware of standard URL
encodings of characters. Alternatively, the HTML & encodings for these special characters can be
used. For the alert, JavaScript methods can be used to decode and then run versions of the alert
from hex, Unicode or base64.
20
3.6.2 Sleeping
Command injection can be detected by forcing the web server to sleep, delaying the reply to the
attacker’s system. Before attacking, the time for a standard request to this page is recorded, which
is done in the constructor for the Exploit by sending gathered default values. The amount of time
to force the server to sleep must be selected: if a large period of time is used, there is higher
confidence in the vulnerability being present, but this forces the scanner to pause for a long time
while the request is running. If short period of time is used, there is an increased risk of false
positives. A balance between the two is to use a relatively short timeout of three seconds, but
force each test to be successful three times in a row before reporting it as a vulnerability.
3.7.1 Disambiguation
There exist a variety of common methods to call to the command line: system ”command”, exec ”command”
and `command`being the most common. While these can be used to detect code injection, the
language being injected into is unknown. As such, payloads which only run in one language will
be attempted before moving onto ambiguous commands.
Within PHP, any of back ticks, system, exec or shell exec can be used to run system commands.
Pinpoint tests with shell exec for PHP as this method is unique to the language, and classifies the
others as ambiguous code injection.
Within Perl, both back ticks and exec can be used to call to the system - both of which are present
in other languages. This means if a Perl application is vulnerable due to a misuse of eval, Pinpoint
reports an ambiguous injection. On the other hand, Perl’s open function provides an additional
code injection vulnerability, which is uniquely classifiable as a Perl vulnerability. This is tested for
by using | command | and = command |.
21
3.7.2 Collision with Command Injection
It is likely that in cases where Pinpoint finds code injection, it also finds command injection, due
to the similar payloads used for the vulnerabilities — for example, back ticks are used during
command injection tests, but also run system commands inside of a code injection vulnerability
in many languages. As such, any duplicate reports that may be found must be removed. This
is handled by the report object when showing the report: before displaying any reports, iterate
through all URLs for which Pinpoint has found a vulnerability, and check for any instance of both
command and code injection. If one is found, filter through the reports for this URL to remove
any unnecessary command injection reports.
3.8 ShellShock
ShellShock has a variety of attack vectors, attacking various services running on a server. The focus
for this scanner is the Apache CGI vector, which can be exploited by sending specific requests to
CGI scripts on a website. As a vulnerable machine loads specific information into environment
variables, Pinpoint injects a payload into all of the possible headers that can be loaded and test
which of these executed successfully. The headers to attack are the User-Agent, Referer, and
Cookie.
There are a total of 6 CVEs that are associated with ShellShock. There were three patches
that attempted to fix these bugs: one for the original CVE-2014-6271, another for the follow up
CVE-2014-7169, and a final patch that corrects all remaining vulnerabilities. Pinpoint tests with
the payloads for the first CVE, as well as CVE-2014-6278 which was not fixed until the final patch.
This allows for systems susceptible to the original vulnerability, as well as systems that have been
improperly patched, to be discovered.
Systems that are vulnerable to ShellShock in this way also reflect the results of maliciously executed
commands in the response headers to the exploiting requests. Due to this, Pinpoint can rapidly
detect ShellShock on vulnerable systems by injecting echo header: value into our payloads, then
testing for the presence of these headers in the response from the server. Pinpoint identifies which
of the tested headers can be injected into by setting the value in each payload to the header being
tested, and then uses a UUID as the new header to avoid conflicting with any existing HTTP
header.
Pinpoint tests for ShellShock on a CGI page by sending two HTTP requests, with the additional
headers of:
h e a d e r = ( ) { : ; } ; echo u u i d : h e a d e r ;
h e a d e r = ( ) { ; } > [ $ ( $ ( ) ) ] { echo u u i d : h e a d e r ; }
for each of the user-agent, referer, and cookie headers.
22
3.9 Path Traversal
Path traversal allows us to find any file on the system which is accessible to the website user. A
common demonstration of path traversal on Unix systems is to access /etc/passwd, which should
be world readable and is easy to locate. On a Windows systems, a suitable replacement is to
instead aim to find boot.ini, located in the root of the drive. To test if these files were found, a
regular expression is used representing any one line of /etc/passwd as well as a regular expression
for the overall structure of boot.ini.
To get to the root of each file system, Pinpoint repeatedly places ../ into the file path, allowing
it to go up a directory. It will also test if an absolute path, starting at / without using any
parent directory traversals, allows it to get to the test file. In Windows paths, backslashes are used
instead of forward slashes as backslash is the path separator on Windows. The desired file is then
appended to this. Pinpoint repeatedly increments the number of parent directory accesses up to
a user limit with a default maximum of 5.
In some cases, path traversal may be possible but an extension is added to the end of whatever
the user provides in their request, such as .txt if the user is supposed to be browsing a directory
of text files. To avoid this, a null terminator (%00) can be added to the end of the path so that
additional extensions should be ignored. This is not always the case, but this addition increases
the number of path traversal vulnerabilities that may be found.
3.9.1 Encodings
A path traversal vulnerability can be prevented with filtering, but it is possible an incomplete
filter has been implemented, which Pinpoint attempts to evade using several methods. The first
of these is to use URL encoding, to evade filters that check for the presence of ../ before decoding
the URL. An extension to this is double percent encoding, which takes the URL encoding and
replaces all % symbols with their URL encoding of %25.
It is also possible to evade filtering by overloading Unicode. Unicode defines characters of various
lengths, based on the start bits of each byte. The intention is for larger bytes to be used for
characters with a larger numerical representation, however Unicode allows for characters that
should use the shorter representation to be equivalently represented by the longer format. For
example, 0x2e (dot) can also be represented as 0xc0ae, 0xe080ae, and 0xf08080ae. Any of these
overloaded representations function the same as dot, and equal overloaded representations for
forward and backward slashes can be created. These can then be used in URL encoding form to
bypass filters that do not check for this case. These can also be combined with the double percent
encoding above.
As there are a total of 8 possible encodings, performing path traversal detection causes a large
slowdown to the scraper. As such, the user can specify the quantity of additional encodings
searched for, with a default of unencoded and URL encoding only.
23
3.10 Repository Overview
The project consists of a main file pinpoint .py, as well as three folders of additional files: core , exploits ,
and vulnreports . pinpoint .py contains the main body of the program, using core files to load
arguments, crawl pages, and then running exploits to create vulnreports and show them as part of
the final report. There are also several helper scripts in the main directory that aid development
and install, including requirements .sh to automatically install all packages and Python libraries
required for Pinpoint to function, as well as new vuln.sh to copy and modify the template exploit and
vulnreport files ready for a new vulnerability test to be implemented. There is also an automated
backup script, creating copies of the source code on Git, a connect USB drive, and Google Drive.
The core directory contains the crawler .py, locator .py, report .py and utils .py files. crawler .py
contains the Crawler class, allowing the given website to be crawled, as well as any additional
sources of URLs. locator .py contains the Locator class, which represents inputs on a page that
may be attacked. It also handles request submission. report .py contains the Report object, which
contains the vulnerability reports generated by exploit classes. It also removes duplicate reports,
and displays the report at the end of the program. utils .py contains large functions that are used
in main and can be run seperately, saving space in the main function. This includes the banner,
argument parsing, and making relative url paths into absolute urls.
The exploits directory contains the various Exploit classes. This includes the abstract parent
class Exploit , as well as a TemplateExploit to allow new exploits to be created more easily. There
is one child class for each vulnerability: XSSExploit, CommandInjectionExploit, CodeInjectionExploit ,
ShellShockExploit and PathTraversalExploit , each contained within their own file.
The vulnreports directory contains reports for each vulnerability. This includes the abstract parent
report VulnReport, a TemplateReport functioning similarly to the TemplateExploit, and instantiations
of vulnerability reports for all implemented vulnerabilities. The reports for each Exploit class
are grouped in their own file, and may have more specific reports than the exploit classes: for
example, CodeInjectionExploit can create any of PerlCodeInjectionReport , PHPCodeInjectionReport, and
AmbiguousCodeInjectionReport, all of which are contained inside of code injection reports .py.
My project was written from scratch. It makes use of some existing libraries and frameworks.
The first of these is the webhook-listener python package, which allows simple set up of a local
web server and handling of incoming requests. It is lightweight and flexible, and very useful for
this project. I have also used the Selenium framework, a controllable headless browser framework
designed for testing. It is useful for tests which require an interactive browser. I have also used
Python requests and Beautiful Soup, which allow for HTTP request interaction and plain HTML
parsing. These are more lightweight than Selenium and enable fast scanning for vulnerabilities
that do not require an interactive browser.
24
Chapter 4
Evaluation
This project consists of a scanner for 5 types of vulnerability. We can evaluate the success of
the project by testing its ability to detect each of these types of vulnerability across a range of
intentionally vulnerable websites, and evaluating the true and false positive and negative reports.
Pinpoint can also be compared to existing scanners, including both generic scanners as well as
vulnerability-specific scanners.
I am testing on a mix of vulnerable virtual machines that I am hosting with vulnerable websites
on them, as well as some locally hosted versions of vulnerable websites that I have been given
permission to use for testing. As test sites, I am using: the OWASP Broken Web Applications
project, consisting of a large range of intentionally vulnerable sites; a set of vulnerable test boxes
made available via VulnHub; old vulnerable versions of admin.cam.ac.uk pages provided by the
Cambridge University Information Services; and a vulnerable page provided by Cancer Research
UK. I would like to thank both the Cambridge UIS and Cancer Research UK for permission to
use these files for testing, as well as Graham Rymer for obtaining them and explaining the known
vulnerabilities in each.
For the ShellShock tests, there are two possible situations that we are interested in: the version
of Bash is from before the original vulnerability was discovered, or it is after the initial patch and
before the complete patch. I have obtained one version in each scenario from the Bash website 1 ,
and run ShellShock tests on the respective machines once per version of Bash, leading to two tests
per site vulnerable to ShellShock.
25
Table 4.1: Pinpoint Reporting of All Vulnerabilities Per Site
Source Website XSS Comm. Inj. Code Inj. Path Trav. ShellShock
ESAPI 12/12 - - - -
Mutillidae 9/22 1/1 - 1/1 -
Bricks 9/12 - - - -
Ghost 1/2 - - 1/1 -
OWASP
MCIR 14/19 9/10 - - -
Broken
bWAPP 0/11 6/6 3/3 3/3 2/2
Web Apps
WackoPicko 2/4 1/1 - - -
BodgeIt 1/3 - - - -
ZAPwave 3/5 - - - -
WAVSEP 22/88 - - - -
XVWA 2/2 1/1 - 1/1 -
VulnHub
ShellShock - - - - 2/2
Cambridge
admin.cam.ac.uk 1/1 - 1/1 1/1 -
UIS
Cancer
Research brcarep - 11/11 - - -
UK
• XSS detection often fails on Mutillidae: these cases are almost entirely post requests which
cannot be modified as they contain a dropdown menu which Selenium is unable to interact
with. Other cases perform some form of validation, such as a certain field requiring an integer
or two fields having to contain the same value for the request to be processed.
• Specific filters prevent Pinpoint from functioning in MCIR - these are either length filters,
which prevent the large test strings used, or quote filters, which prevent the XSS payloads
which always contain strings from being processed.
• There are many missed cases on WAVSEP, which is a site specifically for testing scanners.
These appear to fail for several reasons, all some variant of those found on other sites.
Table 4.2 shows the summary of performance measures for the Pinpoint scanner on the given
websites. XSS has the largest number of test cases, and hence the most problematic cases found.
The only failed case for another vulnerability is one of the MCIR ShelLOL pages, which has too
much filtering for the command injection scanner to work around.
The statistics for all tests except XSS are very high. This does not necessarily imply excellent
performance from Pinpoint for tests other than command injection, due to the very small number
of test cases - indeed, the failure to find a case that Pinpoint misses implies there are more extreme
cases to test. On the other hand, achieving an f-measure of 0.983 for command injection with a
relatively large number of tests demonstrates that the scanner is capable of detecting command
injection reliably. For XSS, the large number of tests makes the result more reliable. Although
it shows that Pinpoint misses a large portion of XSS vulnerabilities, it also finds over 52 of the
vulnerabilities.
26
Table 4.2: Performance Per Vulnerability (3 significant figures)
Vulnerability Precision Recall F-measure
XSS 1.0 0.420 0.591
Command Injection 1.0 0.967 0.983
Code Injection 1.0 1.0 1.0
Path Traversal 1.0 1.0 1.0
ShellShock 1.0 1.0 1.0
It is noteworthy that, for all web sites tested, Pinpoint never gave a false positive. This leads to
a precision of 1 for all tests, and implies that vulnerabilities reported by Pinpoint can be trusted
as it does not appear to generate any false reports.
27
Figure 4.1: Scanner Reports per site
The relative performance of the three scanners can be compared through their precision, recall
and f-measure, as shown in figure 4.2. W3AF achieves the highest performance overall with an
f-measure of 0.709, narrowly beating Pinpoint with 0.694. ZAP performs comparatively worse
than both other scanners with an f-measure of 0.572, due to its failure to scan three sites and no
major improvements over the other scanners elsewhere.
28
4.3 Comparison to other single-purpose scanners
In this section, Pinpoint is compared to various specialised tools for attacking single vulnerabilities.
As these tools are often made with the purpose of attacking exactly one vulnerability and have more
focused development towards this goal, they are expected to perform better than scanners which
attack a range of vulnerabilities. These comparisons are useful to compare Pinpoint’s performance
to a theoretical best case, in which all tests run are as good as or better than specialised tools.
29
Figure 4.3: Correct XSS Scanner Reports per site
30
Figure 4.5: Combined Command and Code injection Reports per site
The statistics for each scanner are shown in figure 4.6. Commix achieves a recall of 0.735 and an
f-measure of 0.847 across all tests, both high scores - although Pinpoint achieves a recall of 0.971
and an f-measure of 0.985, outperforming the special purpose scanner. For command injection
specifically, as Commix is designed for, Commix achieves 0.833 recall and 0.909 f-measure, close
to Pinpoint’s 0.967 and 0.983. Pinpoint appears to be the better scanner in this case, which is a
great success for the project given the range of vulnerabilities that are tested for.
31
4.3.3 Path Traversal Scanners
The most popular and powerful tool designed for discovering path traversal vulnerabilities is
DotDotPwn [9], which is now provided as part of several pentesting oriented operating systems.
The main limitation in DotDotPwn is an inability for the user to provide custom cookies, preventing
the tools from discovering any of the vulnerabilities present on bWAPP as it requires the user to
be logged in. Other than this, both Pinpoint and DotDotPwn perform perfectly on all sites, as
shown in table 4.3.
32
response, giving an effectively empty web page to parse. As such, it would be beneficial to have
a crawler that interacts with the browser instance, allowing the scripts to be run and generate
all required HTML before attempting to parse the otherwise empty web page. This would allow
Pinpoint to discover vulnerabilities on more modern websites, massively improving its utility.
Several limitations in the Selenium framework have become prevalent while developing this project.
One of the largest problems is Selenium’s inability to submit HTTP POST requests with custom
parameters: as Selenium focuses on how users interact with a website, it does not work well with
a hacker’s methods of interacting with a page. This causes problems when attempting to test
malicious payloads, as payloads that can be manually submitted to a form must fit within the
restrictions provided by the page. A combination of length limits and the inability to provide
custom inputs to dropdown menus and radio buttons prevents many of these payloads from being
entered. This gives a very large false negative rate for XSS vulnerabilities in POST requests,
heavily contributing to the recall below 0.5. Selenium also fails to set any non-standard cookies for
sites: in the example of bWAPP, it is only able to set the PHPSESSID for the session, despite four
fields being provided and required by the site to access it, leading to XSS tests being impossible
on this site. Additionally, Selenium attempts to help with supposedly unexpected situations,
such as alerts appearing, by throwing an exception before closing the alert. Unfortunately, this
occasionally preempts any alert handlers set up, causing the XSS scanner to have some false
negatives and unnecessarily complex code to handle these exceptions. Overall, I believe it would
have been beneficial to choose a different headless browser framework that is not restricted in the
various ways that Selenium is.
There are a handful of cases that Pinpoint is not able to handle for XSS detection. The first of
these are CSRF tokens: unique hidden values in many forms that prevent hackers sending malicious
requests using a user’s logged in session to perform actions on their behalf. These cause problems
whenever we do not use the browser to interact with a form and send a request, for example in a
GET request, as the stored token from crawling is most likely not valid after the first page visit,
meaning that we cannot submit data to the form without the CSRF token causing an error. This
suggests that Pinpoint could achieve better performance by always interacting with the headless
browser, instead of mixing interactions with custom requests.
Finally, one case in which the Pinpoint scanner always presented false negatives when testing for
XSS was when quote filters were in place. This is due to all XSS payloads containing quotes,
causing all tests featuring quote filters to fail. This could be improved by testing with numbers as
the alert text, allowing the alert () to run without having the required quotes filtered out.
4.5 Summary
Overall, Pinpoint performs comparably to other many-vulnerability scanners, as well as scanners
specifically for command and code injection, path traversal, and ShellShock. It falls behind against
scanners targeting XSS vulnerabilities due to poor performance on a selection of sites, as well as the
known cases in which Pinpoint fails. There are several ways in which Pinpoint could be improved
in the future, such as using a different headless browser framework, containing a browser based
crawler, handling CSRF tokens and running XSS tests without quotes. On the other hand, its
performance for vulnerabilities other than XSS is very good, and it is a useful tool for the security
community.
33
Chapter 5
Conclusions
34
I would have spent more time researching a framework to use. I chose Selenium due to my prior
experience with it, which allowed me to get a head start on the project as I did not have to learn
the framework before beginning. On the other hand, Selenium is designed for testing, and does
not function well for my system. It creates unnecessary complications during development, cannot
handle custom post requests, does not consistently set cookies correctly, contains race conditions,
and overall limits the performance of Pinpoint’s XSS detection. I would use a different framework
should I attempt this project again.
Existing specialised XSS scanning tools use different techniques than the method chosen in Pinpoint,
while outperforming it: XSSer detects more than twice as many vulnerabilities as Pinpoint. This
implies a different approach to XSS would be an improvement over the one chosen, although the
selected method is similar to the method use in manual vulnerability discovery.
Existing scanners rarely differentiate between command and code injection. Although they are
inherently different, the way they are exploited is similar, and indeed my method of detecting code
injection is to escalate to command injection. As such, it would likely be better to combine the
two types of attack in the future, putting all of the code injection payloads into the command
injection module. It is also difficult to identify the programming language being exploited in code
injection, hence it is likely better to always use a generic code injection report instead of putting
additional work into identifying the language.
35
Bibliography
[3] Christos Xenakis Anastasios Stasinopoulos, Christoforos Ntantogian. Commix: Detecting and
exploiting command injection flaws. 2015.
[7] HackerOne. Top 10 most impactful and rewarded vulnerability types. https://www.
hackerone.com/resources/top-10-vulnerabilities. Accessed: 2019-10-22.
[8] Amit Klein. DOM based cross site scripting or XSS of the third kind: A look at an overlooked
flavor of XSS. http://www.webappsec.org/projects/articles/071105.html.
[9] Christian Navarrete and Alejandro Hernandez H. DotDotPwn - The Directory Traversal
Fuzzer. https://github.com/wireghoul/dotdotpwn, 2012.
[11] OWASP. OWASP Top 10 - 2017: The ten most critical web application security risks, 2017.
[14] Andres Riancho. w3af - web application attack and audit framework. http://w3af.org/,
2014.
36
Computer Science - Part II - Project Proposal
A Web Application Vulnerability Scanner
Project Originator: Candidate
24th October 2019
Introduction
Web applications are often subject to attacks by malicious users. Some of these websites will
contain well known general vulnerabilities, which make them much easier to exploit by a malicious
user. A common approach to discovering these vulnerabilities before they are exploited is to hire
a penetration tester (pentester), who will use their knowledge and a suite of tools to find and
report vulnerabilities in a web application. The pentester can then aid the developers in patching
these vulnerabilities, preventing them from being exploited maliciously and causing harm to the
company.
In this project, I aim to create a single application that can detect a range of vulnerabilities and
report back to the user, aiding them in improving the security of their website. I will focus on two
major vulnerabilities - Cross Site Scripting and Command Injection - and develop further tests as
extensions, if I have time. I will be using an extensible architecture to enable future addition of
vulnerability tests.
Cross site scripting (XSS) allows a visitor to a website to inject JavaScript code onto the page.
This code can then be run on the browsers of other site visitors, allowing for a variety of attacks to
be run by the attacker. Frameworks such as BeEF make this easier, by having the attacker inject a
”hook” script, that allows any victim browser to become a ”zombie” which can then be forced run
any of the 301 payloads available to the attacker. These include stealing session cookies, turning
on the webcam and display a phishing dialog such as a Facebook login page.
The detection and prevention of XSS attacks has been documented by many institutions, such
as Guru Nanak Dev University [4] and Universiti Sains Malaysia [3]. XSS is currently the 7th
vulnerability in the OWASP top ten [5], and the most common vulnerability reported via the bug
bounty site HackerOne [2]. The scale of this attack can be seen through sources such as XSSed[7]
with their log of over 45,000 reported XSS vulnerabilities.
Command injection allows arbitrary operating system commands to be run on a web server by
malicious visitors to a website. The ability to run any command allows the attacker to access
sensitive information on the server, as well as potentially modify the website or attempt privilege
escalation to fully take over the server. Traffic from other visitors may be viewed or modified and
other vulnerabilities in the system exposed. This is one of the most damaging vulnerabilities to
have on a server, due to the power an attacker may gain.
Injection vulnerabilities are currently number 1 on the OWASP top ten [5], and 6th on the
HackerOne top 10 [2]. Analysis on types of command injection, as well as their detection and
prevention, has been done during development of tools such as COMMIX [1].
There exist many tools for combating individual vulnerabilities that are commonly found on
websites, such as XSSer for cross site scripting, as well as some scanners that test for many
vulnerabilities, such as the OWASP Zed Attack Proxy (ZAP) or W3AF.
Starting Point
I have been using Python as a programming language for several years and have created a variety
of projects with it.
I have some knowledge of web exploits from the IB Security course, and have further knowledge
of manually exploiting them from training for and participating in various CTF competitions.
I have previously used tools for exploiting specific vulnerabilities, such as SQLmap and SQLninja
for SQL injection, as well as XSSer and XSSSniper for XSS attacks.
Work to be done
The core of my project will consist of:
1. A web spider to find all potentially vulnerable pages and inputs on the website provided by
the user. This will be configured with some hard scoping rules, to prevent external websites
from being scanned, and may allow additional user defined scoping rules.
2. A core vulnerability scanner, to function on each of the inputs found by the spider. This
will be designed such that further vulnerability tests can easily be added to the system. The
tests to be implemented are as follows:
(a) A Cross Site Scripting (XSS) scanner, looking for instances where malicious JavaScript
code can be run on another user’s browser. This should function with both reflected
XSS - non-persistent attacks, that function only on the specific link for which the attack
works - and stored XSS - persistent attacks, where malicious code can be permanently
stored on the site and served to all visitors of the page.
(b) A command injection scanner, searching for places where system commands can be sent
to the site and run on the server, allowing for control of the system or exfiltration of
data. This will aim to detect vulnerabilities on both *NIX and Windows systems.
(c) Any extension vulnerability tests that I am able to create, as outlined in the possible
extensions section.
3. A command line interface for the system, allowing the user to run the scanner, control options
for the tests to be run, and to optionally aid the system in more precisely targeting specific
inputs, as appropriate. An extension to this project would be to create a GUI as well as a
CLI.
The system will be evaluated against intentionally vulnerable applications, such as OWASP’s
broken web applications (BWA) and Juice Shop projects. By using a range of the web applications
in these projects, quantitative analysis can be done on the number of accurate vulnerability
detections, false positives, and missed known vulnerabilities. We can evaluate the accuracy,
precision, recall and F1 measure of the system.
2
Success Criterion
For the project to be deemed a success the following items must be successfully completed.
1. The site crawler must be designed and implemented, and be able to find the majority
reachable pages and possible exploitation points for the chosen vulnerabilities.
2. Both reflected and stored XSS detection must be designed and implemented, and be able to
detect some known instances of each vulnerability.
3. Both *NIX and Windows command injection must be designed and implemented.
5. Test runs on intentionally vulnerable websites should be performed to demonstrate that the
scanner works.
Possible Extensions
The following list contains possible extensions to the core vulnerability scanner.
1. Perl and/or PHP code injection detection, in which Perl or PHP scripts will run code provided
by the user.
2. Path traversal vulnerability checks, in which the user can escape the directory in which site
files are stored and potentially access sensitive system files such as /etc/shadow.
3. Tests for the ShellShock vulnerability (initial report CVE-2014-6271), which allows the user
to perform arbitrary Bash commands when input is passed to an environment variable.
4. SQL injection (SQLi) detection, in which additional SQL code can be used to leak data, or
in some cases take control of the system. The main types of SQLi vulnerability are error
based SQLi, UNION based SQLi, stacked queries, time based blind SQLi, and boolean based
blind SQLi.
5. A GUI for the scanner could be created, to make the system more user friendly.
6. The system could be converted to a plugin for Firefox or Chrome, to make it more convinient
for the user.
3
8th November 2019 - 22 November 2019
Create a website crawler to find all pages on the site we want to scan for vulnerabilities. Identify
inputs to be tested, such as forms and get parameters in links. Research methods for XSS detection
in existing tools.
Milestone: Web crawler complete.
4
28 February 2019 - 13 March 2019
Continue dissertation writeup. Create tests to evaluate the system, for the parts implemented thus
far.
Milestones: Draft Preparation and introduction chapters completed. Tests for the system ready
to run.
Resource Declaration
I will use my own laptop (Parrot Linux x64, i5 quad core 2.5GHz, 8GB RAM) for development and
testing. I accept full responsibility for this machine and I have made contingency plans to protect
myself against hardware and/or software failure. Should it fail, I will use an MCS machine, copy
my previous work from one of the three available backups, and continue with the project.
I will use a range of methods to backup my work, documented in Backup strategy below.
I will use the OWASP BWA VM and the OWASP Juice Shop project for testing and evaluation
of my system.
Backup strategy
• I will use Gitlab to store a copy of the project, as well as track changes.
5
References
[1] Christos Xenakis Anastasios Stasinopoulos, Christoforos Ntantogian. Commix: Detecting and
exploiting command injection flaws. 2015.
[3] Abdalla Wasef Marashdih and Zarul Fitri Zaaba. Cross site scripting: Detection approaches
in web application. 2016.
[4] Dr. Parminder Kaur Ms. Daljit Kaur. Cross-site-scripting attacks and their prevention during
development. 2017.
[5] OWASP. OWASP Top 10 - 2017: The ten most critical web application security risks.
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project, 2017.
[7] XSSed. Cross site scripting attacks information and archive. http://www.xssed.com/.