Express Prototype Pollution Gadgets
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Para mais detalhes dê uma olhada na pesquisa original
Em um aplicativo Express usando uma resposta de tipo de conteúdo JSON e refletindo um JSON:
Nestes casos, XSS normalmente não é possível com um tipo de conteúdo JSON. No entanto, com a poluição de protótipos, podemos confundir o Express para servir uma resposta HTML. Essa vulnerabilidade depende da aplicação usar res.send(obj)
e usar o analisador de corpo com o tipo de conteúdo application/json.
Ao poluir as propriedades body
e _body
, é possível fazer com que o Express sirva o tipo de conteúdo HTML e reflita a propriedade _body
, resultando em XSS armazenado.
É possível fazer o express renderizar conteúdo UTF-7 com:
O seguinte PP fará com que atributos dentro de um JSON tenham um espaço extra que não quebrará a funcionalidade:
Então um JSON refletido ficará assim:
O seguinte gadget de PP fará com que o servidor envie de volta o cabeçalho HTTP: Access-Control-Expose_headers: foo
Requer que o módulo CORS esteja instalado
Com o seguinte payload, é possível ocultar um método de uma resposta OPTIONS:
É possível alterar o código de status retornado usando a seguinte carga útil de PP:
Quando você atribui a um protótipo com um primitivo, como uma string, isso produz uma operação no-op, uma vez que o protótipo deve ser um objeto. Se você tentar atribuir um objeto protótipo ao próprio Object.prototype
, isso gerará uma exceção. Podemos usar esses dois comportamentos para detectar se a poluição do protótipo foi bem-sucedida:
Quando uma aplicação inclui um objeto em sua resposta, criar um atributo com um nome incomum junto com __proto__
pode ser revelador. Especificamente, se apenas o atributo incomum for retornado na resposta, isso pode indicar a vulnerabilidade da aplicação:
Além disso, em cenários onde uma biblioteca como Lodash é empregada, definir uma propriedade tanto via poluição de protótipo (PP) quanto diretamente dentro do objeto oferece outra abordagem diagnóstica. Se tal propriedade for omitida da resposta, isso sugere que Lodash está verificando a existência da propriedade no objeto alvo antes de mesclar:
Há uma opção no Express que permite criar objetos a partir de parâmetros de string de consulta. Você definitivamente poderia usá-la em uma cadeia de bugs para explorar uma vulnerabilidade de poluição de protótipo.
?foo.bar=baz
cria um objeto no Node.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)