XSS(跨站脚本攻击)

XSS(跨站脚本攻击)

基本概念

XSS是一种将恶意脚本注入到其他用户浏览的网页中的攻击方式

分类

  • 反射型
    • 非持久化攻击
    • 典型场景
恶意URL:http://example.com/search?q=<script>alert(1)</script>
当用户点击该链接时,服务器返回的页面中包含未转义的搜索词,导致脚本执行
  • 存储型
    • 持久化攻击
    • 恶意脚本被永久存储再目标服务器上
    • 当其他用户访问包含该脚本的页面时触发
    • 典型场景
攻击者在论坛评论区提交:
<script>stealCookie()</script>
<script>alert(1)</script>
该评论被存入数据库,每当其他用户查看该评论页面时恶意脚本都会执行
  • Dom型
    • 完全在客户端执行,不涉及服务器
    • 恶意代码通过修改DOM环境在客户端执行
    • 典型场景
// 漏洞代码
document.write(location.hash.substring(1));
// 攻击者构造的URL
http://example.com#<script>alert(1)</script>
特征 反射型XSS DOM型XSS 存储型XSS
持久性 非持久 非持久 持久
触发方式 需要用户点击恶意链接 需要用户点击恶意链接 自动触发(访问被污染页面)
存储位置 不存储 不存储 服务器存储
传播范围 单个用户 单个用户 所有访问用户
防御难度 较易防御 较难检测 危害最大,需重点防御

常见位置

  • 会回显搜索内容的搜索框
  • 会回显用户数据的输入字段
  • 返回用户提供文本的错误消息
  • 包含用户提供数据的隐藏字段
  • 任何显示用户提供数据的页面
  • HTTP头部信息

危害

  1. 直接会话威胁
  2. 身份冒用风险
  3. 恶意代码执行
  4. 增强钓鱼攻击可信性
  5. 商业与法律风险

攻击流程

  • 反射型

识别漏洞位置,构造漏洞->诱导用户点击->网站未过滤,嵌入->恶意代码执行->数据 回传、利用

  • Dom型

区别在于漏洞构造和客户端执行阶段 ** 纯客户端,完全不接触服务器**

//构造恶意URL(通常包含hash或参数):
http://vulnerable-site.com#<img src=x onerror=stealCookie()>

// 漏洞代码示例
document.getElementById('content').innerHTML = 
    location.hash.substring(1);  // 不安全地插入hash内容

CrossSiteScriptingLesson1

靶场

1750652446456-4397dbc0-86d9-4eb9-860c-43cb8263bce2.png

1750652397865-3cf5ccf4-2c97-4bbd-95d5-13acbc71e5aa.png

把选项勾上就成功了

审计

1750652529399-ae3786e3-bc4e-493f-a55a-7c59a53fa84c.png

就是简单的检验一下传入的checkboxAttack1这个是否为空

CrossSiteScriptingLesson5a

一个基础的反射型XSS

靶场

1750654397757-d94490cc-0020-4818-a25e-9e3aed418bf7.png

先找一下漏洞点,发现在第一个输入框

1750654856018-21cf9816-cde9-481a-ad22-18217b559277.png

直接写入****就行

审计

1750655133431-81442ec2-bff1-4fb1-a427-e3950946a277.png

这里利用XSS_PATTERN判断语句是否有XSS尝试,如field2没有,field1有,则成功返回

XSS_PATTERN的定义

1750655230577-36fff640-b20a-4f11-8fd5-0a73e27ec018.png

这是一个大小写不敏感,严格匹配 结构以及只判断alert和console.log()两个特定函数的用于XSS过滤的正则表达式

CrossSiteScriptingLesson6a

由于DOM类型是纯客户端的,所以代码审计需要在前端里

先把涉及到的代码找到

1750657165336-c4184aea-08af-4c06-93cd-225d9931bf03.png

1750657798567-aed91953-bbac-4187-8834-4f81a5acc2f2.png

1750657861939-8e663727-ceb8-4273-9810-4584fb947a6a.png

完整的攻击链:URL参数 → testRoute → testHandler → showTestParam → innerHTML

1750658666398-b05a3195-7b65-4d6d-b6f0-700cb19f1c8c.png

后端仅检查格式**start.mvc#test/**,不检查内容

1750658806455-9588c203-6658-4112-a556-e57a32bb8e60.png

通过

DOMCrossSiteScriptingVerifier

审计

1750661455537-6cf5d22f-0ea4-4d74-bcb0-3335f7a33f31.png

重点看这个已经给出的函数,

发送POST请求到指定端点"CrossSiteScripting/phone-home-xss",携带固定此参数和特殊请求头,收到响应后在控制台输出结果··

1750662684958-e877eba0-a619-4b8e-8142-64be8a89378c.png

"CrossSiteScripting/phone-home-xss"用于生成随机数

1750661082789-4a35c0f7-5905-4218-a57f-2ac30cd83a10.png

这里是对随机数的匹配判断

靶场

1750662220107-e8e57db4-7918-42a1-a8fe-87d7b2a198b5.png

访问

http://127.0.0.1:8080/WebGoat/start.mvc#test/%3Cscript%3Ewebgoat.customjs.phoneHome%28%29%3C%2Fscript%3E

之后可以在控制台看到随机数,输入即可

更新: 2025-10-15 20:07:08
原文: https://www.yuque.com/cindahy/aqfzwf/dryt6gkow0mr7mmi

LICENSED UNDER CC BY-NC-SA 4.0
评论