Cross-Site Scripting ( XSS )

Mar 18 2023
Olá, Obrigado por reservar um tempo para ler a escrita - up! Eu agradeço! O conteúdo de hoje será sobre a compreensão de 'Cross-Site Scripting (XSS)' O conteúdo é totalmente baseado em minhas experiências e conhecimentos pessoais, interações com pessoas incríveis no espaço de App Sec e desenvolvimento de software e muita leitura e codificação segura . Neste artigo, tentarei simplificar o conteúdo no básico.

Olá,

Obrigado por reservar um tempo para ler a escrita - up! Eu agradeço!

O conteúdo de hoje será sobre como entender 'Cross-Site Scripting ( XSS )'

O conteúdo é totalmente baseado em minhas experiências e conhecimentos pessoais, interações com pessoas incríveis no espaço App Sec e Desenvolvimento de Software e muita leitura e codificação segura.

Neste artigo, tentarei simplificar o conteúdo no básico. Tenho certeza de que os leitores terão suas próprias ideias e comentários, e agradeço qualquer feedback e discussão.

As opiniões/comentários/opiniões são minhas e não do meu empregador anterior/atual.

Vamos aprender juntos!

O que é XSS?

Em palavras simples, XSS é um tipo de vulnerabilidade de segurança de aplicativo que permite que um invasor injete código malicioso em uma página da web.

Esse código malicioso é executado no contexto do navegador da vítima, permitindo que o invasor roube a sessão da vítima e também permitindo o roubo de dados.

Diferentes tipos de XSS:

XSS armazenado (persistente): No XSS armazenado, os scripts maliciosos são salvos em um servidor permanentemente. O que isso significa é que o hacker malicioso deve encontrar uma vulnerabilidade no site que permita injetar um script malicioso. Quando a vítima consulta as informações armazenadas, o script malicioso injetado pelo hacker é recuperado do servidor e executado no navegador da vítima.

XSS refletido: no XSS refletido, um invasor insere um código/script malicioso em um site, que é refletido de volta no navegador da vítima. O que isso significa é que uma resposta HTTP maliciosa contém exatamente os mesmos dados (não sendo validados nem codificados) que um aplicativo recebeu em uma solicitação HTTP.

Dom ( Client — Side ) XSS: No DOM XSS, um invasor insere um código/script malicioso para alterar o DOM de uma página da web do navegador da vítima.

Como corrigir o XSS:

Agora, todos os parâmetros e variáveis ​​em uma página da Web precisam ser protegidos.

Um entendimento - cada parâmetro deve passar pela validação de entrada e codificação de saída (santizing) (conforme o contexto de dados).

Estarei listando várias etapas sobre como executar a validação/codificação de saída:

Ponto Net

AntXssEncoder —https://learn.microsoft.com/en-us/dotnet/api/system.web.security.antixss.antixssencoder?view=netframework-4.8

Namespace: System.Web.Security.AntiXss

Montagem:System.Web.dll

Classe: AntiXSSEncoder

using System.Web.Security.AntiXss;

....
string inputStr = "<script>alert('a test xss attack script');</script>";
string encodedInput = AntiXssEncoder.HtmlEncode(inputStr, false);
....

Alguns outros métodos importantes dentro do AntiXssEncoder() quando se trata de codificação de acordo com o contexto do valor, não vou entrar muito em seus detalhes, mas vou listar alguns deles aqui -

CssEncode() — Codifica a string especificada para uso em folhas de estilo em cascata (CSS)

using System.Web.Security.AntiXss;
...
string inputCss = "inside a css attribute value: url('" + "https://example.com?param=" + "value" + "')";
string encodedInput = AntiXssEncoder.CssEncode(inputCss);
...

...
using System.Web.Security.AntiXss;
string input = "Inside an HTML attribute: href=\"" + "https://example.com?param=" + "value" + "\"";
string encodedInput = AntiXssEncoder.HtmlAttributeEncode(input);
...

Utilize o Encoder() da ESAPI

Link :https://www.javadoc.io/doc/org.owasp.esapi/esapi/latest/org/owasp/esapi/Encoder.html

import org.owasp.esapi.ESAPI;
import org.owasp.esapi.Encoder;
...
String input = "<script>alert('XSS');</script>";
Encoder encoder = ESAPI.encoder();
String encodedInput = encoder.encodeForHTML(input);
...

encodeForHTMLAttribute() — Codifica dados para uso em atributos HTML.

encodeForJavaScript() — Codifica dados para inserção dentro de um valor de dados ou argumento de função em JavaScript

encodeForXMLAttribute() — Codifica dados para uso em um atributo XML

Codificação de saída em Javascript

Nunca use innerHTML. innerHTML é uma propriedade do DOM e é usado para definir ou recuperar conteúdo HTML de um elemento. innerHTML é perigoso porque renderiza o conteúdo como html puro e não texto.

Em vez de innerHTML, utilize textContent()

<!DOCTYPE html>
<html>
  <head>
    <title>textContentExample</title>
  </head>
  <body>
    <div id="exampleTextContent"></div>
    <script>
      // Assume this user input comes from an untrusted source, like a form
      const userInput = '<script>alert("XSS attack!");</script>'
      const div = document.querySelector("exampleTextContent");
      div.textContent = userInput;
    </script>
  </body>
</html>

JSTL ( *.jsp): Em JSTL, você pode usar a tag <c:out> para escapar da saída e evitar XSS.

<c:out value="${userInput}" />

Em meu próximo post, abordarei o Path Traversal.

Comentários/Feedbacks são sempre bem-vindos, pois estou sempre procurando melhorar o conteúdo e ser melhor nisso.

Fonte escrita: Minha própria experiência em App Sec, parafraseando o conteúdo de vários sites online, Open AI, DALL-E, Desenvolvedor e ferramentas NLP.

Obrigado!

Me adicione no LinkedIn