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.
<?php
header('Content-Type: text/html; charset=UTF-7'); ?>
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:
<script>alert(/XSS/);</script>
Ahora si lo convertimos en utf7 antes de enviar nos queda así:
+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:
<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:
<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='xPuedes encontrar la información acá:
http://us3.php.net/htmlentitiesExample #1 Un ejemplo de htmlentities()
<?php
$str = "A 'quote' is <b>bold</b>";
// Outputs: A 'quote' is <b>bold</b>
// Outputs: A &#039;quote&#039; is <b>bold</b>
?>
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.