Articles

Aprender XSS com o Jogo XSS do Google

Instrução passo a passo sobre como resolver o Jogo XSS do Google

>

>

>

Foto por Markus Spiske temporausch.com de Pexels

XSS aka Cross Site Scripting é uma das perigosas vulnerabilidades do lado do cliente e um dos métodos mais apreciados de caça a bugs.

Google XSS Game é uma plataforma de treinamento fornecida pelo google para praticar XSS. Consiste em 6 níveis e em cada nível, você tem que executar um alerta JavaScript para avançar para o próximo nível. Em cada nível, você terá diferentes problemas e terá que executar o alerta usando diferentes técnicas em cada nível. Isto o ajudará a entender vários métodos que podem ser usados para executar XSS em uma página web.

Então vamos começar.

Navigate para https://xss-game.appspot.com. Aqui é onde o jogo XSS do Google está disponível.

>

Verá uma página como esta

>

>

>

>

Clique no botão Deixe-me a eles! para entrar no jogo.

>

Primeira tarefa : Hello world of XSS

>

>

>

>

>

>

>

Você tem que injetar a carga útil xss no navegador virtual. Você pode ver o código fonte clicando no link “toggle”. Se você não conseguir injetar, você pode obter as dicas clicando no link “show”.

>

E ao verificar o código fonte, ele é um script python e as 2 partes interessantes na função
def get(self) são

>

>self.response.headers.add_header("X-XSS-Protection", "0")>

>

query = self.request.get('query', '')
message = "Sorry, no results were found for <b>" + query + "</b>."
message += " <a href='?'>Try again</a>."
>

>

> A primeira parte irá desligar o auditor XSS cromado e nos permitirá injetar a carga útil do XSS no navegador.

A segunda parte mostra que o valor do parâmetro url query é adicionado diretamente ao corpo. É aí que temos que explorar.

Esta é simples e você pode tentar digitar qualquer um dos seguintes (e ainda mais estão lá) na caixa de busca e procurar

<a href="javascript:alert()">Link</a>

<img src=X onerror="alert()">

<script>alert()</script>

E assim por diante. Se você usou o primeiro, você tem que clicar no link a fim de executar o alerta.

>Great!! Você completou com sucesso o nível 1. Agora você verá um botão para avançar para o próximo nível.

Segunda tarefa : Persistência é a chave

>

>

Nesta tarefa, você tem que executar o alerta adicionando um post. Neste jogo, é DOM XSS, mas quando testar em aplicações de chat/ comentários reais, será um XSS.

Ok vamos dar uma olhada no fonte e na mensagem anterior também.

Quando inspecionar o fonte, você pode ver a mensagem padrão usando diferentes tipos de tags html para estilizá-lo. Essa é a nossa chave.

Cheque o código fonte para confirmá-lo. É assim que nosso post é renderizado

Você pode ver que o post não passa por nenhum filtro. Então podemos usar qualquer um dos métodos mencionados acima.

<a href="javascript:alert()">Link</a>

<img src=X onerror="alert()">

E assim por diante.

Congratulações. Você completou o nível 2. Agora avance para o próximo nível.

>

Task 3 : Essa sensação de afundamento

Esta é uma situação silenciosa diferente das 2 que nós completamos. Aqui, temos que aprender sobre window.location.hash. É a parte que vem depois do símbolo # e é usada para navegação na página. É um recurso do navegador e funcionará mesmo sem JavaScript.

Vamos inspecionar o código fonte para este.

A parte interessante no código é

var html = "Image " + parseInt(num) + "<br>";
html += "<img src='https://medium.com/static/level3/cloud" + num + ".jpg' />";

>num detém o valor de window.location.hash e é usado em 2 lugares. Em primeiro lugar, ele é usado dentro da função parseInt, portanto nossa carga útil não vai funcionar lá. Mas na linha seguinte, os dados brutos são usados. É aí que vamos injectar a nossa carga útil.

Por isso temos de fechar uma única aspa ' lá e precisamos de injectar a nossa carga útil.

>

Pode tentar qualquer carga dentro de ' ' Depois de #

Tente colocar qualquer um dos abaixo após # e visite a url.

1' onerror='alert()

>1'><img src=X onerror="alert()">'

1'><script>alert()</script>'

1'><a href="javascript:alert()">Link</a>'
E assim por diante.

Grande. Agora podemos avançar para o próximo nível.

Task 4 : Context Matters

Temos um espaço para introduzir a duração do temporizador. É onde vamos explorar.

>

Vamos verificar o código fonte.

No timer.html, podemos ver esta linha

<img src="https://medium.com/static/loading.gif" onload="startTimer('{{ timer }}');" />>

Temos que explorar na expressão {{ timer }} Mas é colocado dentro de uma função startTimer(''); que é um manipulador de eventos para onload evento. O ponto principal a notar é que o atributo event handler em HTML aceita múltiplas funções de callback.

Então precisamos fechar a função e executar nosso alerta lá. Note que, o valor não passou por uma função parseInt em vez disso os dados brutos são usados. Então podemos fechar a função adicionando um '); e então injetar o nosso alert. Como ele é usado como inline, não podemos injetar alert(); lá porque ele vai quebrar as coisas. O comando será onload="startTimer('3'); alert();')" e não vai funcionar.

Então temos de adicionar um padrão que mantenha o padrão ininterrupto.
Adicionar alert(' e é o suficiente.

Então a nossa carga útil será

3');alert('

Clicking on start timer button irá executar o alerta e nós terminamos este nível.

>

Avançar para a próxima tarefa.

>

Task 5 : Breaking Protocol

>

>

>

>

>>

Na página inicial, não temos maneira de injectar nada. Tudo o que temos é um link. Então vamos clicar nele.

Aqui, podemos ver 2 lugares para injetar nossa carga útil. um na própria url e outro na caixa de entrada. A caixa de entrada é um lugar para entrar o e-mail e esperar que não seja refletido em outro lugar. Então vamos para o primeiro. Na url.

Inspeccione o código fonte da página atual, que é signup.html e podemos ver a linha

<a href="{{ next }}">Next >></a>

Great place to inject a payload. Nossa carga será definida como o valor de href atributo em uma tag a. Se formos capazes de adicionar javascript:alert(), podemos executar a nossa carga útil. Agora vamos ver qual é o valor de next. Não conseguimos encontrar nenhum na página. Onde o procuramos???

Código Python para o salvamento. Verifique level.py e veremos

if "signup" in self.request.path:
self.render_template('signup.html',
{'next': self.request.get('next')})

Então o valor de next na url será usado.

Mude o valor de next na url de confirm para javascript:alert() e a url final será parecida com

Now clicking on Next >> in the page will trigger our payload.

We now completed level 5. And 1 level remains.

Task 6 : Follow the 🐇

There is a path to a js file in the url.

Let’s inspect the source code. In page index.html, you can see a function includeGadget e dentro do corpo da função, você pode ver o seguinte código.

var scriptEl = document.createElement('script');

> Então podemos carregar um arquivo js externo mas não de um arquivo http ou https url.

Aqui, vamos tentar o data urls.

As urls de dados estão na forma data:{type},content

> Então mude o valor após # para

data:application/javascript,alert()

ou para

data:text/plain,alert() e podemos executar o alert.

>

Aqui está um vídeo de resolução do Jogo.