【问题标题】:XSS attack not working in textarea tagXSS 攻击在 textarea 标签中不起作用
【发布时间】:2014-03-12 16:08:11
【问题描述】:

我之前使用 PHP 和 AJAX 编写了一个简单的聊天应用程序。这样,一旦用户发送聊天,它首先会转到 php,然后从那里保存在数据库中。我在客户端使用 AJAX 定期查询数据库以获取新消息。我最终在 .

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

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

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

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

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

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

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

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

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

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

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

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

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

感谢您的回复

【问题讨论】:

  • $('#received') 是如何原来设置的?这里可能发生 XSS 攻击。
  • 这是我唯一设置 $('#received').最初在 html 中,
  • 听起来应该没问题,然后假设像 value['chattime'] 这样的调用是对 JSON 对象的访问。

标签: javascript jquery html ajax xss


【解决方案1】:
  1. 您的攻击失败了,因为您正在设置 textarea 的 value 属性。浏览器会自动为您转义字符。想一想,当你在 textarea 上写字时,写 &lt;/textarea&gt; 并不会关闭它。通过javascript设置值是一样的。
  2. 如果您希望这次攻击成功,您必须将$('#received').val(recMsg + $('#received').val()); 更改为$('#received').html(recMsg + $('#received').html());。这将更改文本区域的innerHTML 属性。虽然我不确定它会正常工作。你必须尝试一下。
  3. 浏览器的“查看源代码”选项仅显示您从服务器下载的内容。如果您想查看实时更改,您需要打开他们的开发者工具(通常按F12)。您将看到一个包含整个 DOM 树及其样式属性的检查器。

【讨论】:

  • 2.如果说纯 JS,那就行不通了。由于它解析字符串和创建节点的方式,jQuery 将不幸地调用脚本。
  • 将其更改为 .html 在 chrome 和 firefox 上都能完美运行。这正是我想要的。只是想知道,这是 value 和 html 之间的唯一区别吗?
  • 没有。所有元素都有一个 innerHTML 属性,该属性包含在其标签内的 HTML 代码中。但只有一些元素(表单域)具有value 属性。 value 在屏幕上的显示方式取决于控件的类型。它可以是文本,可以是日期,可以是选择,也可以什么都不是(例如,在复选框中)。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2022-01-08
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多