Ficha 01 · Vulnerabilidades comuns
- Reconhecer SQL injection
- Prevenir XSS
- Implementar access control
- Identificar vulnerabilidades
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"