简介
XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。
每当应用程序的新网页中包含不受信任的、未经过恰当验证或转义的数据,或者使用可以创建JavaScript 的浏览器API 更新现有的网页时,就会出现XSS 缺陷。XSS 缺陷让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、污损网站或将用户重定向到恶意站点。
XSS攻击类型
1. 反射型 XSS
需要攻击者提前构造一个恶意链接,来诱使客户点击,
比如这样的一段链接:abc.com/?params=<script>alert(/xss/)</script>
反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:
<?php echo "<p>hello, $_GET['user']</p>";?>
,
那么在访问时设置 /?user=</p><script>alert("hack")</script><p>
,则可执行预设好的JavaScript代码。
反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。
2. 存储型(持久型) XSS
- 主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
3. DOM XSS
-
这种类型则是利用非法输入来闭合对应的html标签。
-
比如,有这样的一个a标签:
<a href='$var'></a>
当$var的内容变为' οnclick='alert(/xss/) //
这段代码就会被执行 -
例如
<html> <head> <title>DOM Based XSS Demo</title> <script> function xsstest() { var str = document.getElementById("input").value; document.getElementById("output").innerHTML = "<img src='"+str+"'></img>"; } </script> </head> <body> <div id="output"></div> <input type="text" id="input" size=50 value="" /> <input type="button" value="submit" onclick="xsstest()" /> </body> </html>
输入
x' onerror='javascript:alert(/xss/)
即可触发。
4.Blind XSS
Blind XSS是储存型XSS的一种,它保存在某些存储中,当一个“受害者”访问这个页面时执行,并且在文档对象模型(DOM)中呈现payload。 它被称为Blind的原因是因为它通常发生在通常不暴露给用户的功能上。
XSS 常见攻击方法
- 绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;
- 利用 HTML 标签的属性值进行 XSS 攻击。例如:
<img src="javascript:alert('xss')"/>
;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性) - 空格、回车和 Tab。如果 XSS Filter 仅仅将敏感的输入字符列入黑名单,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:
<img src="javas cript:alert(/xss/);"/>
; - 利用事件来执行跨站脚本。例如:
<img src="#" onerror= "alert(1)"/>
,当 src 错误的视乎就会执行 onerror 事件; - 利用 CSS 跨站。例如:
body {backgrund-image: url("javascript:alert('xss')")}
; - 扰乱过滤规则。例如:
<IMG SRC="javaSCript: alert(/xss/);"/>
; - 利用字符编码,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode;( JS 支持 unicode、eacapes、十六进制、十进制等编码形式);
- 拆分跨站法,将 XSS 攻击的代码拆分开来,适用于应用程序没有过滤 XSS 关键字符(如<、>)却对输入字符长度有限制的情况下;
- DOM 型的 XSS 主要是由客户端的脚本通过 DOM 动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致 DOM 型的 XSS 的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;
防御
对输入内容的特定字符进行编码
为了避免反射式或存储式的XSS漏洞,最好的办法是根据HTML输出的上下文(包括:主体、属性、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行恰当的转义
Http Only cookie , 许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。