Как выполнить простую 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 <script>alert(document.cookie)</script>
, но не повезло.
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