Skip to content

ElcioAngelo/restaurantepythonico

Damn Vulnerable RESTaurant Logo

Alterações Feitas:

### LEVEL 1 ##############################################################################
    @router.put("/profile", response_model=UserUpdate, status_code=status.HTTP_200_OK)
def update_profile(
    user: UserUpdate,
    current_user: Annotated[User, Depends(get_current_user)],
    db: Session = Depends(get_db),
):
    db_user = get_user_by_username(db, user.username)

    #adcionado um comparador para o id do usuário utilizador, e o usuário do banco.
    if current_user.id == db_user.id:
        for var, value in user.dict().items():
            if value:
                setattr(db_user, var, value)

    db.add(db_user)
    db.commit()
    db.refresh(db_user)

    return db_user
##################################################################################################
# LEVEL 2
@router.put("/profile", response_model=UserUpdate, status_code=status.HTTP_200_OK)
def update_profile(
    user: UserUpdate,
    current_user: Annotated[User, Depends(get_current_user)],
    db: Session = Depends(get_db),
):
    db_user = get_user_by_username(db, user.username)
    
    if current_user.id == db_user.id:
        for var, value in user.dict().items():
            if value:
                setattr(db_user, var, value)

    db.add(db_user)
    db.commit()
    db.refresh(db_user)

    return db_user
##################################################################################################
# LEVEL 3 (update_user_role_service)

    # this method allows staff to give Employee role to other users
    # Chef role is restricted
    if user.role == models.UserRole.CHEF.value:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Only Chef is authorized to add Chef role!",
        )
    
    # * Verifica se o usuário atual tem o cargo de funcionário ou Chef, se sim, ele consegue alterar o cargo.
    if current_user.role == models.UserRole.EMPLOYEE or current_user.role == models.UserRole.CHEF:    
        db_user = update_user(db, user.username, user)
    
    return current_user
##################################################################################################
# LEVEL 4
from urllib.parse import urlparse

ALLOWED_DOMAINS = {"imgur.com", "unsplash.com", "images.unsplash.com"}

def is_valid_image_url(url: str) -> bool:
    try:

        parsed_url = urlparse(url)
        domain = parsed_url.netloc.lower()

        if domain.startswith("www."):
            domain = domain[4:]

        if domain not in ALLOWED_DOMAINS:
            return False

        response = requests.head(url, allow_redirects=True)
        content_type = response.headers.get("Content-Type", "")
        return content_type.startswith("image/")
    except requests.RequestException:
        return False


def _image_url_to_base64(image_url: str):

    if not is_valid_image_url(image_url):
        raise HTTPException(status_code=400, detail="Invalid image URL")

    response = requests.get(image_url, stream=True)
    encoded_image = base64.b64encode(response.content).decode()

    return encoded_image
##################################################################################################
# LEVEL 5

import subprocess


def get_disk_usage(parameters: str):

    if not parameters:
        parameters = "/"

    if not parameters.startswith("/"):
        raise ValueError("Invalid parameters: must start with '/' to avoid shell injection.")
    
    command = ["df", "-h", parameters]

    try:
        result = subprocess.run(
            command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True
        )
        usage = result.stdout.strip().decode()
    except subprocess.CalledProcessError as e:
        raise Exception(f"Command failed with error: {e.stderr.decode().strip()}")
    except Exception as e:
        raise Exception(f"An unexpected error was observed: {str(e)}")


    return usage

Vuln01:

Metodo de alteração de informações dos usuários permite modificação não autorizada

Descrição:

  • Um usuário pode alterar as informações de outro usuário.
  • A rota não verifica se o id do usuário atual é igual ao id do usuário que ele vai modificar

Localização:

  • Diretório: app/apis/users/services/update_user_role_service.py
  • rota: /profile (PUT)

Risco:

  • Perda/Alteração de informações sensiveis de usuários
  • Risco nivel 8.2 (Alto)
  • Score temporal 7.2 (Alto)

vuln02:

Metodo de alterar cargo de usuário não verifica cargo do usuário atual

Descrição:

  • Um usuário com cargo cliente pode adcionar o cargo de funcionario para si mesmo, ou para outros usuários
  • O usuário altera seu cargo (cliente), para o cargo (employee) e tem acesso a privilegios.

Localização:

  • Diretório: app/apis/auth/services/update_profile_service.py
  • Rota: /profile (PUT)

Risco:

  • Usuários comuns podem realizar ações que apenas funcionários deveriam ter permissão
  • Nivel do risco 8.0 (Alto)
  • Nivel temporal 7.1 (Alto)

vuln03:

Usuário pode escalar privilégios e adquirir permissões de employee

Descrição:

  • Quando o usuário insere o role de employee no body da requisição, o sistema aceita e permite a alteração de informações de outros usuários

Localização:

  • Diretório: app/apis/users/services/update_user_role_service.py
  • Rota: /users/update_role (POST)

Risco:

  • Usuários comuns adquirindo permissão de employee para editar outros usuários
  • Nivel do risco 8.0 (alto)
  • Nivel temporal 7.1 (alto)

vuln04:

O usuário pode inserir qualquer tipo de link ao adicionar imagem, e obter acesso ao endpoint de reset de senha do chef

Descrição:

  • Um usuário com role de employee pode editar um item do menu, e inserir links com intenções maliciosas.
  • A rota de reset de senha do chef é apenas acessada pelo localhost. Quando o usuário insere exatamente esse link, o sistema faz uma requisição para esse endpoint, resetando a senha do chef e retornando-a para o usuário.

Localização:

  • Diretório: app/apis/menu/utils.py
  • Rota: /menu (PUT)

Risco:

  • Usuário pode resetar a senha do chef e obter acesso a ela, dando oportunidade para que ele acesse a conta do chef.
  • Nivel do risco 6.8 (médio)
  • Nivel temporal 6.1 (médio)

vuln05:

Usuário pode injetar comandos de shell no servidor da API

Descrição:

  • Ao manipular parâmetros da rota que verifica o espaço no disco, o usuário pode injetar comandos de shell que são executados pelo sistema

Localização:

  • Diretório: app/apis/admin/utils.py
  • Rota: /admin/stats/disk (GET)

Risco:

  • O usuário pode executar comandos maliciosos diretamente no terminal do servidor da API
  • Nivel do risco 8.3 (Alto)
  • Nivel temporal 7.4 (Alto)

About

No description, website, or topics provided.

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages