英雄背景无分隔线
准则

命中注入

现在让我们来看看命中注视本身。我们主要将关注几个不同的示例示例,这样可以更容易地看到实际的例子。因为这里,简要回顾一下,当用户输入使用操作系统命名命令的一部分(例如以下函数)时,就会出现命中注入漏洞:

let ip = request.params.IPAddress;

系统(“ping” + ip);

如果用户提供了 IP 地址,我们将以 8.8.8.8 为例,执行的命中将是 ping 8.8.8.8,这完全符合人们的期望值。但是,如果用户提供 `8.8.8.8 && ls /etc/ `,则此命令不会 公平 ping IP 8.8.8,但它也会在 `/etc/ 文件上运行 `ls`。

缓解措施

考虑到命中注入攻击的严重性,在使用系统统命时需要先问一些重要问题:

  • 你真的需要调用那个命令吗?最好的防御者是永远不可以调用系统命名令
  • 有没有任何 cu/biddex 可以让你在不使用系统统命令的情形下达到同样的效果吗?
  • 你能在而非命中通过标准版吗?本人将数据传送到流程中?

如果这些事不可能发生,那么参量化很重要。

例子

以下是一些不同语言的示例示例,可帮忙说明其在实话中的例子。

如果不使用参数数字化,则会受到命中注入的影响。

文件夹 = “/tmp/ && ifconfig”;
字符串 cmd = “\” ls “+ 文件夹 +”\ “”;

//不安全:同时执行 `ls` 和 `ifconfig` 命令
system.diagnostics.process.Start(“bash”,“-c” + cmd);

C#-安全

通过将命名作为参照数提供列表,可以对命名令进行参数字化并防止命中注入。

文件夹 = “/tmp/ && ifconfig”;
列表<string>参数 = 新建列表 <string>() {”-c”, “ls”, 文件夹};

//安全:不执行 ifconfig 命令
系统。诊断。进程。启动(“bash”,参数);

Java-不安全

如果不使用参数数字化,则会受到命中注入的影响。

文件夹 = “/tmp/ && ifconfig”;

//不安全:同时执行 `ls` 和 `ifconfig` 命令
ProcessBuilder b = 新的 ProcessBuilder(“bash-c ls” + 文件夹);

进程 p = pb.start ();

Java安全

通过将命名作为参照数提供列表,可以对命名令进行参数字化并防止命中注入。

文件夹 = “/tmp/ && ifconfig”;

//安全:不执行 ifconfig 命令
ProcessBuilder b = 新的 ProcessBuilder(“bash”、“-c”、“ls”,文件夹);

进程 p = pb.start ();

Javascript-不

如果不使用参数数字化,则会受到命中注入的影响。

const {exec} = require (“child_process”);

const 文件夹 = “/tmp/ && ifconfig”;

//不安全:同时执行 `ls` 和 `ifconfig` 命令
const ls = exec (“bash-c ls” + 文件夹,(错错,stdout,stderr)=> {
console.log (`stdout: $ {stdout} `);
});

脚本代码

const {spawn} = require (“child_process”);

const 文件夹 = “/tmp/ && ifconfig”;

//安全:不执行 ifconfig 命令
const ls = spawn(“bash”,[”-c”,“ls”,文件夹]);

ls.stdout.on (“数据”,数据 => {
console.log (`stdout: $ {data} `);
});

Python-不安全

如果不使用参数数字化,则会受到命中注入的影响。

导入子进度

文件夹 = “/tmp/ && ifconfig”

# 不安全:同时执行 `ls` 和 `ifconfig` 命令
subprocess.run(“bash-c ls” + 文件夹,shell=True)

Python-安全

通过将命名作为参照数提供列表,可以对命名令进行参数字化并防止命中注入。

导入子进度

文件夹 = “/tmp/ && ifconfig”

# 安全:不执行 ifconfig 命名令
subprocess.run([“bash”,“-c”,“ls”,文件夹])