首页 > 其他分享 >XSS漏洞详细讲解(初学者必看)

XSS漏洞详细讲解(初学者必看)

时间:2024-12-04 23:33:27浏览次数:7  
标签:XSS 必看 Web JavaScript 用户 漏洞 初学者 页面

前言:

要深入理解XSS漏洞,掌握Web应用的基本原理非常关键。XSS攻击本质上是通过注入恶意的JavaScript代码到Web页面中,从而使得攻击者可以在用户浏览页面时执行恶意脚本。因此,理解Web应用如何处理输入、渲染、执行脚本等方面的基本原理非常重要。

一、Web应用的基本原理:

1. HTML与JavaScript基础:

  • HTML:HTML构成了网页的结构。页面上的每个元素(如<div>, <button>, <form>, <input>等)都是HTML标签。
  • JavaScript:JavaScript是客户端脚本语言,可以在页面加载后修改页面的内容、处理用户交互等。XSS漏洞常常通过JavaScript代码实现。

代码示例:基本的HTML页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Basic HTML Example</title>
</head>
<body>
    <h1>Welcome to My Website</h1>
    <p>Enter your name:</p>
    <form method="GET" action="greet_user.php">
        <input type="text" name="username">
        <button type="submit">Submit</button>
    </form>
</body>
</html>

2. HTTP协议与请求/响应机制:

  • HTTP请求:当用户访问一个Web应用时,浏览器会发送一个HTTP请求,请求页面的内容。请求通常包括URL、请求方法(GET、POST等)、请求头和请求体等。
  • HTTP响应:服务器返回一个HTTP响应,响应体通常是HTML代码,浏览器会解析这些HTML代码并呈现页面。

代码示例:服务器响应(伪代码)

<?php
if (isset($_GET['username'])) {
    $username = $_GET['username'];
    echo "<h1>Hello, " . htmlspecialchars($username) . "!</h1>";
} else {
    echo "<h1>Welcome to my website</h1>";
}
?>

在上面的代码中,服务器返回包含用户输入的内容($_GET['username'])的HTML响应。为了防止XSS漏洞,正常情况下应该使用htmlspecialchars对用户输入进行转义,这样即使用户输入了HTML或JavaScript代码,浏览器也不会执行它。

注:htmlspecialchars() 函数的主要作用是将字符串中的特殊字符(如 <, >, &, ", ’ 等)转换成其对应的 HTML 实体,这样可以防止用户输入的数据被浏览器当作 HTML 或 JavaScript 代码执行。

3. 表单和用户输入:

  • 表单(Form):Web应用通常使用表单收集用户的输入。表单的输入框(<input>)可以接收文本、数字、文件等各种类型的数据。
  • 用户输入的数据通过HTTP请求发送到服务器端,服务器处理后生成HTML响应。

代码示例:用户输入展示

<form method="GET" action="greet_user.php">
    <input type="text" name="username" placeholder="Enter your name">
    <button type="submit">Submit</button>
</form>

4. 跨站脚本攻击 (XSS) 的工作原理:

XSS漏洞发生的关键在于Web应用没有正确处理用户输入,导致恶意的JavaScript代码被注入并执行。攻击者可以通过URL参数、表单提交或其他输入方式,将恶意的JavaScript代码注入到Web页面中,并使得代码在其他用户的浏览器中执行。

代码示例:一个简单的反射型XSS漏洞

<?php
if (isset($_GET['username'])) {
    // 潜在的XSS漏洞:未进行任何输入验证或编码
    echo "<h1>Hello, " . $_GET['username'] . "!</h1>";
} else {
    echo "<h1>Welcome to my website</h1>";
}
?>

在这个例子中,攻击者可以通过提交一个URL,如http://example.com/greet_user.php?username=<script>alert('XSS')</script>,来执行注入的<script>标签中的JavaScript代码。浏览器会将该代码当作HTML代码解析并执行,弹出一个alert提示框。

二、XSS 攻击原理详细说明:

1. 攻击流程概述

XSS 攻击的核心原理可以分为以下几个步骤:

  1. 攻击者提交恶意代码:攻击者向 Web 应用注入恶意脚本(通常是 JavaScript)。这些代码通常通过 URL 参数、表单提交或 API 请求的方式注入。

  2. Web 应用未做适当的输入验证或输出编码:Web 应用没有对用户输入的内容进行严格验证或编码处理,导致恶意脚本被嵌入到响应中。

  3. 恶意代码在受害者浏览器中执行:当受害者访问包含恶意脚本的页面时,浏览器解析并执行这些脚本。由于脚本是由受害者的浏览器执行的,因此它可以访问该浏览器的 DOMcookies 和其他资源,执行攻击者的意图。

  4. 攻击者通过脚本控制浏览器:攻击者可以使用 JavaScript 进行一系列恶意操作,如窃取用户的敏感信息(如 cookies、session ID 等),伪造用户请求,篡改网页内容,甚至劫持用户会话。


2. XSS漏洞分类详细介绍

反射型 XSS 攻击(Reflected XSS)

反射型 XSS 攻击是最常见的一种类型,攻击者通过 URL 参数注入恶意脚本,服务器将这个脚本反射回客户端,客户端直接执行该脚本。

攻击流程:
  1. 攻击者构造一个带有恶意 JavaScript 的 URL,诱使用户点击。
  2. 用户点击后,恶意脚本通过 URL 参数传递到服务器。
  3. 服务器将恶意脚本反射回页面响应,浏览器执行该脚本。
代码示例:

假设有一个搜索功能,用户输入查询内容,服务器返回查询结果。以下是一个容易受到反射型 XSS 攻击的代码示例:

<?php
// 反射型 XSS 漏洞
if (isset($_GET['query'])) {
    echo "Search results for: " . $_GET['query'];  // 未进行输出编码,直接显示用户输入
} else {
    echo "Please enter a search query.";
}
?>
  • 用户访问链接:http://example.com/search?query=<script>alert('XSS Attack');</script>
  • 攻击过程
    • 用户点击该链接,恶意脚本 <script>alert('XSS Attack');</script> 被发送到服务器。
    • 服务器未对输入进行转义,直接将其嵌入到页面中。
    • 浏览器将 alert('XSS Attack') 执行,弹出一个警告框,显示 “XSS Attack”。
危害:
  • 攻击者可以通过这种方式获取用户的 cookies、篡改页面内容、进行 钓鱼攻击 等。
防御方法:
  • 使用 htmlspecialchars()htmlentities() 函数来对输出进行转义,防止脚本执行。
<?php
// 使用 htmlspecialchars 防止 XSS 攻击
if (isset($_GET['query'])) {
    echo "Search results for: " . htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8');
} else {
    echo "Please enter a search query.";
}
?>

存储型 XSS 攻击(Stored XSS)

存储型 XSS 攻击的特点是攻击者通过 Web 应用将恶意脚本存储在服务器端(如数据库),当其他用户访问该页面时,存储的恶意脚本会被加载并执行。

攻击流程:
  1. 攻击者提交含有恶意脚本的输入(如评论、帖子、聊天消息等)。
  2. Web 应用将这段恶意脚本存储在数据库或文件中。
  3. 当其他用户访问页面时,存储的恶意脚本被返回并在浏览器中执行。
代码示例:

假设网站允许用户发表评论,且没有对输入进行过滤或转义:

<?php
// 存储型 XSS 漏洞
if (isset($_POST['comment'])) {
    $comment = $_POST['comment'];
    // 用户评论被存储到数据库中
    $db->query("INSERT INTO comments (content) VALUES ('$comment')");
} else {
    echo "Leave a comment:";
}
?>
  • 攻击者输入:<script>alert('XSS Attack');</script>
  • 攻击过程
    • 攻击者提交了带有恶意 JavaScript 代码的评论。
    • 这段恶意代码被存储在数据库中。
    • 当其他用户访问该评论时,浏览器会执行存储的恶意代码,弹出一个警告框。
危害:
  • 攻击者可以通过这种方式窃取其他用户的 cookies、会话信息,甚至通过篡改网页内容误导用户。
防御方法:
  • 使用 htmlspecialchars() 转义用户输入,确保用户输入不会被浏览器当作代码执行。
  • 对数据库中的数据进行过滤和转义,避免将未经处理的数据存储在数据库中。
<?php
if (isset($_POST['comment'])) {
    $comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
    $db->query("INSERT INTO comments (content) VALUES ('$comment')");
}

DOM-based XSS 攻击

DOM-based XSS 攻击与反射型和存储型 XSS 的不同之处在于,攻击发生在客户端的 JavaScript 代码中,而不是服务器端。恶意代码通过客户端的 JavaScript 操控 DOM,从而执行攻击。

攻击流程:
  1. 攻击者通过 URL 参数等方式传递恶意代码。
  2. 客户端的 JavaScript 代码不对用户输入进行适当的过滤或转义,直接将其插入到 DOM 中。
  3. 恶意代码通过修改 DOM 或执行 eval() 等方式被执行。
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM-based XSS</title>
</head>
<body>
    <h1>Welcome to the site</h1>
    <div id="greeting"></div>
    <script>
        // 这里直接从 URL 参数获取 username,并插入到 DOM 中
        const username = new URLSearchParams(window.location.search).get('username');
        document.getElementById('greeting').innerHTML = "Hello, " + username;
    </script>
</body>
</html>
  • 攻击者访问:http://example.com/?username=<script>alert('XSS')</script>
  • 攻击过程
    • 用户访问包含恶意 JavaScript 代码的 URL。
    • 页面中的 JavaScript 代码将 username 插入到 DOM 中,导致恶意脚本被执行。
危害:
  • 攻击者可以控制页面的显示内容、窃取用户信息等。与其他类型的 XSS 相比,DOM-based XSS 主要通过客户端的 JavaScript 逻辑实现。
防御方法:
  • 避免直接将用户输入插入到 DOM 中
  • 使用安全的 API 来操作 DOM,如 textContentsetAttribute,避免使用 innerHTMLeval() 等不安全的方式。
// 使用 textContent 替代 innerHTML 来防止 XSS
document.getElementById('greeting').textContent = "Hello, " + username;

XSS总结

XSS 攻击的原理就是通过在 Web 应用中注入恶意的 JavaScript 代码,迫使浏览器执行该代码,从而实现窃取用户信息、篡改页面内容、劫持会话等目的。XSS 的攻击方式主要有三种类型:反射型、存储型和 DOM-based XSS。

  • 反射型 XSS:通过 URL 参数传递恶意脚本,立即反射到页面中并执行。
  • 存储型 XSS:恶意脚本被存储在服务器端,直到其他用户访问该页面时才执行。
  • DOM-based XSS:通过客户端 JavaScript 操控 DOM,直接执行恶意代码。

三、 XSS 漏洞的挖掘

(一)、XSS 漏洞测试思路

寻找 XSS 漏洞的常见思路:

  1. 分析用户输入的入口

    • 查看 Web 应用中所有涉及用户输入的地方,如查询参数、表单输入、URL 参数、Cookie 等。
    • 确认这些输入是否被直接渲染到 HTML 页面中,而没有经过适当的转义或过滤。
  2. 测试输入字段

    • 在每个输入字段(URL 参数、表单、搜索框等)尝试注入恶意的脚本。常用的 payload 如 <script>alert('XSS');</script><img src="x" one rror="alert('XSS')"> 等。
  3. 查看返回的数据是否执行脚本

    • 检查返回的页面是否包含恶意脚本。可以使用浏览器的开发者工具查看响应内容。
    • 检查网页的 JavaScript 代码是否使用 eval()innerHTML 等不安全的 API。
  4. 测试存储型 XSS 漏洞

    • 在可输入区域(如评论、帖子、留言板等)注入脚本,提交并查看是否能够在页面加载时执行。
  5. 测试 DOM-based XSS 漏洞

    • 通过 JavaScript 进行动态 DOM 操作时,检查是否存在未过滤的用户输入。可以通过注入 JavaScript 代码来观察页面是否执行。

(二)、XSS 漏洞练习靶场、扫描器和常用 Payload

1. 介绍两个 XSS 漏洞练习靶场

1.1 XSS-Labs

XSS-Labs 是一个专门用来学习和练习 XSS 漏洞的靶场。它通过多种不同类型的 XSS 漏洞来帮助你理解各种 XSS 攻击的原理及其防御方法。它适合初学者进行 XSS 漏洞的练习。

如何使用 XSS-Labs:

  • XSS-Labs 提供了一个 Web 应用,用户可以通过交互式的界面进行攻击练习。它提供了不同难度级别的练习,从简单的反射型 XSS 到复杂的存储型和 DOM-based XSS。
  • 每个练习都附带了详细的解答,帮助学习者理解漏洞的成因和防御措施。

访问地址
https://github.com/Adamanta/xss-labs

特点

  • 分为多个难度级别,适合不同水平的学习者。
  • 每个漏洞都有针对性的练习,可以一步步地提升攻击技巧。
  • 提供完整的解决方案,帮助学习者理解漏洞的修复方法。
1.2 DVWA (Damn Vulnerable Web Application)

DVWA 是一个非常知名的练习靶场,旨在帮助安全研究人员和开发人员了解并测试 Web 应用的漏洞。它包含多种 Web 漏洞,包括 SQL 注入、XSS、文件上传漏洞等。DVWA 提供了多个难度级别的环境,其中包含了 XSS 漏洞,帮助学习者熟悉常见的攻击方法。

如何使用 DVWA:

  1. 下载并安装 DVWA。你可以从 GitHub 上下载源代码:

  2. 配置数据库并启用相应的难度级别。

  3. 进入 XSS 漏洞页面,选择不同的难度级别(低、中、高)来测试各种类型的 XSS 漏洞。

特点

  • 提供不同的攻击难度(低、中、高),适合不同层次的安全研究者。
  • 涵盖 SQL 注入、XSS、CSRF 等多种漏洞,全面提升 Web 安全技能。
  • 可以自己修改源代码来模拟不同类型的漏洞,非常适合做定制化的攻击实验。

使用参考


2. 介绍两款 XSS 漏洞扫描器

2.1 XSSer

XSSer 是一个开源的自动化 XSS 漏洞扫描工具,它能够帮助用户检测 Web 应用中的 XSS 漏洞。XSSer 会自动探测页面中可能存在的反射型、存储型和 DOM-based XSS 漏洞。

下载和使用

  1. 安装

    • 在 Linux 系统上,使用 git 克隆代码并安装依赖:
      git clone https://github.com/epsylon/xsser.git
      cd xsser
      python3 -m pip install -r requirements.txt
      
  2. 使用

    • 扫描一个目标网站的 XSS 漏洞:
      python3 xsser.py -u "http://targetsite.com/search?query=test"
      
  3. 功能

    • 支持多种 XSS 攻击的自动检测。
    • 可以自定义 payload,提供多种攻击模式。
    • 支持通过 HTTP 请求自动扫描页面,输出扫描结果。
2.2 Burp Suite

Burp Suite 是一款功能强大的 Web 安全测试工具,常用于发现各种 Web 漏洞,包括 XSS 漏洞。Burp Suite 提供了丰富的功能,如代理、扫描、爬虫、入侵检测等,广泛应用于渗透测试和漏洞扫描。

下载和使用

  1. 安装

    • 访问 Burp Suite 官网 下载并安装适用于不同操作系统的版本。
    • 免费版和专业版提供不同的功能,建议使用专业版进行更全面的扫描。
  2. 配置

    • 启动 Burp Suite,配置代理,将浏览器代理设置为 127.0.0.1:8080,并开始浏览目标 Web 应用。
  3. 扫描 XSS 漏洞

    • 使用 Burp Suite 的 Scanner 功能来自动检测 XSS 漏洞。
    • 在扫描结果中查看可能的 XSS 漏洞,进一步分析和手动验证。

功能

  • 提供广泛的漏洞扫描功能,包括 XSS、SQL 注入等。
  • 可以自定义漏洞扫描策略,支持深入分析请求和响应。
  • 专业版支持更强大的自动化漏洞扫描功能。

3. 常用 XSS Payload(手工测试)

常见 XSS Payload 类型:

  • 反射型 XSS

    1. <script>alert('XSS');</script>
    2. <img src="x" one rror="alert('XSS')">
    3. <input type="text" value="<script>alert(1)</script>">
  • 存储型 XSS

    1. <script>alert('Stored XSS')</script>
    2. <img src="x" one rror="alert('Stored XSS')">
    3. <iframe src="javascript:alert('Stored XSS')"></iframe>
  • DOM-based XSS

    1. javascript:alert('DOM-based XSS')
    2. <a href="javascript:alert('DOM-based XSS')">Click Me</a>
    更多payload可以参考我另一篇博客

    常见payload

使用场景

  • URL 参数:检查用户输入的 URL 参数,如 ?id=<script>alert('XSS')</script>
  • 表单提交:测试表单中的输入框、评论框等,例如在评论中插入脚本 <script>alert('XSS')</script>
  • HTTP 请求和响应:分析 HTTP 请求的参数,如 header 或 cookie,并在响应中寻找 XSS 漏洞。

(三)、 XSS 漏洞发现后的提交方式

  • 漏洞提交平台:

3.1 漏洞盒子(Vulbox)

  • 官方网站:https://www.vulbox.com
  • 这是一个面向全球的漏洞报告和奖励平台,提供了漏洞提交、漏洞管理和漏洞研究社区功能。你可以在这个平台上报告发现的漏洞,参与漏洞奖励计划。

3.2 补天SRC(Breach)

  • 官方网站:https://src.btc.com
  • 补天SRC是一个专注于信息安全漏洞的中国平台,提供了漏洞的报告、管理和奖励系统。提交的漏洞被各大企业和机构关注,可以获得一定的奖励。

这两个平台都支持漏洞提交、交流和奖励,帮助安全研究人员与企业之间建立联系。如果你有任何漏洞研究和提交的需求,可以在这些平台上进一步探索。


漏洞提交时需要注意的内容

  • 详细描述漏洞复现步骤。
  • 提供漏洞截图、复现视频或 PoC(漏洞证明)。
  • 尽量提供修复建议,如输入输出过滤、使用 CSP 等防御策略。
  • 根据平台要求提供相关信息,如漏洞影响范围、漏洞级别等。

结语:

本文编写的目的仅用于交流学习,本人也是初学者,希望与诸君共勉!

标签:XSS,必看,Web,JavaScript,用户,漏洞,初学者,页面
From: https://blog.csdn.net/2301_81188416/article/details/144251255

相关文章