Compare commits

...

29 Commits

Author SHA1 Message Date
vasco
81e6fb8aa4 rip 2026-06-03 11:43:39 +01:00
vasco
ab3cbb9081 the council 2026-06-03 11:39:05 +01:00
vasco
a6860e338d kys20 2026-06-03 11:32:02 +01:00
vasco
30a9483402 kys18 2026-06-02 23:57:15 +01:00
vasco
bc450ebbb3 kys17 2026-06-02 23:46:21 +01:00
vasco
0992d4a6e0 kys16 2026-06-02 23:38:20 +01:00
vasco
c053a064b2 kys15 2026-06-02 23:28:02 +01:00
vasco
cfa62d8ce0 kys14 2026-06-02 23:22:37 +01:00
vasco
0f3e2044a0 kys13 2026-06-02 23:20:25 +01:00
vasco
e9616a8c7c kys12 2026-06-02 23:10:52 +01:00
vasco
361f34c19f kys11 2026-06-02 22:49:55 +01:00
vasco
1f6bb854c3 kys10 2026-06-02 22:44:16 +01:00
vasco
05cbbfbe18 kys9 2026-06-02 22:16:25 +01:00
vasco
ad84c1ba29 kys8 2026-05-31 22:40:18 +01:00
jelly Tomas
53c4898efe kys7 2026-05-31 22:00:19 +01:00
vasco
c7b5f0e436 oops 2026-05-31 21:53:41 +01:00
vasco
51060422d1 kys6 2026-05-31 21:42:41 +01:00
e3d7b83059 mod security 2026-05-31 20:11:27 +01:00
73c5b1c5d5 kys4 2026-05-31 19:47:48 +01:00
vasco
aa58c0cb1d kys3 2026-05-31 19:30:39 +01:00
vasco
183901ab31 kys2 2026-05-31 19:11:32 +01:00
vasco
3e0237c6f3 httpd 2026-05-31 19:04:42 +01:00
vasco
e90263b3c5 kys 2026-05-31 18:50:32 +01:00
vasco
f69d1d3b38 son ;( 2026-05-31 18:37:17 +01:00
vasco
00f537bc3a fixed 4 (the return of the family) 2026-05-31 15:26:31 +01:00
vasco
c528f4844b fixed 3 (for real this time) 2026-05-31 15:24:32 +01:00
vasco
fdc85d9109 syntax error? 2026-05-31 15:18:35 +01:00
vasco
8136c49f50 fix 2026-05-31 15:16:13 +01:00
vasco
ded74f1a45 modsecurity 2026-05-31 14:55:52 +01:00
21 changed files with 4639 additions and 640 deletions

View File

@@ -1,6 +1 @@
# Coisas para leres que sao fixes wowowowowowow !!!!! (Assignment 2)
- Os slides (duh)
- Okay o mais importante é os slides.
- [X.509 (ssl.com)](https://www.ssl.com/faqs/what-is-an-x-509-certificate/)
- [X.509 (youtube)](https://www.youtube.com/watch?v=kAaIYRJoJkc)
kys

View File

@@ -25,7 +25,6 @@ instalar nodejs
instalar epel-release
instalar httpd
instalar mod_security
instalar mod_security_crs
instalar iptables-services
s stop firewalld
@@ -42,7 +41,11 @@ sudo iptables -A FORWARD -i enp0s8 -o enp0s9 -m state --state ESTABLISHED,RELATE
sudo iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
sudo iptables-save > /etc/sysconfig/iptables
sudo cp conf/httpd.conf /etc/httpd/httpd.conf
sudo cp conf/httpd.conf /etc/httpd/conf/httpd.conf
sudo cp conf/modsecurity.conf /etc/httpd/conf/modsecurity.conf
sudo mkdir -p /var/log/modsecurity/
sudo rm -f /etc/httpd/conf.d/mod_security.conf
sudo rm -f /etc/httpd/modsecurity.d/*.conf
# instalar juice-shop se nao existir
jspath="/var/juice-shop"
@@ -54,10 +57,10 @@ if [[ ! -f "$jspath/package.json" ]]; then
sudo chown -R $USER:$USER "$jspath"
fi
# apache WAF (desativado por default)
s stop httpd
s disable httpd
sudo systemctl stop httpd
# correr juice shop via npm
cd "$jspath"
npm start
npm start &
httpd -X

View File

@@ -1,11 +1,12 @@
ServerRoot "/etc/httpd"
Listen 420
ServerName "10.60.0.1"
Listen 80
User apache
Group apache
Include conf.modules.d/*.conf
IncludeOptional modsecurity.d/*.conf
IncludeOptional modsecurity.d/activated_rules/*.conf
Include conf/modsecurity.conf
<Directory />
AllowOverride none
@@ -16,7 +17,7 @@ DocumentRoot "/var/www/html"
<Directory "/var/www">
AllowOverride None
Require all granted # Allow open access:
Require all granted
</Directory>
# Further relax access to the default document root:
@@ -73,7 +74,11 @@ AddDefaultCharset UTF-8
ProxyRequests Off
ProxyPreserveHost On
<VirtualHost *:420>
<VirtualHost 10.60.0.1:80>
<IfModule mod_headers.c>
RequestHeader unset Accept-Encoding
</IfModule>
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
@@ -82,4 +87,4 @@ ProxyPreserveHost On
# EnableSendfile on
IncludeOptional conf.d/*.conf
ServerAdmin jeevacation@gmail.com
# ServerName www.coimbravpn.com:420
# ServerName www.coimbravpn.com:80

38
conf/modsecurity.conf Normal file
View File

@@ -0,0 +1,38 @@
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecDebugLog /var/log/modsecurity/debug.log
SecDebugLogLevel 0
SecAuditLogParts ABIJ
SecAuditLogType Serial
SecAuditLog /var/log/modsecurity/audit.log
SecRequestBodyJsonParser On
# sql injection
SecRule REQUEST_BODY "['\"].*--" \
"id:950001,phase:2,deny,status:403,msg:'SQL Injection: quote and comment',log"
# xss / html injection
SecRule REQUEST_URI|ARGS "(<.*>)|(%3C.*%3E)" \
"id:950003,phase:1,deny,status:403,msg:'XSS/HTML INJECTION DETECTED!!!',log"
# command injection
SecRule ARGS "(\"role\".*:.*\"admin\")|exec|cat|more|ls|dir|/etc/passwd" \
"id:950006,phase:2,deny,status:403,msg:'COMMAND INJECTION DETECTED!!!',log"
# path traversal
SecRule REQUEST_URI|ARGS "\%00|\%2500|\.\./|ftp|metrics|api-docs" \
"id:950007,phase:2,deny,status:403,msg:'PATH TRAVERSAL ATTEMPT!!!',log"
# exposed stuff (redundante ?)
SecRule REQUEST_URI|ARGS "\%00|\%2500|ftp|metrics|api-docs" \
"id:950008,phase:2,deny,status:500,msg:'ATTEMPT TO ACCESS FTP, METRICS, API-DOCS!!!',log"
# rate limiting on login endpoint
# (max 5 requests per 30s per IP)
SecAction \
"id:950009,phase:1,initcol:ip=%{REMOTE_ADDR},pass,nolog"
SecRule REQUEST_URI "@streq /rest/user/login" \
"id:950010,phase:2,pass,nolog,setvar:ip.login_count=+1,expirevar:ip.login_count=30"
SecRule IP:LOGIN_COUNT "@gt 5" \
"id:950011,phase:2,deny,status:429,msg:'Rate Limit Exceeded on Login',log"

BIN
entrega.zip Normal file

Binary file not shown.

3680
entrega.zip.asc Normal file

File diff suppressed because it is too large Load Diff

BIN
relatorio.pdf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
relatorio/imgs/ftp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
relatorio/imgs/metrics.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
relatorio/imgs/swagger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@@ -13,24 +13,40 @@
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Services}{3}{subsection.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Web application security testing}{4}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Information Gathering}{4}{subsection.3.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces ftp}}{4}{figure.1}\protected@file@percent }
\newlabel{fig:ftp}{{1}{4}{ftp}{figure.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Configuration and Deployment Management Testing}{4}{subsection.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Identity Management Testing}{5}{subsection.3.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces metrics}}{5}{figure.2}\protected@file@percent }
\newlabel{fig:metrics}{{2}{5}{metrics}{figure.2}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces swagger}}{5}{figure.3}\protected@file@percent }
\newlabel{fig:swagger}{{3}{5}{swagger}{figure.3}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Identity Management Testing}{6}{subsection.3.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces email-unique}}{7}{figure.4}\protected@file@percent }
\newlabel{fig:email-unique}{{4}{7}{email-unique}{figure.4}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Authentication Testing}{7}{subsection.3.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Authorization Testing}{7}{subsection.3.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Session Management Testing}{7}{subsection.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Input Validation Testing}{7}{subsection.3.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}Testing for SQL Injection}{8}{subsubsection.3.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Testing for Error Handling}{8}{subsection.3.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Client Side Testing}{9}{subsection.3.9}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Web Application Security Firewall}{10}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Information Gathering}{10}{subsection.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Configuration and Deployment Management Testing}{10}{subsection.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Identity Management Testing}{10}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Authentication Testing}{10}{subsection.4.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Authorization Testing}{10}{subsection.4.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.6}Session Management Testing}{10}{subsection.4.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.7}Input Validation Testing}{10}{subsection.4.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.8}Testing for Error Handling}{10}{subsection.4.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.9}Client Side Testing}{10}{subsection.4.9}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5}Conclusions}{10}{section.5}\protected@file@percent }
\gdef \@abspage@last{10}
\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces email-invalido}}{8}{figure.5}\protected@file@percent }
\newlabel{fig:email-invalido}{{5}{8}{email-invalido}{figure.5}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces suspiciouserrors}}{8}{figure.6}\protected@file@percent }
\newlabel{fig:suspiciouserrors}{{6}{8}{suspiciouserrors}{figure.6}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces suspiciouserrors2}}{9}{figure.7}\protected@file@percent }
\newlabel{fig:suspiciouserrors2}{{7}{9}{suspiciouserrors2}{figure.7}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Session Management Testing}{9}{subsection.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Input Validation Testing}{9}{subsection.3.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}Testing for SQL Injection}{10}{subsubsection.3.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Testing for Error Handling}{10}{subsection.3.8}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces stack-trace}}{11}{figure.8}\protected@file@percent }
\newlabel{fig:stack-trace}{{8}{11}{stack-trace}{figure.8}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Client Side Testing}{11}{subsection.3.9}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Web Application Security Firewall}{11}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Information Gathering}{12}{subsection.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Configuration and Deployment Management Testing}{12}{subsection.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Identity Management Testing}{13}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.4}Authentication Testing}{13}{subsection.4.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.5}Authorization Testing}{13}{subsection.4.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.6}Session Management Testing}{13}{subsection.4.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.7}Input Validation Testing}{13}{subsection.4.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.8}Testing for Error Handling}{14}{subsection.4.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.9}Client Side Testing}{14}{subsection.4.9}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5}Conclusions}{14}{section.5}\protected@file@percent }
\gdef \@abspage@last{14}

View File

@@ -1 +1,38 @@
<img src="x" onerror="alert(localStorage.getItem('token'))">apple
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecDebugLog /var/log/modsecurity/debug.log
SecDebugLogLevel 0
SecAuditLogParts ABIJ
SecAuditLogType Serial
SecAuditLog /var/log/modsecurity/audit.log
# sql injection
SecRule REQUEST_URI|ARGS "['\";]|--" \
SecRule REQUEST_URI|ARGS "(?i:(?:select|insert|update|delete|drop|union|create|alter|truncate)\s+.+\s+from|'[^']*'|--|;|\b(or|and)\b\s+\d+\s*=\s*\d+)" \
"id:950001,phase:1,deny,status:403,msg:'SQL INJECTION ATTACK DETECTED!!!',log,t:urlDecode,t:sqlHexDecode,t:lowercase"
# xss / html injection
SecRule REQUEST_URI|ARGS "(<.*>)|(%3C.*%3E)" \
"id:950003,phase:1,deny,status:403,msg:'XSS/HTML INJECTION DETECTED!!!',log"
# command injection
SecRule ARGS "(\"role\".*:.*\"admin\")|exec|cat|more|ls|dir|/etc/passwd" \
"id:950006,phase:2,deny,status:403,msg:'COMMAND INJECTION DETECTED!!!',log"
# path traversal
SecRule REQUEST_URI|ARGS "\%00|\%2500|\.\./|ftp|metrics|api-docs" \
"id:950007,phase:2,deny,status:403,msg:'PATH TRAVERSAL ATTEMPT!!!',log"
# exposed stuff (redundante ?)
SecRule REQUEST_URI|ARGS "\%00|\%2500|ftp|metrics|api-docs" \
"id:950008,phase:2,deny,status:500,msg:'ATTEMPT TO ACCESS FTP, METRICS, API-DOCS!!!',log"
# rate limiting on login endpoint
# (max 5 requests per 30s per IP)
SecAction \
"id:950009,phase:1,initcol:ip=%{REMOTE_ADDR},pass,nolog"
SecRule REQUEST_URI "@streq /rest/user/login" \
"id:950010,phase:2,pass,nolog,setvar:ip.login_count=+1,expirevar:ip.login_count=30"
SecRule IP:LOGIN_COUNT "@gt 5" \
"id:950011,phase:2,deny,status:429,msg:'Rate Limit Exceeded on Login',log"

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -27,15 +27,21 @@
Este trabalho tem como objetivo realizar testes de penetração numa aplicação
cobaia (o \textit{Juicebox}) desenhada para aprendizagem.
Este trabalho tem como objetivo utilizar o \textbf{WSTG} (Web security testing guide) e configurar um ModSecurity reverse proxy como uma \textbf{WAF}.
Para esse fim temos uma aplicação cobaia (o \textit{Juicebox}) desenhada para aprendizagem que vamos utilizar num ambiente controlado para aprender como descobrir vulnerabilidades (aplicando o \textbf{WSTG} e recorrendo ao \textbf{OWASP ZAP}) e prevenir antes do serviço estar online (elaborando uma \textbf{WAF}).
Este trabalho tem como objetivo utilizar o \textbf{WSTG} (Web security
testing guide) e configurar um ModSecurity reverse proxy como uma
\textbf{WAF}. Para esse fim temos uma aplicação cobaia (o \textit{Juicebox})
desenhada para aprendizagem que vamos utilizar num ambiente controlado
para aprender como descobrir vulnerabilidades (aplicando o \textbf{WSTG}
e recorrendo ao \textbf{OWASP ZAP}) e prevenir antes do serviço estar
online (elaborando uma \textbf{WAF}).
\section{Architecture Considered for Both Stages}
Utilizámos somente duas máquinas virtuais: um servidor a correr \textit{CentOS 9}
e um cliente a correr \textit{Kali Linux}. O servidor contém o serviço \textit{Apache},
que age como \textit{firewall} através do módulo \textit{ModSecurity}, e um servidor
\textit{Node.js} que aloja o \textit{Juicebox} --- a aplicação que vai servir de cobaia (\textit{dummy}).
\textit{Node.js} que aloja o \textit{Juicebox} --- a aplicação que vai
servir de cobaia (\textit{dummy}).
% Vão ser realizadas duas etapas de testes: primeiro, sem WAF (\textit{Web Application Firewall})
% e com foco em explorar vulnerabilidades na aplicação; e, posteriormente, com uma WAF configurada para
@@ -48,7 +54,9 @@ Com o ambiente criado foram realizadas duas etapas de testes:
\item \texttt{Primeira etapa}: Explorar vulnerabilidades na aplicação que existem sem a \textbf{WAF}
\item \texttt{Segunda etapa}:Verificar que vulnerabilidades foram mitigadas da primeira etapa com o uso de uma \textbf{WAF} configurada.
\end{itemize}
Realisticamente estas etapas podiam continuar a repetir-se, até que estivessemos satisfeitos com o resultado, mas para o fim deste projeto estas etapas serão suficientes.
Realisticamente estas etapas podiam continuar a repetir-se, até que
estivessemos satisfeitos com o resultado, mas para o fim deste projeto
estas etapas serão suficientes.
\subsection{Network structure}
@@ -78,9 +86,13 @@ Realisticamente estas etapas podiam continuar a repetir-se, até que estivessemo
\subsection{Information Gathering}
Utilizámos a política por omissão (\textit{default policy}) para a realização do \textit{Active Scan} através do OWASP ZAP. Com esta abordagem, obtivemos múltiplos alertas automáticos. De forma a priorizar a análise, investigamos as alertas principais com base no maior nível de risco e grau de confiança reportados pela ferramenta.
Utilizámos a política por omissão (\textit{default policy}) para a
realização do \textit{Active Scan} através do OWASP ZAP. Com esta
abordagem, obtivemos múltiplos alertas automáticos. De forma a priorizar
a análise, investigamos as alertas principais com base no maior nível de
risco e grau de confiança reportados pela ferramenta.
Para conseguir informação inicial realizamos um \textit{Active Scan} através do \textit{OWASP ZAP}, o policy utilizado para esse scan foi \textit{Default Policy}. Foi obtido vários aletas automáticos devido a esse scan e decidimos investigar as alertas principais com base no nível de risco e grau de confiança reportado pela ferramenta.
% Para conseguir informação inicial realizamos um \textit{Active Scan} através do \textit{OWASP ZAP}, o policy utilizado para esse scan foi \textit{Default Policy}. Foi obtido vários aletas automáticos devido a esse scan e decidimos investigar as alertas principais com base no nível de risco e grau de confiança reportado pela ferramenta.
Adicionalmente, realizámos testes de infraestrutura utilizando ferramentas especializadas:
@@ -88,40 +100,84 @@ Adicionalmente, realizámos testes de infraestrutura utilizando ferramentas esp
sqlmap -u "http://192.168.1.1:3000/rest/products/search?q=apple" -p q --level=5 --risk=3 --banner
\end{codeblock}
Ao executar o \textit{sqlmap}, descobrimos que o sistema de gestão de base de dados subjacente é o \textit{SQLite}.
Ao executar o \textit{sqlmap}, descobrimos que o sistema de gestão de
base de dados subjacente é o \textit{SQLite}.
Paralelamente, realizámos uma descoberta de ficheiros e diretórios através de técnicas de \textit{fuzzing} de URLs no OWASP ZAP recorrendo à lista de permissões da \textit{DirBuster}. Esta exploração revelou os seguintes endpoints publicamente expostos:
Paralelamente, realizámos uma descoberta de ficheiros e diretórios
através de técnicas de \textit{fuzzing} de URLs no OWASP ZAP recorrendo
à lista de permissões da \textit{DirBuster}. Esta exploração revelou os
seguintes endpoints publicamente expostos:
\begin{itemize}
\item \texttt{/ftp}: Servidor de armazenamento e transferência de ficheiros exposto.
\item \texttt{/metrics}: Métricas internas da infraestrutura expostas.
\item \texttt{/api-docs}: Documentação e esquemas estruturais da API.
\item \texttt{/ftp}: Servidor de armazenamento e transferência de ficheiros exposto. (Figura \ref{fig:ftp})
\item \texttt{/metrics}: Métricas internas da infraestrutura expostas. (Figura \ref{fig:metrics})
\item \texttt{/api-docs}: Documentação e esquemas estruturais da API. (Figura \ref{fig:swagger})
\end{itemize}
\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{ftp}
\caption{ftp}
\label{fig:ftp}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{metrics}
\caption{metrics}
\label{fig:metrics}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{swagger}
\caption{swagger}
\label{fig:swagger}
\end{figure}
\subsection{Configuration and Deployment Management Testing}
\subsubsection*{Enumerate Infrastructure and Application Admin Interfaces}
Identificámos e testámos o acesso ao endpoint \texttt{/api-docs} (\textit{Swagger UI}), validando que as interfaces de documentação interna do sistema e as definições da API estavam publicamente expostas sem qualquer tipo de controlo de acesso ou autenticação prévia.
Identificámos e testámos o acesso ao endpoint \texttt{/api-docs}
(\textit{Swagger UI}), validando que as interfaces de documentação
interna do sistema e as definições da API estavam publicamente expostas
sem qualquer tipo de controlo de acesso ou autenticação prévia.
\subsubsection*{Test HTTP Methods}
Testámos os métodos HTTP permitidos pelo servidor através do envio de pedidos \texttt{OPTIONS}. Verificámos que o servidor aceita métodos potencialmente perigosos ou desnecessários para utilizadores comuns em rotas específicas, expandindo a superfície de ataque da aplicação.
Testámos os métodos HTTP permitidos pelo servidor através do envio de
pedidos \texttt{OPTIONS}. Verificámos que o servidor aceita métodos
potencialmente perigosos ou desnecessários para utilizadores comuns em
rotas específicas, expandindo a superfície de ataque da aplicação.
\subsubsection*{Test File Permission}
Analisámos as permissões de acesso no diretório \texttt{/ftp}. Verificámos que a falta de restrições rígidas ao nível do sistema de ficheiros permite a qualquer utilizador anónimo listar o conteúdo de diretórios estruturais e descarregar ficheiros não indexados na interface principal da aplicação.
Analisámos as permissões de acesso no diretório \texttt{/ftp}.
Verificámos que a falta de restrições rígidas ao nível do sistema de
ficheiros permite a qualquer utilizador anónimo listar o conteúdo de
diretórios estruturais e descarregar ficheiros não indexados na
interface principal da aplicação.
\subsection{Identity Management Testing}
\subsubsection*{Test Role Definitions}
Efetuámos testes de manipulação de parâmetros do lado do cliente através das ferramentas de programador do navegador. Adicionámos manualmente os cookies \texttt{isAdmin} com o valor \texttt{true} e \texttt{role} com o valor \texttt{admin}. Após a atualização da página, não observámos qualquer escalonamento de privilégios, indicando que a aplicação não valida perfis administrativos com base nestes cookies específicos.
Efetuámos testes de manipulação de parâmetros do lado do cliente através
das ferramentas de programador do navegador. Adicionámos manualmente os
cookies \texttt{isAdmin} com o valor \texttt{true} e \texttt{role} com o
valor \texttt{admin}. Após a atualização da página, não observámos
qualquer escalonamento de privilégios, indicando que a aplicação não
valida perfis administrativos com base nestes cookies específicos.
\subsubsection*{Test User Registration Process}
Utilizámos o OWASP ZAP para intercetar o tráfego de rede e definir um \textit{breakpoint} no pedido HTTP POST de registo de novos utilizadores. Modificámos o corpo do pedido JSON, injetando manualmente o parâmetro \texttt{"role":"admin"}:
Utilizámos o OWASP ZAP para intercetar o tráfego de rede e definir um
\textit{breakpoint} no pedido HTTP POST de registo de novos utilizadores.
Modificámos o corpo do pedido JSON, injetando manualmente o parâmetro
\texttt{"role":"admin"}:
\begin{codeblock}{json}
{
@@ -139,46 +195,102 @@ Utilizámos o OWASP ZAP para intercetar o tráfego de rede e definir um \textit{
}
\end{codeblock}
O servidor backend processou o pedido sem validar se o utilizador possuía autorização para definir o seu próprio perfil, o que resultou na criação bem-sucedida de uma conta com permissões totais de administrador (\textit{Mass Assignment Vulnerability}).
O servidor backend processou o pedido sem validar se o utilizador
possuía autorização para definir o seu próprio perfil, o que resultou
na criação bem-sucedida de uma conta com permissões totais de
administrador (\textit{Mass Assignment Vulnerability}).
\subsubsection*{Testing for Account Enumeration and Guessable User Account}
Ao tentar registar um utilizador com o e-mail \texttt{admin@juice-sh.op}, verificámos que a aplicação devolve uma mensagem de erro explícita indicando que o e-mail já se encontra registado no sistema. Este comportamento confirma a vulnerabilidade de enumeração de contas, permitindo a um atacante mapear quais os e-mails válidos na plataforma.
Ao tentar registar um utilizador com o e-mail
\texttt{admin@juice-sh.op}, verificámos que a aplicação devolve uma
mensagem de erro explícita indicando que o e-mail já se encontra
registado no sistema. Este comportamento confirma a vulnerabilidade de
enumeração de contas, permitindo a um atacante mapear quais os e-mails
válidos na plataforma.
\includegraphics[width=0.5\textwidth]{email-unique}
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\textwidth]{email-unique}
\caption{email-unique}
\label{fig:email-unique}
\end{figure}
\subsubsection*{Testing for Weak or Unenforced Username Policy}
Após testar vários caracteres especiais no formulário de registo, criámos um utilizador com os seguintes dados nos campos de input:
Após testar vários caracteres especiais no formulário de registo,
criámos um utilizador com os seguintes dados nos campos de input:
\begin{itemize}
\item \textbf{E-mail:} \texttt{son'or1=1--@gmail.com}
\item \textbf{Nome/Campos Adicionais:} \texttt{<h1>STRONG}
\end{itemize}
A aplicação aceitou o registo sem validar a presença de carateres de injeção SQL ou tags HTML. Contudo, verificámos que é impossível efetuar login com esta conta posteriormente, uma vez que o processo de autenticação falha e resulta num erro genérico do tipo \texttt{[object Object]} no ecrã.
A aplicação aceitou o registo sem validar a presença de carateres de
injeção SQL ou tags HTML. Contudo, verificámos que é impossível efetuar
login com esta conta posteriormente, uma vez que o processo de
autenticação falha e resulta num erro genérico do tipo
\texttt{[object Object]} no ecrã.
\includegraphics[width=0.5\textwidth]{email-invalido}
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\textwidth]{email-invalido}
\caption{email-invalido}
\label{fig:email-invalido}
\end{figure}
\subsection{Authentication Testing}
Realizámos testes de \textit{fuzzing} automatizado contra o formulário de login utilizando dicionários de credenciais. Identificámos que a aplicação não implementa mecanismos de bloqueio de conta (*Account Lockout*) ou limitação de taxa de pedidos (*Rate Limiting*), permitindo ataques contínuos de \textit{brute force}.
Realizámos testes de \textit{fuzzing} automatizado contra o formulário
de login utilizando dicionários de credenciais. Identificámos que a
aplicação não implementa mecanismos de bloqueio de conta ou limitação
de taxa de pedidos \textit{rate limiting}, permitindo ataques contínuos
de \textit{brute force}.
\subsection{Authorization Testing}
Testámos as permissões de acesso ao diretório \texttt{/ftp} e verificámos que o servidor está configurado para permitir nativamente apenas a visualização de ficheiros com as extensões \texttt{.md} e \texttt{.pdf}.
Testámos as permissões de acesso ao diretório \texttt{/ftp} e
verificámos que o servidor está configurado para permitir nativamente
apenas a visualização de ficheiros com as extensões \texttt{.md} e
\texttt{.pdf}.
Seguidamente, explorámos falhas na validação de inputs através de uma injeção de \textit{Null Byte} codificado (\texttt{\%2500.md} ou \texttt{\%2500.pdf}). O ataque foi bem-sucedido e contornou a validação de extensões do servidor, garantindo o acesso e descarregamento de ficheiros confidenciais restritos: \texttt{encrypt.pyc} e \texttt{suspicious\_errors.yml}.
Seguidamente, explorámos falhas na validação de inputs através de uma
injeção de \textit{Null Byte} codificado (\texttt{\%2500.md} ou
\texttt{\%2500.pdf}). O ataque foi bem-sucedido e contornou a validação
de extensões do servidor, garantindo o acesso e descarregamento de
ficheiros confidenciais restritos: \texttt{encrypt.pyc} e
\texttt{suspicious\_errors.yml}.
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\textwidth]{suspiciouserrors}
\caption{suspiciouserrors}
\label{fig:suspiciouserrors}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\textwidth]{suspiciouserrors2}
\caption{suspiciouserrors2}
\label{fig:suspiciouserrors2}
\end{figure}
\subsection{Session Management Testing}
Identificámos que o cookie \texttt{token}, responsável por armazenar o identificador da sessão ativa do utilizador, possui a flag \texttt{HttpOnly} configurada como \texttt{false}. A ausência desta proteção significa que o token está totalmente exposto e pode ser lido por scripts do lado do cliente, tornando a sessão criticamente vulnerável a roubo por Cross-Site Scripting (XSS).
Identificámos que o cookie \texttt{token}, responsável por armazenar o
identificador da sessão ativa do utilizador, possui a flag
\texttt{HttpOnly} configurada como \texttt{false}. A ausência desta
proteção significa que o token está totalmente exposto e pode ser lido
por scripts do lado do cliente, tornando a sessão criticamente vulnerável
a roubo por Cross-Site Scripting (XSS).
\subsection{Input Validation Testing}
\subsubsection*{Testing for Reflected Cross Site Scripting}
Durante a auditoria à barra de pesquisa de produtos, validámos a existência de uma vulnerabilidade de \textit{Reflected Cross-Site Scripting} (XSS) devido à ausência de higienização do input do utilizador.
Durante a auditoria à barra de pesquisa de produtos, validámos a
existência de uma vulnerabilidade de \textit{Reflected Cross-Site
Scripting} (XSS) devido à ausência de higienização do input do
utilizador.
\begin{enumerate}
\item \textbf{Injeção HTML:} Introduzimos o valor \texttt{<h1>apple} na pesquisa e verificámos que o resultado foi renderizado no navegador como um título estrutural, confirmando que o código HTML é injetado diretamente na página.
@@ -191,7 +303,9 @@ Durante a auditoria à barra de pesquisa de produtos, validámos a existência d
\end{enumerate}
\subsubsection{Testing for SQL Injection}
Adicionalmente, explorámos o mesmo parâmetro de pesquisa recorrendo ao \textit{sqlmap} para validar falhas de injeção SQL, conseguindo extrair com sucesso a estrutura de 22 tabelas da base de dados:
Adicionalmente, explorámos o mesmo parâmetro de pesquisa recorrendo ao
\textit{sqlmap} para validar falhas de injeção SQL, conseguindo extrair
com sucesso a estrutura de 22 tabelas da base de dados:
\begin{codeblock}{bash}
sqlmap -u "http://10.60.0.1:3000/rest/products/search?q=apple" -p q --dbms=sqlite --prefix="'%" --suffix="%'--" --tables --batch
@@ -224,19 +338,38 @@ sqlmap -u "http://10.60.0.1:3000/rest/products/search?q=apple" -p q --dbms=sqlit
\end{codeblock}
Apesar de não ter sido detetado pelo active scan foi feito fuzzing nos detalhes de login para saber se estava vulneravel a esse tipo de ataques visto que existia essa vulnerabilidade noutros paremetros. Verificamos que de facto também estava vulneravel a SQL Injection, e que a resposta era a tabela com o
Apesar de não ter sido detetado pelo active scan foi feito fuzzing nos
detalhes de login para saber se estava vulneravel a esse tipo de ataques
visto que existia essa vulnerabilidade noutros paremetros. Verificamos
que de facto também estava vulneravel a SQL Injection, e que a resposta
era a tabela com o
\subsection{Testing for Error Handling}
Ao tentar forçar o acesso a uma página ou ficheiro inexistente no servidor de ficheiros, como por exemplo na rota \texttt{/ftp/teste}, a aplicação falhou ao tratar a exceção de forma segura. Em vez de apresentar uma página de erro genérica (404), o servidor devolveu uma resposta detalhada expondo o \textit{stack trace} completo do ambiente \textit{Express.js}, revelando caminhos internos do sistema de ficheiros do servidor.
Ao tentar forçar o acesso a uma página ou ficheiro inexistente no
servidor de ficheiros, como por exemplo na rota \texttt{/ftp/teste},
a aplicação falhou ao tratar a exceção de forma segura. Em vez de
apresentar uma página de erro genérica (404), o servidor devolveu uma
resposta detalhada expondo o \textit{stack trace} completo do ambiente
\textit{Express.js}, revelando caminhos internos do sistema de ficheiros
do servidor.
\includegraphics[width=\textwidth]{stack-trace}
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\textwidth]{stack-trace}
\caption{stack-trace}
\label{fig:stack-trace}
\end{figure}
\subsection{Client Side Testing}
Validámos que o token de sessão (JWT) do utilizador autenticado está armazenado diretamente no \texttt{localStorage} do navegador. Uma vez que o \texttt{localStorage} não possui mecanismos de proteção equivalentes à flag \texttt{HttpOnly} dos cookies, qualquer script executado no contexto da página consegue ler estes dados.
Validámos que o token de sessão (JWT) do utilizador autenticado está
armazenado diretamente no \texttt{localStorage} do navegador. Uma vez
que o \texttt{localStorage} não possui mecanismos de proteção
equivalentes à flag \texttt{HttpOnly} dos cookies, qualquer script
executado no contexto da página consegue ler estes dados.
Utilizando a falha de XSS identificada anteriormente na barra de pesquisas, injetámos o seguinte payload direcionado:
@@ -244,22 +377,151 @@ Utilizando a falha de XSS identificada anteriormente na barra de pesquisas, inje
<img src="x" onerror="alert(localStorage.getItem('token'))">apple
\end{codeblock}
A execução deste vetor permitiu extrair o conteúdo do token diretamente do armazenamento local da vítima. Isto prova que um atacante pode automatizar a exfiltração destas informações e assumir a identidade de qualquer utilizador afetado sem necessitar de saber as credenciais de acesso de forma persistente.
A execução deste vetor permitiu extrair o conteúdo do token diretamente
do armazenamento local da vítima. Isto prova que um atacante pode
automatizar a exfiltração destas informações e assumir a identidade de
qualquer utilizador afetado sem necessitar de saber as credenciais de
acesso de forma persistente.
\section{Web Application Security Firewall}
% Esta seccao sera preenchida com os resultados da Segunda Etapa (Com WAF ativada)
\begin{codeblock}{modsecurity.conf}
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecDebugLog /var/log/modsecurity/debug.log
SecDebugLogLevel 0
SecAuditLogParts ABIJ
SecAuditLogType Serial
SecAuditLog /var/log/modsecurity/audit.log
# sql injection
SecRule REQUEST_URI|ARGS "['\";]|--" \
SecRule REQUEST_URI|ARGS "(?i:(?:select|insert|update|delete|drop|union|create|alter|truncate)\s+.+\s+from|'[^']*'|--|;|\b(or|and)\b\s+\d+\s*=\s*\d+)" \
"id:950001,phase:1,deny,status:403,msg:'SQL INJECTION ATTACK DETECTED!!!',log,t:urlDecode,t:sqlHexDecode,t:lowercase"
# xss / html injection
SecRule REQUEST_URI|ARGS "(<.*>)|(%3C.*%3E)" \
"id:950003,phase:1,deny,status:403,msg:'XSS/HTML INJECTION DETECTED!!!',log"
# command injection
SecRule ARGS "(\"role\".*:.*\"admin\")|exec|cat|more|ls|dir|/etc/passwd" \
"id:950006,phase:2,deny,status:403,msg:'COMMAND INJECTION DETECTED!!!',log"
# path traversal
SecRule REQUEST_URI|ARGS "\%00|\%2500|\.\./|ftp|metrics|api-docs" \
"id:950007,phase:2,deny,status:403,msg:'PATH TRAVERSAL ATTEMPT!!!',log"
# exposed stuff (redundante ?)
SecRule REQUEST_URI|ARGS "\%00|\%2500|ftp|metrics|api-docs" \
"id:950008,phase:2,deny,status:500,msg:'ATTEMPT TO ACCESS FTP, METRICS, API-DOCS!!!',log"
# rate limiting on login endpoint
# (max 5 requests per 30s per IP)
SecAction \
"id:950009,phase:1,initcol:ip=%{REMOTE_ADDR},pass,nolog"
SecRule REQUEST_URI "@streq /rest/user/login" \
"id:950010,phase:2,pass,nolog,setvar:ip.login_count=+1,expirevar:ip.login_count=30"
SecRule IP:LOGIN_COUNT "@gt 5" \
"id:950011,phase:2,deny,status:429,msg:'Rate Limit Exceeded on Login',log"
\end{codeblock}
\subsection{Information Gathering}
O acesso direto via URL (e.g., \texttt{/ftp}, \texttt{/metrics}, \texttt{/api-docs}) é
mitigado pela regra id:950008, que inspeciona o caminho do pedido (\texttt{REQUEST\_URI})
e devolve \texttt{500} ao bloquear qualquer acesso direto a estes endpoints!
A mitigação desta categoria é, portanto, completa ao nível de pedidos HTTP.
\subsection{Configuration and Deployment Management Testing}
A restrição de métodos HTTP e a validação de permissões de diretório requerem
intervenção ao nível do servidor Apache ou da aplicação, estando fora do âmbito
das regras \texttt{SecRule} definidas.
\subsection{Identity Management Testing}
A regra de XSS/injeção HTML (id:950003) bloqueia eficazmente o registo de utilizadores
com tags HTML nos campos de \textit{input}, como \texttt{<h1>STRONG}, devolvendo um erro
\texttt{403 Forbidden} antes que o pedido chegue à aplicação.
A vulnerabilidade de escalonamento de permissões (injeção do campo
\texttt{"role":"admin"} no corpo JSON do registo) \textbf{é mitigada
pela regra id:950006}, que deteta a sequência
\texttt{"role".*:.*"admin"} nos argumentos do pedido e devolve
\texttt{403 Forbidden}, impedindo a criação de contas com perfil de
administrador.
A enumeração de contas via mensagens de erro da aplicação \textbf{permanece sem mitigação} ao nível da WAF.
\subsection{Authentication Testing}
As regras id:950009--950011 implementam um mecanismo de \textit{rate limiting} sobre o
endpoint de autenticação (\texttt{/rest/user/login}). Para cada endereço IP, é mantido
um contador de pedidos com janela deslizante de 30 segundos: ao ultrapassar 5 tentativas
nessa janela, o servidor devolve \texttt{429 Too Many Requests}, bloqueando eficazmente
ataques de \textit{brute force} por dicionário.
O bloqueio de contas após múltiplas tentativas falhadas permanece fora do âmbito da WAF,
exigindo lógica aplicacional.
\subsection{Authorization Testing}
A regra id:950007 e id:950008 bloqueiam o uso de \textit{null byte}
codificadas para cobrir este vetor de ataque.
\subsection{Session Management Testing}
A configuração da WAF não tem capacidade de alterar os atributos dos
cookies definidos pela aplicação. Logo, a flag \texttt{HttpOnly} do cookie
\texttt{token} continua ausente, uma vez que esta é uma propriedade
definida pelo \textit{JuiceShop}. Ainda assim, a mitigação do XSS
pela regra id:950003, descrita na subsecção seguinte, reduz
indiretamente o risco de roubo de sessão ao bloquear os vetores que
permitiriam a sua exploração.
\subsection{Input Validation Testing}
A regra de SQL Injection (id:950001) bloqueia com sucesso pedidos ao
endpoint de pesquisa de produtos que contenham caracteres como
\texttt{'}, \texttt{"}, \texttt{;} ou a sequência \texttt{--},
devolvendo \texttt{403 Forbidden}.
O payload utilizado pelo \textit{sqlmap} ou por outros fuzzers
com \textit{SQL injections} são interceptado nesta fase.
A regra de XSS/injeção HTML (id:950003) bloqueia igualmente os payloads com tags
\texttt{<img src="x" onerror="...">} e \texttt{<h1>}, neutralizando
ambos estes vetores de ataque.
\subsection{Testing for Error Handling}
A exposição do \textit{stack trace} do \textit{Express.js} em rotas
inexistentes (e.g., \texttt{/ftp/teste}) aind não é mitigada. Para
suprimir estas respostas de erro detalhadas era necessário ativar
a inspeção do corpo da resposta e definir regras sobre o seu
conteúdo, ou configurar páginas de erro personalizadas no Apache.
\subsection{Client Side Testing}
O payload de exfiltração do token JWT via XSS
(\texttt{<img src="x" onerror="alert(localStorage.getItem('token'))">})
é bloqueado pela regra id:950003, uma vez que contém a expressão
\texttt{<.*>}.
\section{Conclusions}
Foi feita uma análise extensa dos possiveis vetores de ataque da aplicação
e com isso desenvolvemos uma \textbf{WAF} que cobriu uma maioria dos
ataques. Contudo, as vulnerabilidades estruturais da aplicação, como a ausência de flags \texttt{HttpOnly} em cookies,
a lógica de enumeração de utilizadores e a exposição de \textit{stack traces}, competem diretamente
ao desenvolvimento seguro do código e à configuração do web server.
Em suma, com poucas regras simples foi possible bloquear a maioria das ameaças de
injeção de código malicioso, no entanto, para cobrir uma maior superficie
de ataques seria necessário mudar a lógica interna da aplicação.
\end{document}

View File

@@ -7,22 +7,22 @@
\contentsline {section}{\numberline {3}Web application security testing}{4}{section.3}%
\contentsline {subsection}{\numberline {3.1}Information Gathering}{4}{subsection.3.1}%
\contentsline {subsection}{\numberline {3.2}Configuration and Deployment Management Testing}{4}{subsection.3.2}%
\contentsline {subsection}{\numberline {3.3}Identity Management Testing}{5}{subsection.3.3}%
\contentsline {subsection}{\numberline {3.3}Identity Management Testing}{6}{subsection.3.3}%
\contentsline {subsection}{\numberline {3.4}Authentication Testing}{7}{subsection.3.4}%
\contentsline {subsection}{\numberline {3.5}Authorization Testing}{7}{subsection.3.5}%
\contentsline {subsection}{\numberline {3.6}Session Management Testing}{7}{subsection.3.6}%
\contentsline {subsection}{\numberline {3.7}Input Validation Testing}{7}{subsection.3.7}%
\contentsline {subsubsection}{\numberline {3.7.1}Testing for SQL Injection}{8}{subsubsection.3.7.1}%
\contentsline {subsection}{\numberline {3.8}Testing for Error Handling}{8}{subsection.3.8}%
\contentsline {subsection}{\numberline {3.9}Client Side Testing}{9}{subsection.3.9}%
\contentsline {section}{\numberline {4}Web Application Security Firewall}{10}{section.4}%
\contentsline {subsection}{\numberline {4.1}Information Gathering}{10}{subsection.4.1}%
\contentsline {subsection}{\numberline {4.2}Configuration and Deployment Management Testing}{10}{subsection.4.2}%
\contentsline {subsection}{\numberline {4.3}Identity Management Testing}{10}{subsection.4.3}%
\contentsline {subsection}{\numberline {4.4}Authentication Testing}{10}{subsection.4.4}%
\contentsline {subsection}{\numberline {4.5}Authorization Testing}{10}{subsection.4.5}%
\contentsline {subsection}{\numberline {4.6}Session Management Testing}{10}{subsection.4.6}%
\contentsline {subsection}{\numberline {4.7}Input Validation Testing}{10}{subsection.4.7}%
\contentsline {subsection}{\numberline {4.8}Testing for Error Handling}{10}{subsection.4.8}%
\contentsline {subsection}{\numberline {4.9}Client Side Testing}{10}{subsection.4.9}%
\contentsline {section}{\numberline {5}Conclusions}{10}{section.5}%
\contentsline {subsection}{\numberline {3.6}Session Management Testing}{9}{subsection.3.6}%
\contentsline {subsection}{\numberline {3.7}Input Validation Testing}{9}{subsection.3.7}%
\contentsline {subsubsection}{\numberline {3.7.1}Testing for SQL Injection}{10}{subsubsection.3.7.1}%
\contentsline {subsection}{\numberline {3.8}Testing for Error Handling}{10}{subsection.3.8}%
\contentsline {subsection}{\numberline {3.9}Client Side Testing}{11}{subsection.3.9}%
\contentsline {section}{\numberline {4}Web Application Security Firewall}{11}{section.4}%
\contentsline {subsection}{\numberline {4.1}Information Gathering}{12}{subsection.4.1}%
\contentsline {subsection}{\numberline {4.2}Configuration and Deployment Management Testing}{12}{subsection.4.2}%
\contentsline {subsection}{\numberline {4.3}Identity Management Testing}{13}{subsection.4.3}%
\contentsline {subsection}{\numberline {4.4}Authentication Testing}{13}{subsection.4.4}%
\contentsline {subsection}{\numberline {4.5}Authorization Testing}{13}{subsection.4.5}%
\contentsline {subsection}{\numberline {4.6}Session Management Testing}{13}{subsection.4.6}%
\contentsline {subsection}{\numberline {4.7}Input Validation Testing}{13}{subsection.4.7}%
\contentsline {subsection}{\numberline {4.8}Testing for Error Handling}{14}{subsection.4.8}%
\contentsline {subsection}{\numberline {4.9}Client Side Testing}{14}{subsection.4.9}%
\contentsline {section}{\numberline {5}Conclusions}{14}{section.5}%