米斯特白帽培训讲义 漏洞篇 XSS

    跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS 。恶意攻击者往 Web 页面里插入恶意 JavaScript 代码,当用户浏览器该页之时,嵌入 Web 页面里的代码会被执行,从而达到恶意攻击用户的目的。

    Payload 的中文含义是有效载荷,在 XSS 中指代攻击代码或攻击语句。

    常见的 Payload 有:

    • 弹出网站 Cookie
      • <script>alert(document.cookie)</script>
      • <img src=0 onerror=alert(document.cookie)>

    分类

    总共有三种

    • 反射型:Payload 经过后端,不经过数据库

    • DOM:Payload 不经过后端

    非持久化,需要欺骗用户点击链接才能触发 XSS 代码(数据库中没有这样的页面和内容)。Payload 一般存在于 URL 或者 HTTP 正文中,需要构造页面,或者构造 URL。

    将这段代码保存为xss.php

    我们看到,这段代码中首先包含一个表单,用于向页面自己发送 GET 请求,带一个名为xss的参数。 然后 PHP 会读取该参数,如果不为空,则直接打印出来,我们看到这里不存在任何过滤。也就是说,如果xss中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。

    我们部署好这个文件,访问http://localhost/xss.php,如图:

    漏洞篇 XSS - 图1

    我们直接输入一个 HTML 代码,比如,之后点击test

    我们可以看到弹窗,也就是我们输入的 HTML 代码被执行了。

    之后我们查看元素,这表明,我们输出的内容直接插入到了页面中,解释为<script>标签。

    漏洞篇 XSS - 图2

    我们可以自定义弹窗中的内容来利用 XSS,比如改成alert(document.cookie)

    从上面的例子中,我们可以看出,反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器。

    原理:存储型

    持久化,代码储存在数据库中。如在个人信息或发表文章等地方,假如代码,如果没有过滤或过滤不严,那么这些代码将储存到数据库中,用户访问该页面的时候出发代码执行。这种 XSS 比较危险,容易造成蠕虫,盗窃 Cookie 等。

    这里我们把xss.php内容改为(同时数据库中需要配置相应的表):

    可以看到,用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。

    我们新建res.php,内容为:

    该代码从数据库读取了之前插入的内容,并将其显示出来。

    我们部署之后首先查看test数据库,确认它是空的:

    然后访问,像之前一样输入 HTML 代码并点击test,如下:

    漏洞篇 XSS - 图3

    点击之后却发现没有任何动静,但事实上,我们的数据已经插入到了数据库中。

    那么,当我们访问res.php查询这个值的时候,代码就会被执行。

    漏洞篇 XSS - 图4

    所以说,存储型 XSS 的执行位置通常不同于输入位置。我们可以看出,存储行 XSS 的数据流向是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。

    我们可能需要通过 XSS 来获得用户 Cookie 或其他有用信息,利用平台负责接收并保存这些信息。另外,利用平台能够托管利用脚本,于是我们可以向页面只注入一个脚本链接,使长度极大缩短。

    这里的 XSS 利用平台使用 xsser.me,大家可以自行下载和搭建。

    首先访问主页,你会看到一个登录页面,输入用户名和密码之后点击“登录”:

    成功之后会显示主界面,左边是模块列表,右边是项目列表:

    漏洞篇 XSS - 图5

    名称和描述可以随便取,不影响使用。输入时候点击“下一步”按钮。之后会出现“配置代码”界面:

    漏洞篇 XSS - 图6

    我们只选择默认模块,把它展开之后,我们可以看到它的作用是向平台发送一个请求,来收集用户的各种信息。之后点击“下一步”。

    然后我们会在首页看到我们的新项目,点击这个项目:

    漏洞篇 XSS - 图7

    之后点击右上方的查看代码,就可以看到使用方法:

    漏洞篇 XSS - 图8

    简单来说,MyzcXv?1467719328就是平台所生成的脚本地址,你可以把它放在script或者img标签的src属性中,在把标签插入存在 XSS 漏洞的地方,然后浏览器就会执行。

    下面我们点击之前创建的aaa项目。

    我们把注入到反射型 XSS 的演示页面中。

    漏洞篇 XSS - 图9

    提交之后页面没什么动静,但是我们查看利用平台,可以发现新增了一条数据:

    附录: