Te cuento lo que sucede,
Cuando una aplicación wb está utilizando una codificación UTF-7 puedes hacer el bypass o sea poder escribir código html dentro del sitio web siempre y cuando te permita escribir en el como por ejemplo un buscador y cosas así donde lo que tu escribas quede reflejado en ese sitio.
Si en este ejemplo lo pones en un servidor puedes ver que te envía una cabezera UTF-7 asi que toda la codificación del sitio web estará en UTF-7.
Probamos..
Pedimos: test.php?buscar=<script>alert(/XSS/);</script>
Nos debuelve:
Ahora si lo convertimos en utf7 antes de enviar nos queda así:
Pedimos: test.php?buscar=+ADw-script+AD4-alert(/XSS/)+ADsAPA-/script+AD4-
Nos debuelve:
Pero solo sirven con sitios que declaren en sus cabezeras que están haciendo uso del UTF-7.
Ahora como dice sdc también es importante ver como está hecho el sitio antes de sacar conclusiones porque por ejemplo talves filtra las comillas dobles y las simples no y talves para encerrar sus variables html hace uso de comillas dobles y puede causar un xss como por ejemplo:
En este caso aunque esté haciendo uso de utf8 podrá causarse un xss escapando con las comillas simples:
test.php?nombre=x' onload(/xss/) id='x
Puedes encontrar la información acá:
http://us3.php.net/htmlentities
Si te fijas en el caso de no declarar ENT_QUOTES estás dejando libre las comillas simples y es un error muy común.
Yo recomendaría hacer uso de htmlspecialchars($texto, ENT_QUOTES) previniendo este tipo de ataques aunque un buén uso de htmlentities debería dar casi el mismo resultado.
Cuando una aplicación wb está utilizando una codificación UTF-7 puedes hacer el bypass o sea poder escribir código html dentro del sitio web siempre y cuando te permita escribir en el como por ejemplo un buscador y cosas así donde lo que tu escribas quede reflejado en ese sitio.
Código (php) [Seleccionar]
<?php
header('Content-Type: text/html; charset=UTF-7');
echo htmlentities($_GET['buscar']);
?>
Si en este ejemplo lo pones en un servidor puedes ver que te envía una cabezera UTF-7 asi que toda la codificación del sitio web estará en UTF-7.
Probamos..
Pedimos: test.php?buscar=<script>alert(/XSS/);</script>
Nos debuelve:
Citar<script>alert(/XSS/);</script>
Ahora si lo convertimos en utf7 antes de enviar nos queda así:
Código (php) [Seleccionar]
<?php echo mb_convert_encoding('<script>alert(/XSS/);</script>', 'UTF-7'); ?>
Citar+ADw-script+AD4-alert(/XSS/)+ADsAPA-/script+AD4-Tomamos eso y lo enviamos al script vulnerable:
Pedimos: test.php?buscar=+ADw-script+AD4-alert(/XSS/)+ADsAPA-/script+AD4-
Nos debuelve:
Citar<script>alert(/XSS/);</script>
Pero solo sirven con sitios que declaren en sus cabezeras que están haciendo uso del UTF-7.
Ahora como dice sdc también es importante ver como está hecho el sitio antes de sacar conclusiones porque por ejemplo talves filtra las comillas dobles y las simples no y talves para encerrar sus variables html hace uso de comillas dobles y puede causar un xss como por ejemplo:
Código (php) [Seleccionar]
<input type='test' value='<?php echo htmlentities($_GET['nombre']); ?>' />
En este caso aunque esté haciendo uso de utf8 podrá causarse un xss escapando con las comillas simples:
test.php?nombre=x' onload(/xss/) id='x
Puedes encontrar la información acá:
http://us3.php.net/htmlentities
Citar
Example #1 Un ejemplo de htmlentities()Código (php) [Seleccionar]<?php
$str = "A 'quote' is <b>bold</b>";
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities($str);
// Outputs: A &#039;quote&#039; is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>
Si te fijas en el caso de no declarar ENT_QUOTES estás dejando libre las comillas simples y es un error muy común.
Yo recomendaría hacer uso de htmlspecialchars($texto, ENT_QUOTES) previniendo este tipo de ataques aunque un buén uso de htmlentities debería dar casi el mismo resultado.