XSS漏洞知识总结

一、XSS漏洞原理

1.概述

XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

主要基于JavaScript语言进行恶意攻击,因为js非常灵活操作html、css、浏览器。

2.利用方式

利用网页开发时web应用程序对用户输入过滤不足导致将恶意代码注入到网页中,使用户浏览器加载并执行恶意代码,通常是JavaScript类型,也包括java、vbs、flash、html等。

3.执行方式

用户浏览被XSS注入过的网页,浏览器就会解析这段代码,就被攻击了。因为浏览器当中有JavaScript解析器,浏览器不会判断代码是否恶意,只要符合语法规则,就直接解析了。

4.攻击对象

客户端攻击,对象大多为用户,网站管理员。

还有微博,网页留言板,聊天室等收集用户输入的地方。

5.XSS危害

(1)窃取cookie

因为大部分人喜欢将密码储存到浏览器当中,所以黑客一般渗透的时候就会先来浏览器查看已保存的cookie 来盗取各种用户账号

(2)未授权操作

js特性很强大,黑客会直接代替用户在html进行各类操作。比如劫持会话,刷流量,执行弹窗广告,还能记录用户的键盘输入。

(3)传播蠕虫病毒

6.简单代码

bash 复制代码
<?php
$input = $_GET["XSS"];
echo "<div>".$input."</div>";
?>

在这段PHP代码中 主要具有两个功能:

1.获取用户输入input = _GET["XSS"]; 这行代码的作用是从 HTTP GET 请求的参数中获取名为 XSS 的参数值 。比如访问 http://yourdomain.com/yourscript.php?XSS=test 时,$input 变量就会被赋值为 test 。

2.输出内容到页面 :echo "

".input."
"`;` 会把获取到的 input 变量的值,包裹在
标签里,输出到页面的 HTML 中,最终在浏览器渲染后,会以
包含对应内容的形式展示。

但是这段代码存在 反射型 XSS(跨站脚本攻击)漏洞

因为它直接把用户可控的 GET 参数(未做任何过滤、转义处理)拼接到 HTML 输出里。如果攻击者构造恶意请求,比如让用户访问 http://yourdomain.com/yourscript.php?XSS= ,当页面执行 echo 输出时,浏览器会把 ,然后提交表单。

  • submit.php页面将攻击者输入的数据未经处理直接插入到数据库中。
  • 当管理员访问view.php页面查看留言时,浏览器从服务器获取到包含恶意脚本的留言数据,并将其渲染到页面中。由于浏览器会执行页面中的 JavaScript 代码,所以恶意脚本被执行,弹出 "你被 XSS 攻击了!" 的警告框。如果攻击者将恶意脚本编写得更复杂,例如,还可以将管理员的 Cookie 等敏感信息发送到攻击者的服务器,进而可能实现会话劫持等更严重的攻击。
  • 修复方法:

    • 在submit.php页面中,对用户输入的数据进行严格的过滤和转义,使用htmlspecialchars函数将特殊的 HTML 字符转换为 HTML 实体,例如:
    php 复制代码
    $name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF - 8');
    $message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF - 8');
    • 在view.php页面中,同样对从数据库中取出并要输出到页面的数据进行转义处理,再进行显示,以确保恶意脚本不会被执行。

    3.DOM型XSS

    DOM XSS 比较特殊。 owasp 关于 DOM 型 XSS 的定义是基于 DOM 的 XSS 是一种 XSS 攻击,其中攻击的payload 由于修改受害者浏览器页面的 DOM 树而执行的。其特殊的地方就是 payload 在浏览器本地修改DOM 树而执行,并不会传到服务器上,这也就使得 DOM XSS 比较难以检测。

    原理

    基于文档对象模型(DOM)的一种漏洞。这种XSS与反射型XSS、存储型XSS有着本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠浏览器端的DOM解析,客户端的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。

    特点
    • 不经过服务器:恶意脚本的注入和执行完全在前端完成,服务器未参与数据存储或输出,因此传统的服务器端过滤可能失效。
    • 依赖前端 JavaScript :漏洞根源是前端代码对 DOM 操作的不安全处理,需重点关注innerHTML、outerHTML、document.write()等危险 API 的使用。

    非持久性

    数据流量:URL--->浏览器

    案例

    场景假设:

    一个简单的网页,功能是 "搜索结果展示":用户输入搜索关键词后,页面通过 JavaScript 直接从 URL 的search参数中读取内容,并动态插入到页面 DOM 中,用于显示 "您搜索的内容是:XXX"

    漏洞代码(前端 HTML)

    html 复制代码
    <!DOCTYPE html>
    <html>
    <head>
        <title>DOM型XSS示例</title>
    </head>
    <body>
        <h1>搜索结果</h1>
        <!-- 显示搜索关键词的区域 -->
        <div id="searchResult"></div>
    
        <script>
            // 从URL中获取search参数的值(例如:?search=test)
            function getParameter(name) {
                const urlParams = new URLSearchParams(window.location.search);
                return urlParams.get(name);
            }
    
            // 直接将参数值插入到页面DOM中
            const searchTerm = getParameter('search');
            document.getElementById('searchResult').innerHTML = `您搜索的内容是:${searchTerm}`;
        </script>
    </body>
    </html>

    漏洞分析

    代码的核心问题在于:通过innerHTML直接将用户可控的search参数值插入到 DOM 中,且未做任何过滤或转义。

    • innerHTML会将内容解析为 HTML 并执行其中的脚本,而非当作纯文本处理。
    • 用户输入的内容(通过 URL 参数search传递)完全可控,攻击者可构造恶意脚本。

    攻击过程

    1.攻击者构造恶意 URL

    攻击者在search参数中插入恶意 JavaScript 代码,例如:

    html 复制代码
    http://example.com/search.html?search=<script>alert('DOM XSS攻击成功')</script>

    2.受害者访问 URL

    当受害者点击该 URL 时,页面通过 JavaScript 读取search参数的值,并通过innerHTML插入到searchResult节点中。

    3.恶意脚本执行

    浏览器解析页面时,会将