使用ESAPI执行器时如何使用运算符>>?

How to use the operator >> while using the ESAPI executor?

同时使用 ESAPI 执行器 运行 一个简单的命令,例如:

C:\Windows\System32\cmd.exe /c echo test >> D:\wow\test.txt

C:\Windows\System32\cmd.exe是可执行文件。 和 /c echo test >> D:\wow\test.txt 是参数。 问题是 codec 破坏了运算符 >>(这意味着避免它或将其作为字符串引用。所以输出将只是打印 "test >> D:\wow\test.txt".

编解码器正在做它应该做的事情。也许一个过于简单的例子可以更清楚地说明为什么这是正确的行为。

假设您有一个 Web 应用程序,用户在其中上传文档,然后您 运行 为他们对其进行拼写检查并将更正后的结果发回给他们。为了简单起见,左边假设您已将当前工作目录设置为特定于使用您的服务的每个用户,并且您有一个 "spellcheck.bat" 将单个文件名作为参数并且您计划执行该字符串:

C:\Windows\System32\cmd.exe /c C:\spelling\spellcheck.bat userFilename > spelling-errors.txt

其中 userFilename 是用户上传文件的名称。您的意图是将 运行 spellcheck.bat 与用户上传的文件和文件名一起读取并显示 'spelling-errors.txt' 文件返回给用户。 (IRL,这可能是不同目录中的一个临时文件,但我想让它变得简单。)

那么如果 'userFilename' 包含“>”字符会怎样?您肯定希望适当地引用它,不是吗?因为否则攻击者可能会覆盖一些您不想覆盖的文件,包括 web.xml 或其他配置/属性文件。因为 运行ning 像(说)

C:\Windows\System32\cmd.exe /c C:\spelling\spellcheck.bat myDoc.txt >sucker.txt > spelling-errors.txt

将创建 'sucker.txt',如果该文件名存在,它将被 t运行 分类并替换为 "spellcheck.bat myDoc.txt" 的输出。这可能不是你想要的。

因此,旨在防止通过“<”、“<<”、“>”和“>>”进行文件 I/O 重定向操作。如果你真的想要允许它们(我建议不要这样做),那么你将不得不根据你想要允许的内容来解析你自己的命令字符串。

此外,虽然我不确定 Window 的 cmd 提示符 shell 是否正确,但对于 *nix shells 也确实可以这样做作为文件重定向的一部分在重定向中执行命令。例如,在bash中,我可以这样做

cat < $(ls foo)

如果文件'foo'存在,'ls foo'命令将列出输出foo,所以这个命令变成:

cat < foo

我们最终从文件 'foo' 中获取 'cat' 命令的标准输入。但是攻击者可以用它做一些更邪恶的事情。当然,OS 编解码器也会阻止 '$(...)' 样式的命令替换,但我希望我已经表达了我的观点。