Aprender XSS com o Jogo XSS do Google
Instrução passo a passo sobre como resolver o Jogo XSS do Google
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çãodef 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
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.