Sem Grana para um WAF?! … Criando uma regra simples de Bloqueio de XSS no Fortigate.

Galera, neste post vamos ver como criar uma assinatura customizada de IPS, para detectar um ataque de XSS  em uma aplicação web atrás do Fortigate.

OBs: O melhor método de proteger aplicações WEB é o Fortiweb, mas, sabemos que nem sempre é possível a compra ou a mesma pode levar um tempo muito grande e estaremos vulnerável durante esse processo.

 

Chega de blah blah blah e vamos escovar uns bits rsrsrs.

Vamos ao problema:

Temos um site que é vulnerável a XSS em nosso ambiente, excluindo a possibilidade de alteração e correção da vulnerabilidade direta na aplicação, nos resta colocar algo na frente para corrigir o problema, a vulnerabilidade ocorre no campo de busca de nossa aplicação, acessível do mundo externo, a url vulnerável é :

http://ip_aplicacao/index.php?busca=

Fazendo um simples teste para checar a vulnerabilidade.

http://ip_aplicacao/index.php?busca=



Começando com a sintaxe da nossa assinatura:

F-SBID =  Esse é um padrão da Fortinet para identificar uma assinatura customizada.

–attack_id = numero da nossa assinatura deve ser um numero alto não usado em outras assinatura (não é obrigatório)

–name = Nome da nossa assinatura

–protocol = Protocolo para dar match em nossa assinatura, ex: TCP ou UDP

–service = Seria SMTP ou HTTP

–parsed_type = São partes do pacote ou sessão que podem ser separadas pelo decoder, ex: HTTP_GET ou HTTP_POST entre outros

–context = É utilizado para especificar qual campo do protocolo a engine do IPS deve procurar o conteúdo do –pattern

–pattern= É utilizado para definir qual conteúdo deve dar match na assinatura, pode utilizar texto ou binário com o uso do | seguido do valor em hexadecimal.

–pcre = É utilizado par inserir conteúdo utilizando a engine de regex do per.

Existem outras centenas de opções bem documentadas que podem ser encontradas em IPS Signature Syntax Guide.

Para criar nossa nossa regra vamos em Security Profiles > IPS Signatures > Create New

Vamos ver como vai ficar a nossa regra:

F-SBID( --attack_id 5100; --name "XSS.MySite";  -- protocol tcp; --service HTTP; --parsed_type HTTP_GET; --context host;  --context uri; --pattern "arquivo.php?busca";  --pcre "/((\%3C)|<)((\% 2F)|\ / )*[ a -z 0-9\ %]+((\%3E)|>)/i";)

Explicando a regra:

— protocol tcp; //como é http nosso protocolo só poderia ser TCP

–service HTTP; // Auto explicativo.

–parsed_type HTTP_GET; // Os dados são enviados via GET para a aplicação (o payload do nosso XSS está na url)

–context host; // Os dados são enviados do usuário ao servidor

–context uri; // Procura o conteúdo da nossa assinatura dentro da URL

–pattern “arquivo.php?busca” // Para evitar falsos positivos estou limitando a URL de busca da nossa assinatura.

–pcre “/((\%3C)|<)((\% 2F)|\ / )*[ a -z 0-9\ %]+((\%3E)|>)/i”;  // Esse conteúdo é uma expressão regular e vamos dividi-la para entendermos melhor.

((\%3C)|<) // Procura o sinal de “<” ou seu equivalente em HEX.

((\% 2F)|\ / ) // Procura pela “/” ou seu equivalente em HEX.

*[ a -z 0-9\ %]+ // Gera um regex como um coringa para qualquer coisa de “a” a “z” e de “0” a “9” .

((\%3E)|>) // Procura sinal de “>” ou seu equivalente em HEX.

/i  //E por ultimo o nosso “/i” para informar que a regex não será case sensitivo (valendo assim para caracteres maiúsculos e minúsculos)

 

Agora com a nossa regra pronta vamos adiciona-la a um Profile de IPS.

Vamos em Security Profiles > Intrusion Protection > IPS Sensors > Create News

Adicionamos um nome ao nosso Profile e selecionamos a nossa regra criada anteriormente.

E vamos definir a mesma como bloqueio.

Agora temos que adicionar a nossa regra de entrada (VIP) da aplicação a qual desejamos proteger.

Após isso vamos verificar em nosso log o que ocorre.

 

Funcionou como esperado.

Lembrando que essa assinatura é simples e não contempla nenhuma proteção contra bypass utilizando as inúmeras técnicas disponíveis na internet(isso fica para um outro post), mas, já barra vários scriptkids  🙂 Essa assinatura é especifica para essa falha e não contempla por exemplo a inserção do payload já dentro de uma tag javascript.

Abs.

 

 

https://www.trtec.com.br/produtos/fortinet/index.php

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *