在不使用文字斜杠的情况下关闭 HTML 元素?

信息安全 javascript xss
2021-08-28 12:48:35

我正在调查应用程序中的一个漏洞,该漏洞在不清理文件名的情况下回显用户提供的文件名。

例如,一个名为的文件test-<script>alert("evil");.txt将导致该文本回显到 XHTML 中。(以防万一,此特定文档以 text/html 形式提供,文档类型为 xhtml1-transitional。)

问题是<script>标签无法关闭,因为文件名不能包含/. 这意味着脚本没有被执行,因为后面的所有内容都是脚本的一部分,所有的 HTML 都将是无效的 JS。

(FWIW,我也在研究使用 subdirs 作为将斜杠放入应用程序的一种方式,但它似乎在显示之前从文件中删除了 dirname。呵呵——有一个名为的文件./<script>alert("evil subdir?");</script>.txt让我感到有点恶心。 ..)

基于一些XSS 备忘单,我尝试了几种编码斜杠的方法,以便它可以出现在文件名中,但仍被 HTML 解析器解释为结束标记。没有运气; 字符被逐字插入 HTML 中,无需任何中间编码/解码。

即使没有斜线,我也找到了三四种利用它的方法,但到目前为止,它们需要用户与该元素进行交互(例如onmouseover)。它们还使页面变得丑陋,因为标签结构分崩离析。如果我可以关闭标签,则漏洞利用既不可见又是自动的。

是否有任何标准(即 XSS 过滤器规避)技术来关闭我缺少的不带引号的标签?

1个回答

这里还有一些你可以尝试的。我打赌其中一个会起作用(事实上,我敢打赌第一个会起作用,然后你就可以停止阅读了):

  • 试试<img src="" onerror="alert(0)">不涉及用户交互。

  • 你太容易放弃了onmouseover创建一个覆盖大部分页面的巨型元素,然后使用onmouseover. 虽然在技术上涉及用户交互,但我认为你可以让它几乎是自动的。

  • 尝试onreadystatechange,例如,<iframe onreadystatechange=alert(0)>它仅限 IE(我认为是 IE7 及更高版本)但功能强大

  • 尝试onfocus="alert(0)" autofocus,例如,<input autofocus onfocus=alert(0)>我不知道这是否会奏效。

  • 在 Opera 上,尝试<table background=javascript:alert(0)>. 它可能会起作用

  • 尝试<img src="javascript:alert(0)"><iframe src="javascript:alert(0)">(不太可能在大多数浏览器上工作,但您可以尝试)。

  • 如果服务器未在 HTTP 响应的标头中指定内容编码类型,请尝试UTF-7 恶作剧(仅适用于旧版浏览器)。

请注意,这些技术可能高度依赖于浏览器。

如果您仍然卡住,请尝试在Sla.ckers上询问;有一群人在那里闲逛,他们对这类事情非常了解。对于基础知识,我推荐 RSnake 的XSS 备忘单有关更高级的 XSS 向量,请尝试Gareth Heyes 的博客和 Sla.ckers。