防止命令行注入攻击

bmu*_*976 9 security command-line code-injection

我们目前正在构建一个执行许多外部工具的应用程序.我们经常要将用户输入我们系统的信息传递给这些工具.

显然,这是一场等待发生的大安全噩梦.

遗憾的是,我们还没有在.NET Framework中找到执行命令行程序的任何类,同时提供与IDbCommand对象为数据库执行的注入攻击相同的防范.

现在,我们正在使用一个非常原始的字符串替换,我怀疑它是不够的:

protected virtual string Escape(string value)
{
      return value
        .Replace(@"\", @"\\")
        .Replace(@"$", @"\$")
        .Replace(@"""", @"\""")
        .Replace("`", "'")
      ;
}
Run Code Online (Sandbox Code Playgroud)

你们做了什么来防止命令行注入攻击?我们计划实现一个非常严格的正则表达式,只允许一小部分字符通过,但我想知道是否有更好的方法.

一些澄清:

  • 其中一些工具没有我们可以编程的API.如果他们这样做了,我们就不会遇到这个问题.
  • 用户不选择要执行的工具,他们输入我们选择使用的工具的元数据(例如,将诸如版权声明之类的元数据注入目标文件中).

Cur*_*her 5

您是直接执行程序还是通过shell执行程序?如果你总是通过给可执行文件提供完整的路径名来启动外部程序并使shell脱离等式,那么你就不会受到任何命令行注入的影响.

编辑:DrFloyd,shell负责评估反引号等内容.没有shell,没有shell评估.显然,你仍然必须意识到你正在调用的程序中存在任何潜在的安全问题 - 但我不认为这个问题就是这个问题.