XSS攻击无法在textarea标记中工作

时间:2014-03-12 16:08:11

标签: javascript jquery html ajax xss

我之前使用PHP和AJAX编写了一个简单的聊天应用程序。在那里,一旦用户发送聊天,它首先进入php并从那里保存在数据库中。我在客户端使用AJAX定期查询数据库以获取新消息。那些我最终在展示的消息。

所以在我的客户端代码中,我有一个recMsg变量,我将其设置为

recMsg = recMsg + value['chattime'] + ' <@' + value['chatby'] + '> ' + value['chat'] + '\r\n';

其中value是具有值['chat']的数组,其中包含实际的聊天消息。

稍后我将文本区域设置如下

$('#received').val(recMsg + $('#received').val());

其中received是标签的id。 textarea的代码(当我在浏览器中查看源代码时)是

<textarea id="received" rows="15" cols="150"></textarea>

现在尝试xss攻击,我输入以下内容作为我的聊天

</textarea>
<script>
alert("Hi");
</script>
<textarea>

但它没有向我显示一个警告框,而是在textarea中显示完整的消息以及标签(它不会将任何标签视为特殊标签,只是将它们视为要显示的普通文本)。我尝试更改javascript,这样recMsg只是聊天消息,并尝试使用.innerHTML但没有成功。

所以我的问题是 1)攻击失败是因为我在渲染后改变了textarea的值吗?

2)是否可以以这种方式执行XSS。如何更改javascript代码以启用此攻击?

3)无关的问题 - 当我使用AJAX更改DOM元素时,如果我查看源代码,我看不到任何更改(例如,在我收到几个聊天后,textarea仍然是空的)。有这种情况的原因是什么?

感谢您的回复

1 个答案:

答案 0 :(得分:4)

  1. 您的攻击失败,因为您正在设置textarea的value属性。浏览器会自动为您转义字符。想一想,当你在textarea上写字时,写</textarea>并不会关闭它。通过javascript设置值是一样的。
  2. 如果您希望此攻击成功,则必须更改$('#received').val(recMsg + $('#received').val()); $('#received').html(recMsg + $('#received').html());。这将更改textarea的innerHTML属性。虽然我不确定它是否能正常工作。你必须尝试一下。
  3. 选项查看源代码&#39;浏览器只显示您从服务器下载的内容。如果要查看实时更改,则需要打开其开发人员工具(通常按F12)。您将看到一个检查器,其中包含整个DOM树及其样式属性。