繁体   English   中英

使用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是参数。 问题是编解码器破坏了运算符>>(这意味着避免它或将其作为字符串引用。因此 output 将只是打印“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 或其他配置/属性文件。 因为运行类似(说)

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

将创建“sucker.txt”,如果该文件名存在,它将被截断并替换为“spellcheck.bat myDoc.txt”的 output。 那可能不是你想要的。

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

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

cat < $(ls foo)

如果文件“foo”存在,“ls foo”命令将列出 output foo,因此此命令变为:

cat < foo

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM