这对于自动扫描工具来说非常常见。他们只能如此聪明,因此总是会发生误报(就像漏报一样)。因此,任何标记的漏洞都应手动验证。这就是为什么,例如,漏洞赏金计划总是有“不考虑自动扫描程序的结果”之类的通知——运行扫描程序并报告漏洞很容易,但安全团队可能已经这样做了,所以 99% 的时间这是浪费时间。然而,这导致了下一个问题:
这个特定的脚本是否正确处理了这个输入?
这是一个很难回答的问题。您已经检查了最明显的解决方法(注入双引号),但还有更多选择。我想到的两个是字符编码的修改和反斜杠的测试。前者有点远,所以我只关注后者:
- 尝试在输入末尾注入反斜杠
?search=whatever\
- 如果应用程序没有转义您的反斜杠,则 javascript 将是:
var search = "whatever\";
- 这将破坏javascript。如果幸运的话,它还可以让您通过第二个参数注入 XSS。
最后一步可以举个例子。想象一下完整的 javascript 是这样的:
var a="[search input]";var b="[name input]";
需要明确的是,代码已被最小化以节省带宽。这将很重要。此外,两者都没有逃脱反斜杠。因此,您可以将这样的有效负载放在一起:
?search=\&name=;alert(1)//
你最终会得到这个 javascript:
var a="\";var b=";alert(1)//";
这是一个有效的 XSS 有效负载。您的反斜杠转义了var a = "
语句的结束双引号,因此第二个变量的起始双引号最终成为结束双引号。结果,您对第二个输入的输入最终以纯 javascript 的形式执行 - 您只需要以分号结尾,然后是注释字符即可摆脱最后的结束双引号。
现在你可能不会有任何运气让它工作。如果他们也正确处理反斜杠,那么您将不会有任何运气。如果这些行被分成单独的行,那么你也不会有任何运气(在大多数版本的 javascript 中,需要一个续行字符,但有时这里有一些非标准的浏览器行为)。但是,如果他们忘记转义反斜杠并且您可以在同一行上找到两个输入,那么您就有一个简单的 XSS 漏洞。
概括
确实,尽管这突出了主要内容,这就是为什么这些事情如此棘手:所需的利用类型在数据注入的上下文中差异很大,并且自动扫描仪实际上不可能测试所有内容。因此,作为渗透测试人员,您必须熟悉所有选项,这非常棘手!幸运的是,这也是 XSS 如此普遍的原因——程序员同样不善于理解他们必须小心防范 XSS 漏洞的所有方法。