/
Broken Authentication
Broken Authentication
Debido a una incorrecta validación de la autenticación, el atacante puede acceder a áreas a la cual no debería. Por ejemplo, una validación de autenticación en cliente o mediante datos provenientes de este.
Riesgo del ataque
Robo de información no autorizada.
Posibilidad de modificación o borrado de datos no autorizados.
Ejecución de acciones no autorizadas.
Posibilidad de suplantación del rol administrador.
Código vulnerable 1:
[...]
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean isSessionValid=true;
boolean allowedRequest = false;
HttpSession session = request.getSession(false);
if(urlList.contains(url)) {
allowedRequest = true;
}
if (!allowedRequest) {
if (null == session) {
isSessionValid=false;
redirectToInvalidErrorPage(request, response, url);
return;
}
if(isSessionValid){
try{
if ((Object)session.getAttribute("isValidUser")==null) {
isSessionValid=false;
}
}catch(NullPointerException ne){
isSessionValid=false;
}
}
if(!isSessionValid){
redirectToInvalidErrorPage(request, response, url);
return;
}
else {
UserInfo user = (UserInfo)session.getAttribute("user");
if (url.contains("admin") && user == null) { // this code line
redirectToInvalidErrorPage(request, response, url);
return;
}
}
}
chain.doFilter(req, res);
}
[...] |
Solución:
Se debe garantizar que la validación de la autenticación se realiza del lado del servidor.
[...]
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean isSessionValid=true;
boolean allowedRequest = false;
HttpSession session = request.getSession(false);
if(urlList.contains(url)) {
allowedRequest = true;
}
if (!allowedRequest) {
if (null == session) {
isSessionValid=false;
redirectToInvalidErrorPage(request, response, url);
return;
}
if(isSessionValid){
try{
if ((Object)session.getAttribute("isValidUser")==null) {
isSessionValid=false;
}
}catch(NullPointerException ne){
isSessionValid=false;
}
}
if(!isSessionValid){
redirectToInvalidErrorPage(request, response, url);
return;
}else{
UserInfo user = (UserInfo)session.getAttribute("user");
if(!validateForSecureURL(url, "/admin", user.getRole_id())){ // solution
redirectToInvalidErrorPage(request, response, url);
return;
}
}
}
chain.doFilter(req, res);
}
[...] |
Referencias:
https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html
WSTG - Latest | OWASP Foundation