Cross-Site Scripting ( XSS )
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





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)