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