2010-08-10 6 views
40
<!DOCTYPE root [ 
<!ENTITY ha "Ha !"> 
<!ENTITY ha2 "&ha; &ha;"> 
<!ENTITY ha3 "&ha2; &ha2;"> 
<!ENTITY ha4 "&ha3; &ha3;"> 
<!ENTITY ha5 "&ha4; &ha4;"> 
... 
<!ENTITY ha128 "&ha127; &ha127;"> 
]> 
<root>&ha128;</root> 

supuestamente esto se llama ataque de DoS de billones de risa.¿Cómo funcionan las mil millones de ataques XML DoS?

¿Alguien sabe cómo funciona?

+12

Se debe migrar a BufferOverFlow ... http: //en.wikipedia.org/wiki/Billion_laughs – codingbadger

+8

debes migrar a barryoverflow –

+0

Pruébalo en Firefox 48 SVG para bloquear tu computadora :-) https://bugzilla.mozilla.org/show_bug.cgi?id=798374 –

Respuesta

46

El ataque Billion Laughs es un ataque de denegación de servicio que se dirige a los analizadores XML. El ataque de Billion Laughs también se conoce como una bomba XML, o más esotéricamente, el ataque de expansión de entidad exponencial. Se puede producir un ataque de Billion Laughs incluso cuando se usa XML bien formado y también se puede aprobar la validación de esquema XML.

El ataque vanilla Billion Laughs se ilustra en el archivo XML representado a continuación.

<?xml version="1.0"?> 
<!DOCTYPE lolz [ 
<!ENTITY lol "lol"> 
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> 
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> 
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> 
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> 
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> 
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> 
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> 
]> 
<lolz>&lol9;</lolz> 

En este ejemplo, hay 10 entidades XML diferentes, lol-lol9. La primera entidad, lol se define como la cadena “lol”. Sin embargo, cada una de las otras entidades se define como 10 de otra entidad. La sección de contenido del documento de este archivo XML contiene una referencia a una sola instancia de la entidad lol9. Sin embargo, cuando esto es analizado por un analizador DOM o SAX, cuando se encuentra lol9, se expande a 10 lol8 s, cada uno de los cuales se expande a 10 lol7 s, y así sucesivamente. En el momento en que todo se expande al texto lol, hay 100.000,000 instancias de la cadena "lol". Si hubiera una entidad más, o lol se definió como 10 cadenas de “lol”, habría un billón de "lol" s, de ahí el nombre del ataque. Huelga decir que esta gran cantidad de expansiones consume una cantidad exponencial de recursos y tiempo, lo que provoca el DOS.

Existe una explicación más extensa en mi blog.

+0

Me encanta la forma en que el sitio de su blog de seguridad intenta capturar el tráfico con su [historial y trucos de redirección] (http://blog.yoocare.com/how-to-remove-ib-adnxs-com-pop-ups-browser- redirect-virus-removal /);) – jww

+1

¿Qué? ¿Ningún ejemplo de CodePen? –

2

Escribe "¡Ja!" 2 veces.

+0

@zneak: cómo funciona hacer eso? –

+6

@I__: La entidad '&ha128;' se expande a dos entidades '&ha127;', que a su vez se expande a cuatro '&ha126;', que a su vez se expande a ocho '&ha125;', ... hasta que se expande a miles de millones de millones '&ha;', que se resuelve en 'Ha!'. – zneak

+0

¿me puede mostrar un tutorial que explica cómo funciona? –

18

Una de las bombas XML - http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

Un atacante puede ahora tomar ventaja de estas tres propiedades de XML (entidades de sustitución, entidades anidadas, y DTD en línea) para elaborar una bomba XML malicioso. El atacante escribe un documento XML con entidades anidadas al igual que el ejemplo anterior, pero en lugar de anidación sólo un nivel profundo, que anida sus entidades muchos niveles de profundidad ...

También hay código para proteger de estas "bombas "(en el mundo .NET):

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ProhibitDtd = false; 
settings.MaxCharactersFromEntities = 1024; 
XmlReader reader = XmlReader.Create(stream, settings); 
11

<!ENTITY ha "Ha !"> define una entidad, &ha; que se expande a "Ha !". La siguiente línea define otra entidad, &ha2; que se expande a "&ha; &ha;" y eventualmente, "Ha ! Ha !".

&ha3; se convierte en Ha ! Ha ! Ha ! Ha !, y así sucesivamente, doblando el número cada vez. Si sigue el patrón, es &haN;"Ha !", 2 N-1 veces, por lo &ha128, se expande hasta 2 "Ha !" s, que es demasiado grande para cualquier ordenador de manejar.

+0

Vaya, creo que dividí por dos en lugar de restar uno. –

Cuestiones relacionadas