Prevenindo ataques XSS em aplicações ASP.NET


Cross-site scripting (XSS) é um tipo de falha de segurança tipicamente encontrada em aplicações web que permite o atacante inserir código dentro das páginas visitadas pela vítima.

Uma das formas mais comuns de explorar esta vulnerabilidade é inserir um formulário web no site vulnerável para tentar obter informações valiosas da vítima.

Outro método é roubar os cookies de sessão do usuário para enviá-los ao atacante.

Exemplo de vulnerabilidade em uma aplicação:

http://www.dominio.com.br/shopping/produto.php?id=%3Cscript%3Ealert%28%22Hello%20XSS%22%29%3B%3C%2Fscript%3E

O trecho após o ?id= é o mesmo que “<script>alert(“Hello XSS”);</script>”, ou seja se a aplicação estiver vulnerável à ataques XSS, o código javascript inserido na URL seria executado.

>Mas alguém pode estar se perguntar da seguinte forma: “o que a minha aplicação tem a ver com isto? visto que ela não atinge meus servidores, mas sim o usuário?”

Respondendo a este questionamento, um ataque beem comum conhecido como Phishing onde por exemplo o atacante cria uma página falsa e envia os links por e-mail esperando alguém desatento clicar e fornecer os dados reais, veja exemplos de como este ataque pode ocorrer aqui.

Bom, mas sem delongas e vamos para a prática 🙂 pois o assunto é muito extenso.

Abra o Visual Studio (neste exemplo utilizei a versão 2010), e crie um novo projeto ASP.NET MVC chamado XSS conforme a imagem a seguir:

Criação do Projeto XSS - Visual Studio

Adicione um novo Controller chamado NewsletterController conforme as imagens abaixo:

Adição de Controller4-NewsletterController

Clique com o botão direito na pasta Models, e no menu selecione Add > New Class e adicione uma nova classe chamada Newsletter.

Na classe criada, insira o seguinte código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;

namespace XSS.Models
{
   public class Newsletter
   {
      public int Id { get; set; }
      [DisplayName("Title: ")]
      public string Title { get; set; }
      [DisplayName("Author: ")]
      public string Author { get; set; }
      [DisplayName("Summary: ")]
      public string Summary { get; set; }
      [DisplayName("News: ")]
      public string Content { get; set; }
    }
}

Já no nosso controller deixe da seguinte forma:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using XSS.Models;

namespace XSS.Controllers
{
    public class NewsletterController : Controller
    {
        //
        // GET: /Newsletter/

        public ActionResult Index()
        {
            Newsletter model = new Newsletter();
            return View(model);
        }

        [HttpPost]
        public ActionResult Add(Newsletter model)
        {
            // TODO: Your logic here
            TempData["News"] = model.Content;
            return RedirectToAction("Index", "Home");
        }

    }
}

Agora clique com o botão direito na linha return View(model); e selecione Add View conforme a imagem abaixo:
Adicionando View ao Projeto
Crie um formulário dentro da view da seguinte forma:


<h2>Index</h2>

@using(Html.BeginForm("Add", "Newsletter", FormMethod.Post))
{
<p>
@Html.LabelFor(m => m.Title)
@Html.TextBoxFor(m => m.Title)
</p>
<p>
@Html.LabelFor(m => m.Summary)
@Html.TextBoxFor(m => m.Summary)
</p>
<p>
@Html.LabelFor(m => m.Author)
@Html.TextBoxFor(m => m.Author)
</p>
<p>
@Html.LabelFor(m => m.Content)
@Html.TextAreaFor(m => m.Content)
</p>

<p>
<input type="submit" value="Send" />
</p>
}

Abra o arquivo Views/Home/Index.cshtml e insira o seguinte trecho para imprimir o conteúdo da notícia:


@if (TempData["News"] != null)
{
    @* Imprime o conteúdo do formulário *@
@Html.Raw(TempData["News"])
}

Agora pressione F5 para compilar e executar a aplicação, e preencha o formulário que está na url: http://localhost:<porta>/Newsletter, conforme exemplo abaixo:

Preenchimento dos dados
Preenchimento dos dados

Note que no campo News: coloquei um código javascript para explorar a vulnerabilidade no navegador;

Após o preenchimento dos campos. clique no botão Send para efetuar o post, aparecerá uma mensagem de erro semelhante à seguinte:

9-Erro_Post

As aplicações .NET por padrão tentam bloquear qualquer insersão de códigos em formulários justamente para evitar ataques XSS nas aplicações desenvolvidas, mas caso seja extremamente necessário postar códigos HTML, XML entre outros, este recurso pode ser desabilitado da seguinte forma:

Abra o código da classe NewsletterController e adicione a seguinte código acima do método Add(Newsletter model):


// ......

[ValidateInput(false)] // Adicione esta linha
public ActionResult Add(Newsletter model)
{
// continua o código
}

Após esta alteração, pressione F5 para executar novamente o projeto, preencha o formulário da mesma forma que foi feito anteriormente e veja o resultado:

Alerta exibido através de ataque XSS

Agora vamos corrigir esta falha de segurança:

  1. Clique no menu Tools > Library Package Manager > Package Manager Console
  2. Utilizando o Nugget vamos baixar a bibliteca AntiXSS digirando o comando Install-Package AntiXSS conforme imagem abaixo;Instalação AntiXSS Nugget
  3. No método Add do nosso controller, altere o corpo do método para que fique da seguinte forma:
    [HttpPost]
            [ValidateInput(false)]
            public ActionResult Add(Newsletter model)
            {
                // TODO: Your logic here
    
                // O método Sanitizer.GetSafeHtmlFragment(string input) remove todo conteúdo que está entre tags
                // impedindo desta forma boa parte dos ataques XSS
                string contentAntiXSS = Sanitizer.GetSafeHtmlFragment(model.Content);
                TempData["News"] = contentAntiXSS;
                return RedirectToAction("Index", "Home");
            }
                
  4. Coloque um breakpoint na linha TempData[“News”] para inspecionar o conteúdo da variável contentAntiXSS;
  5. Execute novamente o projeto e envie o formulário como nos testes anteriores.
  6. Veja a diferença após a remoção do trecho de código com o Sanitizer:13-Inspecao_Variaveis
  7. Pronto, ao completar a execução, o conteúdo é exibido sem nenhum risco na nossa página inicial.

Download do projeto: aqui (sem bibliotecas) ou aqui (com as bibliotecas)

Fico por aqui, até a próxima.

🙂

Scanner de Portas Java


Olá, neste post gostaria de mostrar um programa que efetua o scan de portas em algum computador ou servidor dentro da rede, o que é de grande utilidade para aprimorar a segurança das informações que trafegam internamente com o fechamento de portas desnecessárias, dimininuindo assim a vulnerabilidade da rede local. Também é útil para a verificação se o firewall ou outras medidas de segurança estão bloqueando determinado serviço que necessite de conexão livre com a Internet para funcionar corretamente, como é o caso de aplicações remotas que acessam um banco de dados ou sockets.

Continue reading “Scanner de Portas Java”

Dicas – Como aumentar o sinal da rede Wi-Fi (sem fio)


Com cada vez mais dispositivos conectados à internet, às vezes fica inviável utilizar cabos para ligar todos os aparelhos. Por isso, os roteadores Wi-Fi estão sendo muito exigidos pelos usuários. O problema é que também há muitas reclamações relacionadas aos aparelhos. A maior parte delas devido às velocidades e instabilidades do sinal.

Se você já sofreu com isso, está na hora de conhecer algumas dicas muito interessantes (e simples) de como melhorar o sinal da internet sem fio na sua casa. Com apenas algumas rápidas mudanças, você pode melhorar – e muito – a qualidade das transmissões de internet. Confira. Continue reading “Dicas – Como aumentar o sinal da rede Wi-Fi (sem fio)”

GPUs comuns podem quebrar senhas em 12 segundos


Agência de internet britânica divulga relatório que mostra que processadores gráficos comuns também são armas de hackers.

A capacidade de processamento das GPUs está superando a das CPUs. Segundo a agência de internet UKFast, novas técnicas de hackers conseguem fazer com que senhas complexas sejam quebradas em apenas 12 segundos. E para isso nem são necessários computadores superpoderosos, mas apenas GPUs como a NVIDIAGeForce GT220 (que custa apenas 70 euros, no Reino Unido).

Esse tipo de processador gráfico pode quebrar senhas de 6 caracteres em 12 segundos, 7 caracteres em 5 minutos e 8 caracteres em 4 horas. Se o hacker puder gastar um pouco mais, comprando uma placa de vídeo top de linha, o tempo gasto para a quebra de senhas é ainda maior. Neste segundo caso, cerca de 10,3 bilhões de códigos podem ser processados por segundo.

Segundo a própria UKFast, isso mostra que qualquer caractere a mais inserido nas senhas pode representar uma melhoria significativa na segurança de contas de email e redes sociais. O Tecmundo reafirma o que disse a agência britânica: quanto mais complexa sua senha, mais segura é sua conta.