javascript - referer owasp




Por que as pessoas colocam códigos como “throw 1;<não seja mau> "e" para(;;); "na frente das respostas json? (3)

Como eles analisam se é inválido e falhariam se você tentasse avaliar isso?

É um recurso que falharia se você tentasse eval lo. eval permite código JavaScript arbitrário, que pode ser usado para um ataque de script entre sites.

Eles apenas o removem da corda (parece caro)?

Eu imagino que sim. Provavelmente algo como:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

O "não seja malvado" impede que os desenvolvedores usem o eval diretamente em vez de uma alternativa mais segura.

Duplicata Possível:
Por que o Google precede enquanto (1); às suas respostas JSON?

O Google retorna json assim:

throw 1; <dont be evil> { foo: bar}

e Facebooks ajax tem json assim:

for(;;); {"error":0,"errorSummary": ""}
  • Por que eles colocam código que iria parar a execução e torna o json inválido?
  • Como eles analisam se é inválido e falhariam se você tentasse avaliar isso?
  • Eles apenas o removem da corda (parece caro)?
  • Existem vantagens de segurança para isso?

Em resposta a isso por motivos de segurança:

Se o scraper estiver em outro domínio, eles precisarão usar uma tag de script para obter os dados, porque o XHR não funcionará em vários domínios. Mesmo sem o for(;;); como o invasor pegaria os dados? Não é atribuído a uma variável, então não seria apenas coleta de lixo porque não há referências a ela?

Basicamente, para obter o domínio cruzado de dados, eles teriam que fazer

<script src="http://target.com/json.js"></script>

Mas, mesmo sem o script de falha, o invasor não pode usar nenhum dos dados do Json sem que ele seja atribuído a uma variável que você possa acessar globalmente (não é nesses casos). O código de travamento efetivamente não faz nada porque, mesmo sem ele, eles precisam usar o script do servidor para usar os dados em seu site.


Mesmo sem o for(;;); como o invasor pegaria os dados?

Os ataques são baseados em alterar o comportamento dos tipos internos, em particular Object e Array , alterando sua função construtora ou seu prototype . Então, quando o JSON direcionado usa um {...} ou [...] construto, eles serão as próprias versões do invasor desses objetos, com comportamento potencialmente inesperado.

Por exemplo, você pode hackear uma setter-property em Object , que trairia os valores escritos em literais de objeto:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

Então, quando um <script> foi apontado em algum JSON que usou esse nome de propriedade:

{"x": "hello"}

o valor "hello" seria vazado.

A forma como os vetores de array e objeto fazem com que setters sejam chamados é controversa. O Firefox removeu o comportamento na versão 3.5, em resposta aos ataques divulgados em sites de alto perfil. No entanto, no momento em que escrevo, o Safari (4) e o Chrome (5) ainda são vulneráveis ​​a isso.

Outro ataque que todos os navegadores agora desaprovam foi redefinir as funções do construtor:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

E por enquanto, a implementação de propriedades do IE8 (com base no padrão ECMAScript Fifth Edition e Object.defineProperty ) atualmente não funciona em Object.prototype ou Array.prototype .

Mas, além de proteger os navegadores anteriores, pode ser que as extensões para JavaScript causem mais vazamentos potenciais de um tipo semelhante no futuro, e, nesse caso, o joio também deve proteger contra esses problemas.


EDITAR

Essas cadeias de caracteres são comumente chamadas de "inutilizáveis" e são usadas para corrigir uma vulnerabilidade de vazamento de informações que afeta a especificação JSON. Este ataque é real e jeremiahgrossman.blogspot.com/2006/01/… . A Mozilla também acredita que isso seja uma vulnerabilidade na especificação JSON e foi corrigido no Firefox 3 . No entanto, como esse problema ainda afeta outros navegadores, é necessário "inventariar inutilizável", porque é um patch compatível.

A resposta de Bobice tem uma explicação técnica desse ataque e está correta.





json