在本节中,我们将解释存储型XSS,描述存储型XSS攻击的影响,并说明如何找到存储型XSS漏洞。
1. 什么是存储型XSS
当应用程序从不受信任的源接收数据并以不安全的方式将该数据包含在稍后的HTTP响应中时,存储型XSS(也称为二阶或持久型XSS)就会出现。
假设一个网站允许用户在博客文章上提交评论,这些评论将显示给其他用户。用户通过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> 攻击者提供的脚本随后将在受害用户的浏览器中,在他们与应用程序的会话背景下执行。
2. 存储型XSS的影响
如果攻击者可以控制在受害者的浏览器中执行的脚本,那么他们通常可以完全攻击该用户。攻击者可以执行适用于反射型XSS漏洞影响的任何操作。
就可利用性而言,反射型XSS和存储型XSS之间的关键区别在于,存储型XSS漏洞支持应用程序本身中自包含的攻击。攻击者不需要找到一种外部方式诱导其他用户访问包含他们攻击的特定请求。相反,攻击者将他们的攻击放到应用程序本身中,然后简单地等待用户访问到它。
在XSS漏洞只影响应用程序当前登录用户的情况下,与存储型XSS攻击自包含特性尤其相关。如果XSS是反射型,那么攻击必须是偶然的: 用户在未登录时被诱导发出攻击者的请求,将不会受到危害。相反,如果是存储型XSS,则保证用户触发漏洞时是已登录状态。
3. 不同场景下的存储型XSS
有许多不同类型的存储型XSS。存储数据在应用程序响应中的位置决定了需要什么类型的payload来利用它,还可能影响漏洞的危害。
此外,如果应用程序在存储数据之前或在将存储的数据输出到响应中时,对数据执行一些校验或其他处理,这通常会影响所需的XSS payload的类型。
4. 如何测试存储型XSS漏洞
手动测试存储型XSS漏洞可能很有挑战性。你需要测试所有相关的“输入点”,攻击者可控制的数据可以通过这些“输入点”进入应用程序,以及测试所有的“输出点”,这些数据出现在应用程序的响应中。
应用程序的输入点包括:
参数或URL查询字符串和消息体中的其他数据。
URL中文件路径。
相比于反射型XSS, HTTP请求头可能无法被利用。
任何带外路由,攻击者可以通过这些路由向应用程序发送数据。存在的路由完全依赖于应用程序实现的功能:一个webmail应用程序将处理在电子邮件中收到的数据;显示Twitter订阅的应用程序可能会处理包含在第三方推文中的数据;而一个新闻聚合器将包括来自其他网站的数据。
存储型XSS攻击的输出点可能响应给应用程序的任意用户。
测试存储性XSS的第一步是找出输入点和输出点之间的关联。这之所以具有挑战性是因为:
提交到任何输入点的数据原则上可以从任何输出点输出。例如,用户提供的显示名可能出现在只对某些应用程序用户可见的审计日志中。
由于应用程序内执行的其他操作,当前存储的数据经常容易被覆盖。例如,搜索功能可能显示最近搜索的列表,当用户执行其他搜索时,这些列表会迅速被替换。
要全面识别输入点和输出点之间的关联,需要分别测试每个排列,向输入点提交一个特定的值,直接导航到输出点,并确定该值是否出现在那里。但是,这种方法在多个页面的应用程序中并不实用。
相反,更实际的方法是通过系统的测试每个数据输入点,向每个输入点提交特定的值,并监视应用程序的响应,以检测提交值出现的情况。可以特别关注相关的应用功能,如博客文章的评论。当在响应中观察到提交的值时,你需要确定数据是否存储在不同的请求中,而不是简单地反射在即时响应中。
当你在应用程序的处理中确定了输入点和输出点之间的关联后,需要对每个关联进行专门测试,以检测是否存在存储型XSS漏洞。这涉及到确定存储数据出现在响应中的位置,并测试适用于该环境下的XSS payload。此时,测试方法与寻找反射型XSS漏洞大致相同。




