Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是存储型跨站脚本?
  • 存储型XSS攻击的影响
  • 不同上下文中的存储型XSS
  • 如何发现和测试存储型XSS漏洞
  1. 客户端主题
  2. 跨站脚本(XSS)

存储型XSS

在本节中,我们将讲解存储型跨站脚本,描述存储型XSS攻击的影响,并阐明如何发现存储型XSS漏洞。

什么是存储型跨站脚本?

存储型跨站脚本(又称为二阶或持久型XSS)发生在当应用程序从不可信的来源接收数据,并以不安全的方式将这些数据包含在其后续的HTTP响应中时。

假设一个网站允许用户在博客文章上提交评论,而这些评论会显示给其他用户。用户使用类似如下HTTP请求提交评论:

POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Length: 100

postId=3&comment=This+post+was+extremely+helpful.&name=Carlos+Montoya&email=carlos%40normal-user.net

在这个评论被提交之后,任何访问该博客文章的用户都会在应用程序的响应中收到以下内容:

<p>This post was extremely helpful.</p>

假设应用程序不对数据进行任何其他处理,攻击者就可以提交如下恶意评论:

<script>/* Bad stuff here... */</script>

在攻击者的请求中,此评论将被URL编码为:

comment=%3Cscript%3E%2F*%2BBad%2Bstuff%2Bhere...%2B*%2F%3C%2Fscript%3E

现在,任何访问该博客文章的用户都会在应用程序的响应中收到以下内容:

<p><script>/* Bad stuff here... */</script></p>

然后,攻击者提供的脚本就会在受害用户的浏览器中,在其与应用程序的会话环境中执行。

LAB

存储型XSS攻击的影响

如果攻击者能够控制受害者浏览器中执行的脚本,那么通常他们就可以完全控制该用户。攻击者可以执行任何适用于反射型XSS漏洞影响的操作。

就可利用性而言,反射型和存储型XSS之间关键的区别在于,存储型XSS漏洞使得攻击在应用程序内部自包含。攻击者无需寻找外部方式来诱导其他用户发起包含攻击者利用代码的特定请求。相反,攻击者将他们的利用代码放入应用程序本身中,然后等待用户遭遇到它。

在当XSS漏洞只影响当前已登录应用程序的用户的情况下,存储型跨站脚本攻击的自包含性就显得尤为重要。如果XSS是反射型的,那么攻击必须有幸运的时机:如果用户在未登录时被诱导发起攻击者的请求,他们将不会受到攻击。相比之下,如果XSS是存储型的,那么用户在遭遇到利用代码时肯定是已经登录了的。

阅读更多

不同上下文中的存储型XSS

存储型跨站脚本有许多不同的类型。被存储的数据在应用程序响应中的位置,决定了利用它所需的有效载荷类型,并且还可能影响漏洞的影响。

此外,如果应用程序在数据存储之前或在将存储的数据合并到响应中时,对数据进行了任何验证或其他处理,通常会影响所需的XSS载荷类型。

阅读更多

如何发现和测试存储型XSS漏洞

使用Burp Suite的Web漏洞扫描器可以发现许多存储型XSS漏洞。

手动测试存储型XSS漏洞可能具有挑战性。你需要测试所有相关的入口点(攻击者可控的数据可通过这些点进入应用程序的处理)以及所有的出口点(在这些点,数据可能出现在应用程序的响应中)。

进入应用程序处理的入口点包括:

  • URL查询字符串和消息正文中的参数或其他数据。

  • URL文件路径。

  • 在反射型XSS中可能无法利用的HTTP请求标头。

  • 任何攻击者可通过非常规通信渠道向应用程序传递数据的途径。存在的途径完全取决于应用程序实现的功能:一个电子邮件应用程序会处理邮件中收到的数据;一个显示Twitter信息流的应用程序可能会处理第三方推文中包含的数据;一个新闻聚合器会包含来自其他网站上的数据。

存储型XSS攻击的出口点是指,在任何情况下返回给所有应用程序用户的所有可能的HTTP响应。

测试存储型XSS漏洞的第一步是找到入口点和出口点之间的连接,通过这种连接,提交到入口点的数据从出口点发出。之所以说这具有挑战性,原因在于:

  • 原则上,提交到任何入口点的数据都可能从任何出口点发出。例如,用户提供的显示名称可能出现在一个只对某些应用程序用户可见的晦涩难懂的审计日志中。

  • 当前应用程序存储的数据往往容易因应用程序中执行的其他操作而被覆盖。例如,搜索功能可能会显示一系列最近的搜索,这些搜索很快就会被用户进行的其他搜索而替换。

要全面地识别入口点和出口点之间的连接,需要分别测试每种排列组合,将特定值提交到入口点,直接导航到出口点,并确定该值是否出现在那里。然而,对于不止几个页面的应用程序,这种方法并不切实际。

相反,更现实的方法是系统地遍历数据入口点,向每一个入口点提交一个特定值,并监控应用程序的响应,以检测提交的值出现的情况。可以特别关注应用程序相关的功能,如博客文章的评论。当在响应中观察到提交的值时,你需要确定数据是否确实被存储在不同的请求中,而不仅仅是简单反射在紧接着的响应中。

在确定了应用程序处理过程中入口点和出口点之间的连接后,需要对每个连接进行特定的测试,以检测是否存在存储型XSS漏洞。这涉及到确定响应中存储数据出现的上下文,并测试适用于该上下文的合适候选XSS载荷。在这一点上,测试方法与发现反射型XSS漏洞的方法基本相同。

Previous反射型XSSNext基于DOM的XSS

Last updated 1 year ago

存储型XSS到无任何编码的HTML上下文
利用跨站脚本漏洞
跨站脚本上下文