<script> 标签怎么可能被注入,但没有被执行?

信息安全 Web应用程序 xss
2021-08-29 02:13:55

我最近测试了一个 Web 应用程序,发现它容易受到存储型 XSS 攻击。然而,一个奇怪的行为让我有点困惑。当我插入时John <script>alert(1)</script>Doe,我的浏览器显示确实正确注入了脚本标签,但没有弹出警报。

插入John <img src=x onerror=alert(1)>Doe时,加载后立即弹出警报。

到目前为止我排除了什么

  • 转义:我认为<script>标签可能已转义,但由于某种原因未呈现,但我的代理确认标签未转义。
  • CSP:我想到一个 CSP 可能已经到位,但没有,而且如果它阻止了注入的<script>标签,它也会阻止注入的<img>标签。
1个回答

几种可能的解释:

  • CSP:检查标题元标记。我同意 onerror 执行使它不太可能,但我不确定它是否不可能。

  • 浏览器 XSS 过滤器:只有在执行反射型 XSS 时才会出现问题。关闭它们,或使用没有 XSS 过滤器的浏览器。

  • 格式错误的 HTML:您确定 script 标签实际上被解释为标签吗?文档中其他地方的编码问题、转义或格式错误的 HTML 可以阻止这种情况发生。要检查是否是这种情况,请使用开发人员工具查看 DOM 中是否确实存在脚本标记。

  • innerHTML:脚本标签如何在您的 DOM 中结束?它是在客户端上使用 JavaScript 和innerHTMLinsertAdjacentHTML还是类似的?如果是这样,MDN 上的以下注释解释了该问题:

    HTML5 规定<script>不应执行插入有 innerHTML 的标记。

    请注意,您和设置innerHTML. 要执行脚本,您必须通过创建script元素createElement并将其显式附加到 DOM。