为什么这不是xss易受攻击?

时间:2013-11-22 20:36:31

标签: javascript xss

我正在尝试为自己制作一个小型的XSS演示版,但它没有按预期工作。我有一个输入框和一个按钮。单击该按钮可在div中显示输入框的值。这是我为onclick写的回调:

var showInput = function()
{
var field = document.getElementById("field1");
var box = document.getElementById("displayArea");
box.innerHTML = field.value;
}

当我在框中输入< script>alert("XSS!");< /script>并单击按钮时,没有显示任何内容,也没有任何反应。我理解XSS错了吗?任何人都可以给出一个易受攻击的简单例子吗?

3 个答案:

答案 0 :(得分:4)

分配到.innerHTML不会执行<script>标记。要动态创建脚本,您必须使用document.createElement('script')

var script = document.createElement('script');
script.innerHTML = field.value;
box.appendChild(script);

DEMO

答案 1 :(得分:2)

这只是在“临时”页面中插入代码而不会执行它。如果您重新加载页面,它将不再在页面源中。 如果你希望这个工作,你可以尝试用一个简单的PHP代码:

xss.php

<?php
echo $_GET['xss'];
?>

然后,如果您使用js代码作为get参数访问此页面,它将执行代码:

localhost/xss.php?xss=<script>alert('XSS!');</script>

这样可行,因为在实际呈现脚本之前,脚本将“插入”页面。

答案 2 :(得分:1)

您的原始代码仍然具有基于DOM的XSS。现代浏览器在分配给innerHTML时不会执行脚本标记。但是,它们仍然可以通过事件处理程序来处理。例如,如果您的输入是:<img src=nonexistent onerror=alert(1)>,那么您将获得一个正如您所期望的弹出窗口。