您的示例提出了三个更容易理解的有趣问题
分开时。
首先,Windows允许在一行上执行多个语句
用“&”分隔。这可能会被用于注入攻击。
其次,ECHO 解析并解释传递给它的消息。如果消息是
“关”还是“/?”或者甚至是空白,那么 ECHO 将提供不同的预期
行为不仅仅是将消息复制到标准输出。
第三,您知道可以将代码注入到许多
可编写脚本的语言,包括批处理文件,并希望探索方法
识别它,以便您可以在代码中更好地防御它。
更容易识别事情发生的顺序
在您的脚本中,如果您在该语句之前和之后添加一条 echo 语句
你正在尝试注射。将其命名为 foo.bat。
@echo off
echo before
echo %1
echo after
现在,您可以更轻松地判断您的注入尝试是否在
命令行(不是注入)或作为参数的结果执行
扩展突破了 echo 语句并执行了新语句
(注射)。
foo dir
结果是:
before
dir
after
到目前为止还很正常。尝试使用 echo 解释的参数。
foo /?
结果是:
before
Displays messages, or turns command-echoing on or off.
ECHO [ON | OFF]
ECHO [message]
Type ECHO without parameters to display the current echo setting.
after
唔。 echo 命令的帮助。这可能不是预期的用途
echo 在该批处理文件中,但它不是注入。参数为
不用于“逃脱” echo 语句或的限制
批处理文件的语法。
foo dog & dir
结果是:
before
dog
after
[A spill of my current directory]
好吧,目录发生在脚本之外。不是注射。
foo ^&dir/w
结果是:
before
ECHO is off.
[A spill of my current directory in wide format]
after
现在,我们已经到达某个地方了。 dir 不是 ECHO 的函数,而是
在 before 和 after 语句之间运行。让我们尝试一下
更具戏剧性,但仍然基本无害。
foo ^&dir\/s
哎呀!您可以传递可能影响的任意命令
您的系统性能都在一个看似无害的“echo %1”中。