Dom

Bajo

Entramos en la ultima prueba de XSS que es el DOM, en la cual nos encontramos un select

el cual al hacer click nos genera la siguiente url

http://localhost/vulnerabilities/xss_d/?default=French

Como en el reflejado vamos a vamos a probar el ataque básico de alert en la url a ver que sucede.

http://localhost/vulnerabilities/xss_d/?default=French<script>alert("low")</script>

Y vemos que el ataque tiene efecto.

Medio

Vamos al nivel medio y como siempre empezamos a probar por el ataque mas sencillo y vemos que no funciona.

Si nos fijamos en el código, vemos que usa stripos que encuentra la posición de la primera aparición de un substring en un string sin considerar mayúsculas ni minúsculas; por lo que al usar el tag script, nos redirecciona a la url por defecto.

    # Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    }

Como hemos visto en otro ejemplo de XSS, vamos a utilizar los eventos de HTML, por lo que probamos la siguiente url

English<img src=x onerror=alert("medium")>

Quedándose como en el anterior caso, pero vamos a inspeccionar el elemento por si sucedió algo.

Podemos observar que, el código que insertamos en la URL se nos ha metido dentro del option, por lo que tenemos que cerrar el option y el select para que lo escriba fuera.

English"></option></select><img src=x onerror=alert("medium")>

Al hacer esto observamos que la inyección de código a sido exitosa.

Alto

Vamos con el ultimo nivel de XSS, si probamos todos los ataques anteriores vemos que el select ni se entera de que esta pasando.

Si nos fijamos en el código, observamos que comprueba con un switch si es un valor valido.

  switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }

En las URLs existen las anclas que se utilizando usando #. La parte que se se encuentra posterior a la # no se envía al servidor, por lo que no se puede filtrar.

http://localhost/vulnerabilities/xss_d/?default=English#dvwa

Al probar la anterior url nos encontramos con que se pinta en el select

Esto es debido a una mala programación del JavaScript que renderiza la página.

if (document.location.href.indexOf("default=") >= 0) {
    var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
    document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
    document.write("<option value='' disabled='disabled'>----</option>");
}

Que como vemos pinta tal cual llega de la URL lo que hay en default, por lo que si ejecutamos la siguiente URL

http://localhost/vulnerabilities/xss_d/?default=English#<script>alert("high")</script>

Conseguimos realizar el ataque.

Last updated