跨站脚本攻击可以感染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 漏洞的服务器本身并不运行任何恶意代码——它的编程保持不变——但可以被制作成为向客户端提供恶意内容的服务。攻击者不需要访问源代码。
一个简单的例子是将包含脚本标签的URL参数写入页面。您可以更改URL参数以包含脚本标签。
另一个例子是评论系统。如果网站没有正确地对输入/输出进行清理,攻击者可以向评论中添加脚本,然后会在任何查看该评论的人的计算机上显示并执行脚本。
这些只是简单的例子。实际上,有很多不同类型的XSS攻击,并且涉及很多内容。
最好将脚本想象为注入到糟糕编码的网页和客户端网络浏览器之间对话的中间。它实际上没有注入到网页的代码中,而是注入到传输给客户端浏览器的数据流中。
XSS攻击有两种类型:
请参见以下示例:什么是跨站脚本攻击(XSS)?