我正在调查应用程序中的一个漏洞,该漏洞在不清理文件名的情况下回显用户提供的文件名。
例如,一个名为的文件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 过滤器规避)技术来关闭我缺少的不带引号的标签?