Partilhar: WhatsApp
aulify
UC UC02836 · T. Desenv. Software, T. Inform. Gestão

Ficha 01 · Vulnerabilidades comuns

OWASP Top 10, injection, XSS, broken access control
Versão · Aluno
Tempo · 60 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

Parte I · Injection

Exercício 1 · Identificar SQL injection (15 pts)

Este código está vulnerável a SQL injection. Indica:

nome = request.form["nome"]
query = f"SELECT * FROM users WHERE nome = '{nome}' AND ativo = 1"
cursor.execute(query)

a) Que input malicioso pode bypassar a verificação ativo = 1?

b) Como corrigir?

Exercício 2 · Outras injections (10 pts)

Para cada caso indica o tipo de injection e como prevenir:

a) os.system(f"convert {file} out.png") — input vem do user.

b) Endereço LDAP construído com f"(uid={user})".

c) Em loja online, URL ?file=../../etc/passwd.

Parte II · XSS

Exercício 3 · Identificar XSS (15 pts)

Este template Jinja2 está vulnerável:

<div>{{ comentario|safe }}</div>

a) Porquê? O que torna isto perigoso?

b) Que ataques são possíveis?

c) Como corrigir mantendo formatação simples (negrito, itálico)?

Se precisar permitir formatação:

```python
import bleach

comentario_seguro = bleach.clean(
    comentario,
    tags=["b", "i", "u", "p", "br"],
    attributes={}
)

E continuar sem |safe no template — bleach já sanitizou.

Exercício 4 · CSP (10 pts)

a) O que é Content Security Policy?

b) Que header HTTP exemplo definirias para um site só com recursos próprios?

Parte III · Access Control

Exercício 5 · Broken access control (15 pts)

Este código tem uma vulnerabilidade. Identifica e corrige:

@app.route("/api/encomendas/<int:id>")
@login_required
def ver_encomenda(id):
    enc = Encomenda.query.get(id)
    return jsonify(enc.to_dict())

Exercício 6 · Verificação no servidor (10 pts)

Frontend esconde botão "Apagar utilizador" para utilizadores não-admin. Backend permite a qualquer utilizador autenticado fazer DELETE /users/123. Está seguro?

Parte IV · Cenário

Exercício 7 · Auditoria de código (25 pts)

Identifica 5 problemas de segurança neste código:

import sqlite3
import hashlib

def login(request):
    user = request.args["user"]
    pwd = request.args["pwd"]
    hashed = hashlib.md5(pwd.encode()).hexdigest()

    conn = sqlite3.connect("app.db")
    cursor = conn.cursor()
    query = f"SELECT * FROM users WHERE nome='{user}' AND pwd='{hashed}'"
    cursor.execute(query)
    row = cursor.fetchone()

    if row:
        session["user_id"] = row[0]
        return "<p>Bem-vindo " + user + "</p>"
    return "Login failed"