Compare commits
29 Commits
a17feb0e1b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81e6fb8aa4 | ||
|
|
ab3cbb9081 | ||
|
|
a6860e338d | ||
|
|
30a9483402 | ||
|
|
bc450ebbb3 | ||
|
|
0992d4a6e0 | ||
|
|
c053a064b2 | ||
|
|
cfa62d8ce0 | ||
|
|
0f3e2044a0 | ||
|
|
e9616a8c7c | ||
|
|
361f34c19f | ||
|
|
1f6bb854c3 | ||
|
|
05cbbfbe18 | ||
|
|
ad84c1ba29 | ||
|
|
53c4898efe | ||
|
|
c7b5f0e436 | ||
|
|
51060422d1 | ||
| e3d7b83059 | |||
| 73c5b1c5d5 | |||
|
|
aa58c0cb1d | ||
|
|
183901ab31 | ||
|
|
3e0237c6f3 | ||
|
|
e90263b3c5 | ||
|
|
f69d1d3b38 | ||
|
|
00f537bc3a | ||
|
|
c528f4844b | ||
|
|
fdc85d9109 | ||
|
|
8136c49f50 | ||
|
|
ded74f1a45 |
@@ -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
|
||||
|
||||
15
SERVER.sh
@@ -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
|
||||
@@ -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
@@ -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
3680
entrega.zip.asc
Normal file
BIN
relatorio.pdf
Normal file
BIN
relatorio/imgs/dir-fuzzing.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
relatorio/imgs/ftp.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
relatorio/imgs/metrics.png
Normal file
|
After Width: | Height: | Size: 249 KiB |
BIN
relatorio/imgs/suspiciouserrors.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
relatorio/imgs/suspiciouserrors2.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
relatorio/imgs/swagger.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
@@ -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}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}%
|
||||
|
||||