我正在阅读“Web应用程序黑客手册”,它讨论了一阶(又称反射)XSS和二阶(又称持久)XSS之间的差异。它提到了反映XSS如何利用查询字符串参数的不完整或不存在的清理来将任意脚本执行到用户的DOM中而不将任何恶意代码持久存储到应用程序的数据库中,以及二阶XSS实际上如何将该恶意代码保留为稍后在用户的DOM中执行。
我的问题涉及作者对二阶XSS的描述(第438页,如果你有一个方便的副本)。书中的描述指出:
对存储的XSS漏洞的攻击通常至少涉及到 对应用程序的两个请求。在第一个,攻击者发布了一些 制作包含应用程序存储的恶意代码的数据。在 第二,受害者查看包含攻击者数据的页面,以及 恶意代码在脚本执行时执行 受害者的浏览器。因此,有时也会出现漏洞 称为二阶跨站脚本。 (在这种情况下,“XSS”是 真的是用词不当,因为攻击没有跨站点元素。 [强调我的] 但名称被广泛使用,因此我们将在此保留。)
在二阶XSS中,攻击者仍然注入的恶意代码(可能)仍然是一些指向外部服务器的任意脚本(例如,注入一个img
标记,其src属性为{{1 }})。我很困惑为什么作者然后声明这个攻击没有跨站点元素。向恶意外部服务器发出请求在我看来似乎是一个合适的跨站点元素。我错过了什么吗?
答案 0 :(得分:1)
对我而言,XSS中的“跨站点”意味着恶意脚本本身直接从另一个站点发送。例如,在url参数上反映XSS的情况下,恶意网站A.com可以创建到受害者网站B.com的链接,其攻击是B的易受攻击参数,并且当用户访问A并单击链接时,他将在B上执行脚本。
所以我认为这不是关于恶意脚本正在做什么,而是它来自哪里(以及如何)。
在存储XSS的情况下,脚本通常直接在易受攻击的网站上输入,但情况可能并非总是如此,例如维护原始的“跨站点”元素。但没关系,名称是一样的,因为底层问题和代码中的解决方案是相同的,所以漏洞的名称也是一样的。 :)
无论人们如何称呼它,重要的是避免它。 :)