Как выполнить простую XSS-атаку на основе DOM

Вот мой index.html (уязвимый):

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
  </head>
<script>
    document.write("<form><select>"); 

    document.write("<option value=1>" + 
    document.location.href.substring(document.location.href.indexOf("default=") + 8)
+ "</option>");

    document.write("<option value=2> French </option>");

    document.write("</select> </form>");
    document.write(document.location.href);
</script>
  <body>

  </body>

</html>

Предполагается получить язык по умолчанию от ../index.html?default=English который установит язык по умолчанию на английский.

Я пытаюсь использовать ../index.html?default=<script>alert(document.cookie)</script> чтобы показать куки на экране, но браузер, кажется, кодировать > в %3E, Я также использовал \x3Cscript>alert(document.cookie)\x3C/script>, \x3Cscript\3Ealert(document.cookie)\x3C/script\3E and &lt;script&gt;alert(document.cookie)&lt;/script&gt;, но не повезло.

1 ответ

Решение

Ваш уязвимый код должен использовать decodeURIComponent по строке разбирается вне локации, чтобы атака сработала:

document.write("<option value=1>" + 
    decodeURIComponent(
        document.location.href.substring(
            document.location.href.indexOf("default=") + 8)) 
    + "</option>");

Было бы "разумно" (для кого-то, пишущего уязвимый код...) сделать это, потому что строка, исходящая из URL, может на законных основаниях содержать такие символы, как >,

Для демонстрации см. http://plnkr.co/edit/Vctoj7GOLMvlvhS98Mk4?p=preview

Другие вопросы по тегам