首页 > 其他分享 >XSS 跨站脚本攻击原理、分类与实践

XSS 跨站脚本攻击原理、分类与实践

时间:2024-11-11 19:47:48浏览次数:3  
标签:脚本 XSS 跨站 println import servlet response out

目录

XSS 跨站脚本攻击原理、分类与实践

一、XSS 攻击概述

二、XSS 攻击原理

三、XSS 攻击步骤与代码示例

反射型 XSS

前端部分(Vue3 + TS)

后端部分(Java)

模拟攻击的 Python 代码

存储型 XSS

前端部分(Vue3 + TS)

后端部分(Java)

模拟攻击的 Python 代码

DOM-based XSS

前端部分(Vue3 + TS)

后端部分(Java)

模拟攻击的 Python 代码


一、XSS 攻击概述

XSS(Cross - Site Scripting)跨站脚本攻击是一种常见的网络安全漏洞。攻击者通过在目标网站注入恶意脚本(通常是 JavaScript),当用户访问被攻击的页面时,这些恶意脚本会在用户的浏览器中执行,从而获取用户的敏感信息(如登录凭证、个人资料等)、篡改页面内容或者代表用户执行一些非预期的操作。

二、XSS 攻击原理

  1. 反射型 XSS 原理
    当用户访问一个带有恶意参数的 URL 时,服务器会将这个参数值包含在响应页面中,并且没有对其进行正确的编码。攻击者构造的恶意脚本作为参数传入,然后浏览器在解析这个包含恶意脚本的页面时就会执行它。例如,一个搜索功能的网站,如果搜索关键词没有被正确处理,攻击者可以构造类似 “<script>alert('XSS')</script>” 作为关键词,当搜索结果页面显示这个关键词时,就会触发弹窗。
  2. 存储型 XSS 原理
    攻击者将恶意脚本存储在目标服务器的数据库或其他存储介质中。比如在一个论坛的评论功能中,如果用户输入的内容没有经过严格过滤就存储到数据库,攻击者可以在评论中插入恶意脚本。当其他用户访问包含这个评论的页面时,脚本就会执行,可能导致信息泄露或其他恶意行为。
  3. DOM - based XSS 原理
    这种类型的 XSS 利用了网页中 DOM(Document Object Model)操作的漏洞。攻击者通过修改页面的 DOM 结构,使得恶意脚本被执行。例如,通过修改页面的 URL 哈希值或者使用 JavaScript 中的某些方法来改变页面内容,从而引入恶意脚本。

三、XSS 攻击步骤与代码示例

  1. 前端部分(Vue3 + TS) - 模拟存在 XSS 漏洞的输入场景

<template>
  <input type="text" v-model="userInput" @input="handleInput" />
  <div v-html="displayContent"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'XSSVulnerableComponent',
  data() {
    return {
      userInput: '',
      displayContent: ''
    };
  },
  methods: {
    handleInput() {
      // 这里存在漏洞,直接将用户输入作为HTML内容显示,可能导致XSS攻击
      this.displayContent = this.userInput;
    }
  }
});
</script>

在这个示例中,如果用户输入恶意脚本(如 “<script>alert('XSS')</script>”),页面会直接执行该脚本。

  1. 后端部分(Java) - 模拟接收并处理可能包含 XSS 的输入(这里只是简单示例,实际中可能涉及数据库存储等)

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/xss-example")
public class XSSEXampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userInput = request.getParameter("input");
        // 这里没有对用户输入进行XSS过滤,存在安全风险
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("You entered: " + userInput);
        out.println("</body></html>");
    }
}

如果攻击者通过构造恶意的 “input” 参数(如包含 XSS 脚本),服务器会将其包含在响应中返回给浏览器执行。

  1. Python 模拟 XSS 攻击示例(仅用于演示)

import requests

# 构造包含XSS脚本的URL参数(这里是反射型XSS示例)
url = 'http://yourserver/xss-example?input=%3Cscript%3Ealert(%27XSS%27)%3C/script%3E'
response = requests.get(url)
print(response.text)

这个 Python 代码模拟了攻击者发送包含恶意脚本的请求,如果服务器没有正确处理,就会触发 XSS 攻击。

在实际的安全防护中,要对用户输入进行严格的过滤和编码,无论是在前端还是后端。对于存储型 XSS,要在存储数据前进行处理,对于反射型和 DOM - based XSS,要对传入的参数进行检查和净化,防止恶意脚本的执行。同时,要对页面的 DOM 操作进行安全审查,避免出现可被利用的漏洞。

以下是基于前面所介绍的三种 XSS(跨站脚本攻击)类型,分别给出的三种代码示例,示例中包含前端(Vue3 + TS)、后端(Java)以及用于模拟攻击的 Python 代码部分:

反射型 XSS

前端部分(Vue3 + TS)

<template>
  <input type="text" v-model="searchQuery" @input="search" />
  <div v-html="searchResult"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'ReflectedXSSComponent',
  data() {
    return {
      searchQuery: '',
      searchResult: ''
    };
  },
  methods: {
    search() {
      // 这里假设会将用户输入的查询发送到后端,并将后端返回的结果展示在searchResult中
      // 实际应用中应该使用axios等库来发送请求,但为了简化示例,这里省略具体发送过程
      // 此处在接收到后端返回结果后直接赋值给searchResult展示,存在反射型XSS漏洞
      this.searchResult = `You searched for: ${this.searchQuery}`;
    }
  }
});
</script>

后端部分(Java)

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/search")
public class ReflectedXSSEXampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String searchQuery = request.getParameter("query");
        // 这里没有对用户输入的查询参数进行任何XSS过滤处理,直接将其包含在响应中返回
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("Search results for: " + searchQuery);
        out.println("</body></html>");
    }
}

模拟攻击的 Python 代码

import requests

# 构造包含反射型XSS脚本的URL参数
url = 'http://yourserver/search?query=%3Cscript%3Ealert(%27Reflected XSS%27)%3C/script%3E'
response = requests.get(url)
print(response.text)

存储型 XSS

前端部分(Vue3 + TS)

<template>
  <textarea v-model="userComment" @input="submitComment"></textarea>
  <div v-for="(comment, index) in comments" :key="index">{{ comment }}</div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'StoredXSSComponent',
  data() {
    return {
      userComment: '',
      comments: []
    };
  },
  methods: {
    submitComment() {
      // 这里假设会将用户输入的评论发送到后端保存,然后从后端获取所有评论并展示在前端
      // 实际应用中应该使用axios等库来发送请求,但为了简化示例,这里省略具体发送过程
      // 此处在接收到后端返回的评论列表后直接赋值给comments展示,存在存储型XSS漏洞
      // 假设后端已经将新评论保存并返回了更新后的评论列表
      this.comments.push(this.userComment);
      this.userComment = '';
    }
  }
});
</script>

后端部分(Java)

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/submit-comment")
public class StoredXSSEXampleServlet extends HttpServlet {
    private List<String> comments = new ArrayList<>();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userComment = request.getParameter("comment");
        // 这里没有对用户输入的评论进行任何XSS过滤处理,直接将其保存到comments列表中
        // 然后将更新后的评论列表返回给前端展示
        comments.add(userComment);

        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("Comments:");
        for (String comment : comments) {
            out.println("<div>" + comment + "</div>");
        }
        out.println("</body></html>");
    }
}

模拟攻击的 Python 代码

import requests

# 构造包含存储型XSS脚本的评论内容
malicious_comment = "<script>alert('Stored XSS')</script>"
# 模拟发送包含恶意评论的POST请求到后端
data = {'comment': malicious_comment}
response = requests.post('http://yourserver/submit-comment', data=data)
print(response.text)

DOM-based XSS

前端部分(Vue3 + TS)

<template>
  <input type="text" v-model="hashValue" @input="updateHash" />
  <div id="content"></div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'DOMBasedXSSComponent',
  data() {
    return {
      hashValue: ''
    };
  },
  methods: {
    updateHash() {
      // 这里通过修改URL的哈希值来模拟DOM-based XSS漏洞
      // 当用户输入内容时,会将输入作为哈希值设置到URL中,并根据哈希值来更新页面内容
      // 假设根据哈希值会动态加载并执行一些脚本,但这里没有对哈希值进行安全处理
      window.location.hash = this.hashValue;
      let contentDiv = document.getElementById('content');
      if (contentDiv) {
        contentDiv.innerHTML = `You entered: ${this.hashValue}`;
      }
    }
  }
});
</script>

后端部分(Java)

对于 DOM-based XSS,漏洞主要存在于前端对 DOM 的操作上,后端代码通常与普通的页面请求处理类似,这里给出一个简单的示例,用于返回包含前端代码的页面:

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/dom-based-xss-page")
public class DOMBasedXSSEXampleServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<input type='text' id='hashInput' oninput='updateHash()' />");
        out.println("<div id='content'></div>");
        out.println("<script>");
        out.println("function updateHash() {");
        out.println("  var hashValue = document.getElementById('hashInput').value;");
        out.println("  window.location.hash = hashValue;");
        out.println("  var contentDiv = document.getElementById('content');");
        out.println("  if (contentDiv) {");
        out.println("    contentDiv.innerHTML = 'You entered: ' + hashValue;");
        out.println("  }");
        out.println("}");
        out.println("</script>");
        out.println("</body></html>");
    }
}

模拟攻击的 Python 代码

import requests

# 构造包含DOM-based XSS脚本的哈希值内容
malicious_hash_value = "#<script>alert('DOM-based XSS')</script>"
# 模拟发送包含恶意哈希值的GET请求到后端(这里主要是触发前端的漏洞,实际攻击场景可能更复杂)
url = 'http://yourserver/dom-based-xss-page' + malicious_hash_value
response = requests.get(url)
print(response.text)

请注意,上述代码只是为了演示三种 XSS 攻击类型相关的原理和问题,在实际的生产环境中,需要更全面和深入的安全措施来防止这些攻击的发生。

标签:脚本,XSS,跨站,println,import,servlet,response,out
From: https://blog.csdn.net/m0_57836225/article/details/143693682

相关文章

  • Linux 关机的shell脚本
    今天突发奇想想写一个关机的脚本然后去找了很多帖子发现写的都不是很详细就打算自己写一个比较详细的:首先用vim编辑器先创建一个脚本文件(我是在桌面创建的)(也可以用其他文本编辑器不一定是vim):vimshutdown.sh然后就是在将以下内容输入至“shutdown.sh”中:#!/bin/bash......
  • xss-labs-master靶机1-20关解题思路
    xss-labs-master靶机1-20关解题思路xss-labs-master靶机是xss-labs作者在github上发布的后来不知道为什么就把它删了,可能是因为这个靶机属于静态页面有一个通用的推广方式(具体在后面),不过还是希望读者使用实战中的攻击手段学习,这个靶机是对XSS漏洞的专项练习,一共有二十关,也是小......
  • bp靶场之xss
    靶场链接https://portswigger.net/web-security/all-labsxss备忘录:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet将XSS反射到HTML上下文中,无需任何编码搜索123后,url上出现123,页面也直接回显123,说明可能有反射xsshttps://0a1a0050044ea608c471......
  • WireGuard 多节点集群的Shell 半自动化配置脚本
    要将上述WireGuard配置脚本扩展为支持 多节点集群(即多个服务器和客户端节点的配置),我们需要做出一些修改:支持多个 服务器 和 客户端 配置。自动为每个节点生成独特的配置文件,并确保它们能够互相通信。支持集群模式,配置多个 服务器端 和 客户端 节点之间的连接。以......
  • 怎么启动python脚本文件
    创建一个简单的python入门代码,以便示范。存储文件并复制该python文件的存储路径。使用cd命令切换工作目录到python文件所在的目录。输入变量环境中的python路径和python文件的名字。回车执行后,可完成命令行的python文件运行。......
  • shell脚本在linux无法运行
    shell脚本在linux无法运行在windows写的.sh脚本,直接把文件传到Linux之后运行,报错:$bash./v_1.sh:commandnotfound'/v_1.sh:line4:syntaxerrornearunexpectedtoken`do'/v_1.sh:line4:`do脚本内容是:#shellvirusI#forfilein./infect/*docp$0$fi......
  • %windir% 是一个环境变量,它指向当前操作系统中 Windows 安装目录的路径。它常用于批处
    %windir%是一个环境变量,它指向当前操作系统中Windows安装目录的路径。它常用于批处理文件、命令行或者脚本中,帮助系统或用户快速定位Windows系统文件夹的路径。类似的环境变量还有很多,它们通常用于在操作系统中快速访问重要的文件夹和目录,避免硬编码路径,从而提高脚本的可移植......
  • 作业帮诗词pk自动化脚本__广大附中摸鱼小组制作
    本文由广大附中摸鱼小组创作作业帮诗词pk题目样例运行脚本前的准备工作注意,此脚本可能只支持windows操作系统(其他操作系统的兼容性未经过测试)1.在电脑上下载夜神模拟器官网网址为https://www.yeshen.com/2.运行夜神模拟器,进入夜神模拟器的设置界面,将分辨率修改为“手......
  • 数据库基础(11) . SQL脚本
    1.概述SQL脚本:是由一系列SQL命令组成在一起执行以完成特定的任务。SQL脚本通常用于执行批量操作,如创建数据库对象(表、视图、存储过程等)、插入数据、执行批处理更新等。1.1.标识符命名对象起名(变量、常量、函数等)、注意命名规则1.字符集和大小写敏感性字符集:标识符......
  • 开心消消乐无限道具脚本,轻松满关可接单
    功能介绍:内置脚本版本,可正常登录自己账号,脚本自带算法,可无限各类道具,轻松满星,可闲鱼接单或者卖号,轻松变现设备需求:安卓手机或者电脑模拟器......