¿Cómo omitir la función htmlentities () en PHP para obtener un XSS?

1

Aquí está la función de filtro PHP con la que estoy tratando:

function xss_check_2($data)
  {
    return htmlentities($data, ENT_QUOTES);
  }

El código fuente de la salida (la salida es el nombre, Peter Wazinck, en la parte inferior):

<div id="main">

<h1>HTML Injection - Reflected (GET)</h1>

<p>Enter your first and last name:</p>

<form action="/work/bwapp/bWAPP/htmli_get.php" method="GET">

    <p><label for="firstname">First name:</label><br>
    <input id="firstname" name="firstname" type="text"></p>

    <p><label for="lastname">Last name:</label><br>
    <input id="lastname" name="lastname" type="text"></p>

    <button type="submit" name="form" value="submit">Go</button>  

</form>

<br>
Welcome Steve Wozniak
</div>

¿Algún método para evitarlo?

    
pregunta Yacine 21.12.2017 - 20:43
fuente

2 respuestas

3

Desde el contexto que proporcionó, este filtro parece seguro.

Su salida está en el estado de datos (fuera de cualquier etiqueta o valor de atributo). Por lo tanto, un atacante tendría que inyectar al menos un corchete de ángulo de apertura ( < ) para introducir un nuevo código HTML.

Desde htmlentities() convierte todos los corchetes de ángulo de apertura a su representación de entidad HTML ( &lt; ) , no hay una manera obvia de omitir el filtro.

    
respondido por el Arminius 21.12.2017 - 21:07
fuente
0

En la aplicación bWAPP hay 2 conjuntos (3 conjuntos realmente) de protecciones XSS. Nivel 2 y Nivel 3.

function xss_check_2($data)
{

    // htmlentities - converts all applicable characters to HTML entities

    return htmlentities($data, ENT_QUOTES);


}


function xss_check_3($data, $encoding = "UTF-8")
{
    // htmlspecialchars - converts special characters to HTML entities    
    // '&' (ampersand) becomes '&amp;' 
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'  

    return htmlspecialchars($data, ENT_QUOTES, $encoding);

}

Si observa los filtros de nivel 3, están configurando la codificación $ en UTF-8 que invalida UTF-7 y otros tipos de codificaciones. Es posible que desee buscar las otras codificaciones en el Nivel 2 para ver si puede encontrar una derivación de filtro que funcione para usted.

    
respondido por el Moses Renegade 11.01.2018 - 21:26
fuente

Lea otras preguntas en las etiquetas