什么是跨站脚本攻击?

32

这个网站存档快照)的“XSS理论”部分中,它说:

黑客会将恶意的客户端脚本注入到合法的网页中

我第一次阅读时的问题是:如果应用程序部署在一个安全的服务器上(例如银行),黑客如何访问到网页的源代码?还是说他/她可以在不访问源代码的情况下注入恶意脚本?


1
可能是什么是跨站点脚本包含(XSSI)?的重复。 - Ken White
3个回答

74

跨站脚本攻击可以感染HTML文档而不必感染 web服务器 本身。XSS攻击利用服务器作为载体将恶意内容呈现给客户端,要么立即通过请求(反射攻击),要么通过存储和检索延迟呈现(存储型攻击)。

XSS攻击利用服务器在生成页面时的弱点,使得请求数据以原始形式出现在响应中。该页面仅反映了请求中提交的内容...但是该请求的内容可能包含打破普通文本内容并引入开发人员未预期的HTML或JavaScript内容的字符。

以下是一个快速示例。假设您拥有某种模板语言来制作HTML页面(比如PHP、ASP、CGI、Velocity或Freemarker脚本)。它使用以下页面,并将“<?=$name?>”替换为“name”查询参数的未转义值。

<html>
<head><title>Example</title></head>
<body>Hi, <?=$name?></body>
</html>

有人使用以下URL调用该页面:

http://example.com/unsafepage?name=Rumplestiltskin

应该期望看到这个消息:

Hi, Rumplestiltskin

使用更恶意的内容调用同一页面可用于大幅更改页面或用户体验。

http://example.com/unsafepage?name=Rumplestiltskin<script>alert('Boo!')</script>

这个URL不仅会显示"Hi,Rumplestiltskin",还会弹出一个显示"Boo!"的警告框。当然,这只是一个简单的例子。可以提供一个复杂的脚本来捕获按键或要求输入用户名和密码进行验证,或者清除屏幕并以惊人的内容完全重写页面。它看起来仍然像来自example.com,因为页面本身确实如此,但是内容是在请求中提供的,并作为页面的一部分反映回来。

因此,如果页面只是返回由请求者提供的内容,并且您正在请求该页面,那么黑客如何感染您的请求呢?通常,这是通过在网页上或通过电子邮件向您发送链接或在URL缩短请求中提供链接来完成的,因此很难在URL中看到混乱的内容。

<a href="http://example.com?name=<script>alert('Malicious content')</script>">
Click Me!
</a>
一个存在可利用的 XSS 漏洞的服务器本身并不运行任何恶意代码——它的编程保持不变——但可以被制作成为向客户端提供恶意内容的服务。

我曾经错误地认为,在公司内部网络中,只有在尝试访问不同域名下的网站(在同一家公司内)时才会出现XSS问题。但事实上,XSS问题可能随时发生。即使我尝试访问像http://localhost:8080/someservlet这样的内容。 - Victor
你的新理解是正确的。你描述了一个有效的危险。XSS最初只影响你正在访问的页面,但你注入的新内容可以将你重定向到任何地方——当那个地方是你已经认证过的地方时,这种情况尤其危险。 - phatfingers
@SurajJain,您正在描述“存储攻击”与“反射攻击”。两者都是XSS,在两种情况下,服务器被用作向远程客户端传递恶意有效载荷的向量,但服务器本身从未被设计为运行任何它不应运行的指令。 - phatfingers
@phatfingers 我明白这是存储攻击,假设我在这个网站上添加了一些注释和恶意脚本,现在谁看到它都会受到影响,而服务器正在发送它从未打算发送的内容,这就是我的意思。 - Suraj Jain
@SurajJain 这与将感染的二进制文件上传到下载站点类似。它可以忠实地传递比特流,无论是作为页面还是下载文件,而不会被内容感染。(为了公平起见,原作者确实将其描述为感染的“网页”,而不是感染的“Web服务器”。) - phatfingers
显示剩余2条评论

5

攻击者不需要访问源代码。

一个简单的例子是将包含脚本标签的URL参数写入页面。您可以更改URL参数以包含脚本标签。

另一个例子是评论系统。如果网站没有正确地对输入/输出进行清理,攻击者可以向评论中添加脚本,然后会在任何查看该评论的人的计算机上显示并执行脚本。

这些只是简单的例子。实际上,有很多不同类型的XSS攻击,并且涉及很多内容。


4

最好将脚本想象为注入到糟糕编码的网页和客户端网络浏览器之间对话的中间。它实际上没有注入到网页的代码中,而是注入到传输给客户端浏览器的数据流中。

XSS攻击有两种类型:

  1. 非持久性:这是一种特别制作的URL,它将脚本嵌入到目标页面的其中一个参数中。这个有问题的URL可以通过电子邮件发送给接收者,以欺骗其点击。目标页面处理参数时出现问题,无意中将最初通过URL字符串传递的代码发送到客户机器。
  2. 持久性:此攻击使用一个站点上保存表单数据到数据库但未正确处理输入数据的页面。恶意用户可以将一个有害脚本嵌入到典型数据字段(如姓氏)中,并在客户端的网络浏览器上运行,而不知情。通常,有害脚本会被存储到数据库中,并在每个客户端访问受感染页面时重新运行。

请参见以下示例:什么是跨站脚本攻击(XSS)?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接