定义与原理

XSS全称是Cross Site Scripting,中文为跨站脚本攻击,为了和CSS(层叠样式表(Cascading Style Sheets,CSS))区分命名为XSS。

XSS的原理:在HTML页面中注入恶意脚本,当目标网站目标用户的浏览器渲染HTML文档时,恶意脚本执行,使得黑客可以控制用户浏览器。

一个简单的例子:

有一个网页,会将用户输入的内容回显在页面上。

如果我们在该网页输入如下脚本,脚本的作用就是弹出一个对话框显示用户的Cookie信息。

1
<script>alert(document.cookie);</script>

如果目标服务器没有对这个输入进行检验就直接将其显示在页面上的话,则会生成如下形式的页面代码:

1
2
3
<html>
<script>alert(document.cookie);</script>
</html>

可以看到,这段脚本已经成功嵌入到该页面当中。

当受害浏览器访问这个页面的时候,这段脚本也将被认为是页面的一部分,从而被执行,即弹出对话框显示受害浏览器的Cookie信息。

分类

根据效果的不同,XSS攻击主要可以分为以下几类:

反射型XSS(非持久型XSS)

  1. 原理

    一般情况下,黑客发送给别人发送带有恶意脚本代码参数的 url ,当用户打开这个带有恶意代码参数的 url 地址时,恶意脚本代码作为输入提交到服务器端,服务器端解析后响应,恶意代码被目标服务器通过错误信息、搜索结果等等方式“反射”回显在用户的浏览器上,浏览器解析执行XSS代码。

    场景:一般会出现在查询类页面等。

    这种网站一般会显示用户的输入,用户点开会恶意代码参数就会显示在网站上并执行。

  2. 特点

    • 非持久性。攻击脚本不会写入网站的数据库,是一次性的攻击。所以黑客一般需要诱骗用户点击包含攻击脚本的 URL,才能攻击成功。
    • 需要传递给服务器,通过服务器反射恶意脚本
  3. 例子

    假设网站有一个搜索功能,该功能接收URL参数中用户提供的搜索词:

    1
    https://insecure-website.com/search?term=gift

    网站在对这个URL的响应中,回显用户提供的搜索词

    假设应用程序不对数据进行任何其他处理,攻击者就可以构造如下的url:

    1
    https://insecure-website.com/search?term=<script>/*+Bad+stuff+here...+*/</script>

    其他用户访问这个url的时候,对应渲染出来的html应该为:

    1
    2
    3
    <p>
    You searched for: <script>/* Bad stuff here... */</script>
    </p>

    用户的浏览器就会执行script内部的恶意代码

存储型XSS(持久型XSS)

  1. 原理

    黑客利用XSS 漏洞,将内容经正常功能提交进入目标服务器端的数据库中并持久保存。当正常用户请求目标页面时,前端页面获得后端从数据库中读出的注入代码,恰好将其渲染执行。

    场景:一般存在于 Form 表单提交等交互功能,如发帖留言,注册页面等。

  2. 特点

    • 稳定性:恶意脚本存入网站服务器端
  3. 例子

    黑客写下一篇包含有恶意JavaScript 代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的JavaScript代码。

DOM-based型XSS

  1. 原理

    从效果来看,DOM-based型XSS也属于反射型,但是其形成的原因比较特殊,所以单独拿出来介绍。

    通过DOM操作前端代码输出的时候形成的XSS为DOM-based型XSS

    客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行。

    场景:一般产生于用户能够进行参数输入查询的地方

    网站本地执行url中的参数而并不传给服务器

  2. 特点

    • 不与后台服务器产生数据交互
    • 无法从服务器端进行防御。因为构造的url中的恶意代码参数并不传给服务器,而是客户端获得DOM中的数据直接在本地执行,服务器无法检测到。
    • 通过客户端脚本在浏览器端触发
  3. 例子

    有一个网站,包含一个搜索框,用户输入关键字并点击搜索按钮,搜索结果会显示在页面上。网站使用JavaScript来获取URL中的搜索词并将其显示在页面上

    img

    可以看到网站直接通过document.write从url中提取参数并将参数打印在网页上,而并没有将参数传给服务器

    构造url:

    1
    http://example.com/#<script>alert('XSS')</script>

    用户访问该url时直接本地执行xss代码

XSS攻击学习平台

  • Attack API
  • BeEF
  • XSS-Proxy