这个批处理文件注入了吗?

bar*_*lop 5 security command-line batch-file code-injection

C:\>batinjection OFF ^& DEL c.c
Run Code Online (Sandbox Code Playgroud)

batinjection.bat的内容为 ECHO %*

我听说过SQL注入,虽然我从来没有真正做过,但这是注入吗?是否有不同类型的注射,这是其中之一?

或者还有另一个技术术语吗?还是一个更具体的术语?

注意 - 之前的编辑有 C:\>batinjection OFF & DEL c.c(即没有^%)和ECHO %1(即没有%*)这是不正确的.我纠正了它.它不会影响答案.

pha*_*ers 7

您的示例提供了三个在分离时更容易理解的有趣问题.

首先,Windows允许通过用"&"分隔在一行上执行多个语句.这可能会用于注射攻击.

其次,ECHO解析并解释传递给它的消息.如果消息是"OFF"或"/?" 甚至是空白,那么ECHO将提供不同的预期行为,而不仅仅是将消息复制到stdout.

第三,你知道可以将代码注入许多可编写脚本的语言,包括批处理文件,并且想要探索识别它的方法,这样你就可以在代码中更好地防御它.

如果在您尝试注入的语句之前和之后添加echo语句,则更容易识别脚本中发生事件的顺序.叫它foo.bat.

@echo off
echo before
echo %1
echo after
Run Code Online (Sandbox Code Playgroud)

现在,您可以更轻松地判断您的注入尝试是在命令行执行(不是注入),还是由于参数扩展从echo语句中爆发并执行了新语句(注入)而执行的.

foo dir
Run Code Online (Sandbox Code Playgroud)

结果是:

before
dir
after
Run Code Online (Sandbox Code Playgroud)

到目前为止很正常.尝试一个echo解释的参数.

foo /?
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

嗯.帮助echo命令.它可能不是批处理文件中所需的echo,但它不是注入.这些参数不用于"逃避"echo语句或批处理文件语法的限制.

foo dog & dir
Run Code Online (Sandbox Code Playgroud)

结果是:

before
dog
after
[A spill of my current directory]
Run Code Online (Sandbox Code Playgroud)

好的,这个目录发生在剧本之外.不注射.

foo ^&dir/w
Run Code Online (Sandbox Code Playgroud)

结果是:

before
ECHO is off.
[A spill of my current directory in wide format]
after
Run Code Online (Sandbox Code Playgroud)

现在,我们已经到了某个地方.dir不是ECHO的函数,而是在before和after语句之间运行.让我们尝试一些更具戏剧性但仍然大部分无害的东西.

foo ^&dir\/s
Run Code Online (Sandbox Code Playgroud)

哎呀!你可以在一个看似无害的"echo%1"中传递一个可能影响你系统性能的任意命令.


jeb*_*jeb 4

是的,这是一种注入,这是批处理文件的大问题之一,大多数情况下它不是有目的的攻击,大多数时候您只是在某些字符或单词(例如OFF.

因此,您应该使用技术来避免此问题/漏洞。

在你的情况下,你可以将批处理文件更改为

set "param1=%*"
setlocal EnableDelayedExpansion
echo(!param1!
Run Code Online (Sandbox Code Playgroud)

我在这里使用echo(而不是echo.其他东西,因为它是所有附加内容的唯一已知的安全回显。

我使用延迟扩展!而不是百分比扩展,因为延迟扩展对于任何特殊字符始终是安全的。

要使用延迟扩展,您需要将参数传输到变量中,一个好的方法是在 set 命令周围使用引号,它可以避免许多特殊字符的问题(但不是全部)。

但要构建一种绝对安全的方式来访问批处理参数,该方式相当困难。
尝试让这个安全是很棘手的
myBatch.bat ^&"&"

您可以阅读SO:如何接收最奇怪的命令行参数?

主要思想是使用REMwhile 语句的输出ECHO ON
这在某种程度上是安全的,您无法注入代码(或者更好:只有真正先进的知识),但是如果您的内容是类似的,则可以更改原始内容。

myBatch.bat myContent^&"&"%a

将更改为myContent&"&"4