Aula 47 | Back-End por trás do SQL Injection

Aula 47 | Back-End por trás do SQL Injection

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";

// Cria a conexão
$conn = new mysqli($servername, $username, $password, $dbname);

// Checa a conexão
if ($conn->connect_error) {
    die("Conexão falhou: " . $conn->connect_error);
}

$id = $_GET['id']; // Pega o parâmetro id da URL

$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.

Sugestões de Aulas

Aula 48 | Passo a Passo SQL Injection

Ver Aula

Aula 46 | Modificiando Query SQL Injection

Ver Aula

Aula 61 | Ataque Smurf

Ver Aula