title: XSS跨站脚本
tags: XSS
abbrlink: eb18e635
date: 2022-08-10 17:16:15

XSS跨站脚本

  • XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
  • XSS攻击是在网页中嵌入客户端恶意脚本代码,这些恶意代码一般是使用JavaScript语言编写的(也有使用ActionScript、.VBScript等客户端脚本语言编写的,但较为少见)。所以,如果想要深入研究XSS,必须要精通JavaScript。JavaScript能做到什么效果,XSS的威力就有多大。
  • JavaScript可以用来获取用户的Cookie、改变网页内容、URL调转,那么存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站,而攻击者需要做的仅仅是向Web页面中注入JavaScript代码。

主要分为三种类型:

  • 反射型
  • 存储型
  • DOM 型

XSS 危害

  • 盗取 Cookie
  • 盗取账户
  • 恶意软件下载
  • 键盘记录
  • 钓鱼欺骗
  • XSS蠕虫
  • 广告引流等等 JavaScript 能够写出的任意恶意功能

反射型

  • 反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,故称为反射型XSS。
  • 应用程序或 API 包括未经验证和未经转义的用户输入, 直接作为 HTML 输出的一部分。一个成功的攻击可以让攻击者在受害者的浏览器中执行任意的 HTML 和 JavaScript 。
  • 特点:非持久化,必须用户点击带有特定参数的链接才能引起。影响范围:仅执行脚本的用户。

跨站实例

<html>
<head>xss test</head>
<body>
<script>alert("xss")</script>
</body>
</html>
  • 这段代码使用alert函数来执行打开一个消息框,消息框中显示xss信息使用xss弹出恶意警告框,代码为:
<script>alert("xss")</script>
  • xss输入也可能是html代码段,如果使网页不停的刷新,代码为
<meta http-equiv="refresh" content="0;">
  • 嵌入其他网站链接的代码为:
<iframe src=http://xxxxx.com width=0 height=0></iframe>

存储型

  • 存储型xss比反射型跨站脚本更具威胁性,并且可能影响到web服务器的自身安全。
  • 此类XSS不需要用户点击特定的URL就能执行跨站脚本,攻击者事先讲恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意的代码的页面就会执行恶意代码。
  • 存储型 XSS 是指应用程序通过 Web 请求获取不可信赖的数据,在未检验数据是否存在 XSS 代码的情况下,便将其存入数据库。当下一次从数据库中获取该数据时程序也未对其进行过滤,页面再次执行 XSS 代码,存储型XSS 可以持续攻击用户。

存储型 XSS 出现位置

  • 留言板
  • 评论区
  • 用户头像
  • 个性签名
  • 博客

DOM 型

  • DOM 模型用一个逻辑树来表示一个文档,每个分支的终点都是一个节点 (node),每个节点都包含着对象(objects)。DOM 的方法(methods)让你可以用特定方式操作这个树,用这些方法你可以改变文档的结构、样式或者内容。
  • DOM 型 XSS 其实是一种特殊类型的反射型 XSS,通过 JS 操作 DOM 树动态地输出数据到页面,而不依赖于将数据提交给服务器端,它是基于 DOM 文档对象模型的一种漏洞。

与反射型的异同点和危害

  1. 同:
    都是没有控制好输入,并且把 javaScript 脚本 输入作为输出插入到HTML 页面。
  2. 异:
    反射型 XSS 是经过后端语言后,页面引用后端输出生效。DOMXSS 是经过 JS 对 DOM 树直接操作后插入到页面。
  3. 危害性:
    前后端分离,不经过 WAF 的检测。

手工挖掘XSS

<script>alert(1)</script>
'"><script>alert(1)</script>
<img/src=@ onerror=alert(1)/>
'"><img/src=@ onerror=alert(1)/>
  • 在闭合标签的时候要注意闭合优先策略

闭合优先的标签

这些标签都是闭合优先级高于双引号完整性优先级的特殊标签。

<!--
<iframe>
<noframes>
<noscript>
<script>
<style>
<textarea>
<title>
<xmp>

防御方式

  • 对用户的输入进行合理验证,对特殊字符(如<、>、’、”等)以及 <script>javascript 等进行过滤。
  • 采用 OWASP ESAPI 对数据输出 HTML 上下文中不同位置(HTML 标签、HTML属性、JavaScript 脚本、CSS、URL)进行恰当的输出编码。
  • 设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行 Cookie 劫持攻击。在 Java EE中,给 Cookie 添加 HttpOnly 的代码如下:
    java:
    cookie.setHttpOnly(true);
    
    python:
    tools.sessions.httponly = True
    
    php:
    session.cookie_httponly =1