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(即没有%*)这是不正确的.我纠正了它.它不会影响答案.
您的示例提供了三个在分离时更容易理解的有趣问题.
首先,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"中传递一个可能影响你系统性能的任意命令.
是的,这是一种注入,这是批处理文件的大问题之一,大多数情况下它不是有目的的攻击,大多数时候您只是在某些字符或单词(例如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