关于对XSS原理分析与绕过总结

一、原理

该文章仅用于信息防御技术教学,请勿用于其他用途。

1、XSS原理

XSS(跨站脚本攻击)是一种常见的网络安全漏洞,攻击者通常会在网页中插入恶意的 JavaScript 代码。由于服务器对输入数据的过滤和验证不严格,这些恶意的 JavaScript 代码会被当作响应的一部分返回给客户端。当浏览器解析来自服务器的响应时,它会执行这些恶意的 JavaScript 代码,从而导致攻击者能够执行恶意操作。

二、解析及其解码

1、代码解析顺序

s1、DOM树的构建与HTML标记的解析

当浏览器收到来自服务端的代码后,会先进行DOM树的构建与HTML标记的解析。

先来说HTML标记的解析,HTML 标记包括开始和结束标记,以及属性名和值。如果文档格式良好,则解析它会简单而快速。解析器将标记化的输入解析到文档中,构建文档树。

在来说说DOM树的构建,DOM 树描述了文档的内容。元素是第一个标签也是文档树的根节点。树反映了不同标记之间的关系和层次结构。嵌套在其他标记中的标记是子节点(如下图的

,

标签等)。DOM 节点的数量越多,构建 DOM 树所需的时间就越长。当解析器发现非阻塞资源,例如一张图片,浏览器会请求这些资源并且继续解析,当解析到 标签时,浏览器会立即发起图像资源的请求,并开始下载图像。下载过程是异步进行的,即浏览器会继续解析和渲染HTML内容,而不会等待图像下载完成。
在这里插入图片描述

s2、对JavaScript代码的解析

在遇到JavaScript代码时,HTML解析器会暂停解析,并将控制权交给JavaScript引擎,执行JavaScript代码。一旦JavaScript代码执行完毕,HTML解析器会继续解析未解析的HTML内容。

这种行为称为"阻塞解析",因为HTML解析器会等待JavaScript代码执行完毕后才能继续解析后续的HTML内容。这意味着,如果JavaScript代码的执行时间过长,会导致页面加载的延迟。

为了改善页面加载性能,可以使用async或defer属性来加载JavaScript文件。当使用async属性时,浏览器会异步加载JavaScript文件,并继续解析HTML内容,不会阻塞解析。而使用defer属性时,浏览器会异步加载JavaScript文件,但会等到HTML解析完毕后再执行JavaScript代码,不会阻塞解析。

需要注意的是,当JavaScript代码执行时,如果该代码修改了DOM结构或样式,可能会触发浏览器重新构建DOM树和应用样式,从而导致页面的重绘和回流,影响页面的性能。

那么浏览器是怎么知道什么时候开始解析JavaScript代码?

正常在遇到

当浏览器遇到下面的两类会先进行HTML标记解析然后进行JavaScript解析,当HTML无法解析时就会来将控制权交给JavaScript引擎来执行JavaScript代码,假如JavaScript引擎也无法进行解析,那么这段代码就有问题了。

事件属性,例如onload,onerror等
URL协议,例如javascript伪协议等
这也就是为什么有时候在某个页面插入了XSS弹窗后,假如你不点击你的弹窗的相应的操作,某些元素就无法进行加载。

s3、对CSS代码的解析

在遇到CSS代码时,浏览器不会像JavaScript代码一样去停止HTML标记的解析,相反它会继续进行HTML代码的解析,并且将CSS代码交给CSS引擎来进行处理。
在这里插入图片描述

2、解码顺序

一般情况下,解码顺序是按照HTML实体化解码–>JavaScript解码进行的。

Q1、什么是HTML实体化解码?

如果服务器与客户端之间要传输某个特殊字符,像是<>,'等这类会被当做标签或者属性值等来解析的字符,为了避免歧义就需要使用到HTML实体化编码来进行编码了。

Q2、HTML编码的几种方式

别名形式:因为比较多可以见HTML 字符实体 (w3school.com.cn)
十六进制:像

就会被编码为<div>
十进制:上述标签在十进制会被编码为<div>
Q3、为什么需要JavaScript解码?

通过JavaScript编码,可以对特殊字符进行转义,防止数据在传输过程中产生语法错误或安全漏洞。例如,对于包含特殊字符(如引号、尖括号等)的数据,可以使用转义字符进行编码,以确保数据的完整性和安全性。

Q4、明明有了HTML实体化编码为什么是还需要JavaScript编码

在HTML进行解析的时候,遇到了

Q5、JS编码有哪些方式?

以\uxxxx,\UXXXXXXXX,\xXX都是JavaScript编码

但是注意:某些特殊字符不能够进行JavaScript编码,否则浏览器无法进行解析,如:

< > ’ " ( )
举个栗子:

在进行JavaScript编码后应该为: ,正确的应该是:

特别的: 当中包裹的标签将特殊字符进行编码时可以进行解析

在线工具见:在线编码转换工具(utf-8/utf-32/Punycode/Base64) - 编码转换工具 - 脚本之家在线工具 (jb51.net)

URL编码在进行GET传参的时候可以使用

三、XSS实战
1、基础XXS
基础的payload就这几种见如下表(当然还有很多,这里列出部分)

xss ..... 2、攻击场景 本着“见框就插”的原则,可以尝试一下,但是大多数情况下会被过滤,所以我们可以先进行fuzz来了解到哪些字符被过滤,哪些没有被过滤,然后因地制宜地插入合适的XSS。

当然也可以使用fuzz,分别插入大量的XSSpayload,根据回显的不同来挑出可用的payload。

3、攻击位置
留言板处、搜索框、个人资料等
这类通常是比较好进行插入的,直接在可以输入的地方直接输入payload即可。

Markdown编辑器
下面是一个Markdown当中插入超链接的一个操作。

Click Me

在转换为HTML代码后为

Click Me
下面是一个插入图片的Markdown语法,与上面不同的是下面的最前面会有一个感叹号

在转换为HTML代码后为

Click Me 第一种:使用伪协议进行超链接处XSS 直接进行插入此XSS代码会被解析为超链接,点击后就会弹窗。

a

在这里插入图片描述

按照Markdown语法进行插入(此处使用了反引号来代替了(),因为我测试了多个网站发现小括号不能被解析),此处可以见XSS编码绕过。

在这里插入图片描述

第二种、使用插入图片的方式插入XSS代码
对于图片的插入方式很明确,要么我们直接插入标签的XSSpayload,要么直接插入以Markdown形式的XSS

对于第一种来说,直接进行插入XXS代码

在这里插入图片描述

对于第二种来说,我们需要逃逸出src属性或者alt属性当中的双引号,然后直接在后面接上onerror等属性即可。

逃逸alt属性(暂时没有测试成功)

PDF XSS
有关于在pdf文档当中插入xss代码的步骤见下图

成功制作好PDF文件后,直接使用浏览器打开,就会弹窗(各个浏览器可能会不太一样)。

但是这不是我们最终的目的,在本地弹窗的意义不大,我们需要让某个网站在线解析或者打开我们制作好的PDF文件才可以,当然防御的方法就是用户在打开PDF文件时候,强制让用户在本地下载打开。

文件上传XSS
第一类:修改文件后缀
文件上传当中,修改后缀名为.html,.htm然后在文件内容当中插入XSS代码

1、如何进行攻击?

在进行文件上传时进行抓包
修改数据包当中文件后缀为html或者htm
在文件内容当中插入XSS语句
放包,观察弹窗
第二类:svg中写入XSS
当然如果网站支持svg格式的文件进行上传的话,可以上传带有XSS的svg文件,具体文件如下

1、什么是svg?

SVG允许3种图形物件类型:矢量图形、栅格图像以及文本。图形物件——包括PNG、JPEG这些栅格图像——能够被编组、设计、转换及集成进先前的渲染物件中。文本可以在任何适用于应用程序的XML命名空间之内,从而提高SVG图形的搜索能力和无障碍性。SVG提供的功能集涵盖了嵌套转换、裁剪路径、Alpha通道、滤镜效果、模板对象以及可扩展性。

SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。

SVG文件还可嵌入JavaScript(严格地说,应该是ECMAScript)脚本来控制SVG对象。
2、如何生成payload?

保存为svg格式即可

4、如何进行攻击?

由于svg格式的文件可以执行JavaScript代码,所以我们直接上传带有xss代码的svg文件即可,然后打开它,就可以执行恶意的xss语句。

第三类:exif写入
当然还有一种方法就是使用exiftool进行XSS代码嵌入(Metadata写入)

前提就是需要网站解析图片的exif信息才可以成功使用此方法(当然没有解析也可以试试)

1、什么是exif?

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。

Exif最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1版,增加了对音频文件的支持。2002年3月,发表了2.2版。

Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
2、怎么在图片当中写入payload?

下载exiftool

准备好一张图片

打开shell执行 exiftool -Comment=“ filename.png”(-Comment为指定的exif名称,等号后面为其值)

3、如何使用exif进行攻击?

下载一张图片
查看其具体信息
写入payload
上传图片到服务器当中
查看图片或者其他操作,可能会进行弹窗
由于篇幅有限还有部分XSS攻击方式暂时无法呈现
四、XSS防御
逻辑层次
针对一般XSS的防御---->过滤/HTML实体化编码特殊字符:<> ’ "等。

对于PDF XSS的防御---->强制用户下载要打开的PDF文件

对于文件上传XSS的防御----> 检查文件内容,检查后缀格式,剥离exif标签
代码层次
主要是对于HTML标签的剥离

PHP的htmlentities()或是htmlspecialchars()。
Python的cgi.escape()。
ASP的Server.HTMLEncode()。
ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
Java的xssprotect (Open Source Library)
Node.js的node-validator。
HTTP头层次
设置以下的响应头

X-XSS-Protection

通过设置其值为1,启用浏览器的XSS防护,浏览器会做出下面的措施:
自动关闭或过滤掉潜在的XSS攻击脚本:浏览器会检测响应内容是否包含恶意脚本,并自动关闭或过滤掉这些脚本,防止它们被执行。
重定向到安全页面:如果浏览器检测到具有潜在XSS威胁的内容,它可能会将用户重定向到一个更安全的页面,以防止攻击脚本的执行。
X-Download-Options

通过设置其值为noopen,使得浏览器下载文件时不自动打开,不关联下载文件和浏览器内嵌程序。这样可以防止一些特定类型的文件(例如html、pdf等)被当作网页打开,降低XSS攻击的风险。
X-Content-Type-Options

通过设置X-Content-Type-Options头的值为"nosniff",可以防止浏览器将响应内容以错误的方式解析,减少了XSS攻击的风险。
X-Frame-Options

通过设置X-Frame-Options头,可以阻止通过嵌入iframe或frame的方式进行点击劫持攻击。可以设置该头的值为"DENY",“SAMEORIGIN"或"ALLOW-FROM <域名>”。
Content Security Policy(CSP)

通过设置CSP头,可以限制资源加载的来源,以防止执行不受信任的脚本。CSP可以指定允许的域名、允许的脚本类型以及其他安全策略。
HttpOnly
当一个 cookie 设置了 HttpOnly 标志后,浏览器会禁止通过 JavaScript 脚本来读取这个 cookie 的值。这意味着即使有 XSS 攻击成功注入了恶意脚本,也无法从受害者浏览器中获取敏感的 cookie 值,从而有效防止了 cookie 盗取和会话劫持攻击。

但是HttpOnly不能够完全防御XSS,只能减少XSS带来的危害。

下面是不同语言设置HttpOnly的方式(仅供参考):

PHP

setcookie(‘cookie_name’, ‘cookie_value’, time()+3600, ‘/’, ‘’, false, true); // 最后一个参数设置为 true 表示设置 HttpOnly 标志,false 表示不设置
Java

import javax.servlet.http.Cookie;

Cookie cookie = new Cookie(“cookie_name”, “cookie_value”);
cookie.setMaxAge(3600);
cookie.setPath(“/”);
cookie.setHttpOnly(true); // 设置 HttpOnly 标志
response.addCookie(cookie);
Python(Django 框架)

response.set_cookie(‘cookie_name’, ‘cookie_value’, max_age=3600, httponly=True) # 设置 httponly=True 表示设置 HttpOnly 标志
ASP.NET

HttpCookie cookie = new HttpCookie(“cookie_name”, “cookie_value”);
cookie.Expires = DateTime.Now.AddHours(1);
cookie.HttpOnly = true; // 设置 HttpOnly 标志
Response.Cookies.Add(cookie);
安全设备及安全软件
过滤数据包当中的XSS代码

五、XSS绕过
某些特殊字符绕过
(空格绕过)
空格使用由/来进行替代,例如:

修改为:

<img/src=x/οnerrοr=alert(1)>
()括号绕过
空格有`来进行代替,例如:

修改为:

<img src=x οnerrοr=alert1>
大小写绕过
由于正则表达式的不严密导致可以使用大小写来进行绕过

解决方案:使用正则表达式忽略大小写的模式

双写绕过
由于只进行了一次关键字符的替换导致可以被双写绕过

解决方案:循环检测关键字符

编码绕过
利用文章开头提到的编码顺序进行编码payload,例如:

<img src=# οnerrοr=alert(‘xss’)>
经过JavaScript编码(unicode编码)后为

<img src=# οnerrοr=\u0061\u006C\u0065\u0072\u0074(‘\u0078\u0073\u0073’)>
经过HTML实体化编码后为

解决方案:服务端收到数据时先进行HTML/JavaScript解码,剥离危险标签

标签绕过
假如所有HTML标签都被过滤,可以尝试自定义标签来进行绕过。

锚点:#可以迅速定位到某个id,或者class的位置,只要能让锚点指向到我们自定义标签,然后在自定义标签当中写入onfocus事件就可以直接完成XSS。

首先写入一个自定义标签的XSS,注意标注id值,与tabIndex的值

tabIndex的作用见:tabindex - HTML(超文本标记语言) | MDN (mozilla.org),主要目的是让自定义标签获得focus

在GET请求最后追加上锚点+id值,直接进行访问即可。

https://xxxxx.com?id=#qweasd
假如是存储型XSS可以直接进行加上锚点访问。

解决方案:禁止<>的输入或者进行HTML编码

CSP绕过
篇幅有限,见大佬文章:

Content Security Policy 入门教程 - 阮一峰的网络日志 (ruanyifeng.com)

我的CSP绕过思路及总结 - 先知社区 (aliyun.com)

HttpOnly绕过
可以使用CVE-2012-0053来尝试进行绕过,通过给网站插入超长Cookie值,当http头部大于apache的最大长度,apache便会返回400错误,状态页中就包含了httponly保护的cookie。

在实战当中可以XSS平台当中的模块来实现此功能,因为实在是不好复现。

也可以利用phpinfo页面来输出Cookie值

当然也可以表单(登录框)劫持数据,但是要注意同源策略的限制。

解决方案:升级apache到最新版,删除phpinfo页面,过滤危险XSS代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/150978.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode做题笔记160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

【力扣每日一题】2023.10.7 股票价格跨度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示不同时间的股票的价格&#xff0c;要我们按照顺序返回每天的股票价格跨度&#xff0c;价格跨度就是股票价格小于或等于…

Java源码分析(三)ArrayList

ArrayList是我们经常用到的一个集合类&#xff0c;那么本篇我们一起学习下ArrayList的源码。 一、创建ArrayList 首先&#xff0c;我们从创建ArrayList开始。如下代码&#xff0c;创建一个空的ArrayList&#xff1a; List<String> list new ArrayList<>(); 看下…

从零开始开发企培源码:搭建企业内训小程序的全面指南

在当今竞争激烈的企业世界中&#xff0c;不断提升员工的技能和知识已经成为了保持竞争力的必要条件之一。因此&#xff0c;越来越多的企业开始重视内部培训&#xff0c;以确保员工具备所需的技能和知识。为了更有效地进行内部培训&#xff0c;许多企业都在考虑开发自己的企业内…

【网络通信三要素】TCP与UDP快速入门

网络通信三要素 1.什么是网络编程&#xff1f; 可以让设备中的程序&#xff0c;与网络上其他设备中的程序进行数据交互&#xff0c;从而实现网络通信的手段&#xff0c;java.net.*包下提供了网络编程的解决方案 2.基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构…

力扣-404.左叶子之和

Idea attention&#xff1a;先看清楚题目&#xff0c;题目说的是左叶子结点&#xff0c;不是左结点【泣不成声】 遇到像这种二叉树类型的题目呢&#xff0c;我们一般还是选择dfs&#xff0c;然后类似于前序遍历的方式加上判断条件即可 AC Code class Solution { public:void d…

利用GPIO中断实现的温度显示器

硬件设计&#xff1a; 软件设计&#xff1a; /****************************************************************************** * * Copyright (C) 2009 - 2014 Xilinx, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obta…

nginx高可用配置(五)

keepalived keepalived安装 1.#进入根目录下的 usr目录 cd /usr 2.#安装keepalived yum install keepalived -y 3.安装完成后在根目录etc下会有个keepalived目录 4.进入keepalived目录 cd keepalived/ 5.ll命令查看&#xff0c;会有个配置文件 keepalived.conf 6.ke…

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…

Safran与是德科技合作为蔚来提供电动汽车中的5G和C-V2X连接测试

概述 虹科Safran GNSS模拟器助力是德科技&#xff08;Keysight&#xff09;为中国顶级电动汽车制造商之一——蔚来汽车&#xff08;NIO&#xff09;提供了业界领先的UXM 5G测试解决方案以验证5G和C-V2X的连接性&#xff0c;能够根据3GPP和其他标准组织定义的最新5G新无线电&am…

【Vue面试题七】、SPA (单页面) 首屏加载速度慢怎么解决?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;SPA首屏加载速度慢的怎么…

【JavaEE】_HTTP请求与HTTP响应

目录 1. HTTP协议 2. HTTP请求 2.1 HTTP请求首行 2.2 URL 2.3 HTTP方法 2.3.1 GET请求 2.3.2 POST请求 2.3.3 GET与POST的区别 2.3.4 其他方法 2.4 请求报头header 2.4.1 Host&#xff1a; 2.4.2 Content-Length与Content-Type&#xff1a; 2.4.3 User-Agent&…

青少年近视问题不容小觑,蔡司用专业技术助力孩子视力健康发展

根据国家卫健委公布的数据显示&#xff0c;2022年全国儿童青少年近视率达到53.6%&#xff0c;青少年近视已成为社会普遍的眼健康问题。对家长来说&#xff0c;也需要提高对孩子眼视光健康重要性的认知&#xff0c;日常培养青少年良好的用眼习惯&#xff0c;并通过矫正视力的方式…

珠宝饰品商家为什么要做微信小程序开发

珠宝饰品商家为什么要做微信小程序开发&#xff1f; 随着互联网的发展&#xff0c;微信小程序作为一种新型的应用形态&#xff0c;正逐渐成为商家们关注的热点。对于珠宝饰品商家来说&#xff0c;开发微信小程序具有以下几个方面的优势&#xff1a; 一、获取更多流量 微信小程…

数据挖掘实验(一)数据规范化【最小-最大规范化、零-均值规范化、小数定标规范化】

一、数据规范化的原理 数据规范化处理是数据挖掘的一项基础工作。不同的属性变量往往具有不同的取值范围&#xff0c;数值间的差别可能很大&#xff0c;不进行处理可能会影响到数据分析的结果。为了消除指标之间由于取值范围带来的差异&#xff0c;需要进行标准化处理。将数据…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验

课程1_第1周_测验题 目录&#xff1a;目录 第一题 1.“人工智能是新电力” 这个比喻指的是什么&#xff1f; A. 【  】人工智能为我们的家庭和办公室的个人设备供电&#xff0c;类似于电力。 B. 【  】通过“智能电网”&#xff0c;人工智能正在传递新一波的电力。 C. …

计算机竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

springboot-admin整合及使用

0. 官方文档及示例 官方文档 示例代码:Spring-Boot-Admin-Demo 1. 概述 Spring Boot Admin(SBA)是一个开源的社区项目&#xff0c;用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式&#xff0c;或 Spring Cloud 服务发现机制注册到 SBA 中&#xff0c;然…

【nvm】Node Version Manager(NVM)安装配置以及使用(WIN版)

NVM 包管理工具 安装 访问NVM-Windows的GitHub页面&#xff1a;点击nvm-setup.exe。 根据提示进行下一步&#xff0c;文件位置选择自定义位置 验证安装是否成功 nvm version 。如果成功&#xff0c;它将显示NVM的版本号。 使用 nvm list available查看所有的可以被下载…

柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?

第一印象非常重要。所以当你第一次见到某人时&#xff0c;留下一个好印象很重要&#xff0c;尤其是当你面对一个重要的工作或者面对某个对你来说可能非常特别的人时。 下面我列出了一些最常用的说“很高兴见到你”的表达方法&#xff0c;也包括对方的回答&#xff0c;除了nice …