1

这是我在 C 中的代码:

snprintf(buffer, 1023, "ls -%s", argv[1]);
system(buffer);

如何清理缓冲区,以便除了给出的内容之外没有人可以运行恶意命令?

4

2 回答 2

1

不幸的是,这是一个非常大的话题,不可能在 SO 问题中涵盖。幸运的是,有一本关于 C 和 C++ 中的安全编码的非凡书籍。那本书被用作我公司安全编码课程的“教科书”,非常好。

有几十种不同的方法来清理输入,而最好的选择几乎完全取决于输入的来源和使用方式。在将它传递给 system() 的地方,您需要深入研究,并且您真的应该让安全工程师审查您的设计。原因是ls二进制文件中可能存在仅使用标准字符即可触发的可利用漏洞,或者可能存在您不知道的缓冲区溢出漏洞等。

专门针对您的场景,只寻找最简单的攻击,如果您递归删除 all ; && || $ ( ),您可以轻松击败我能想到的大部分攻击。请注意,尽管这并不能防止利用您将输入作为 arg 传递给的二进制文件(在本例中为ls),但它只能防止具有特殊含义并允许执行任意命令。

于 2013-05-15T20:42:10.323 回答
0

在一般情况下,这是不可能的。C 标准没有对谁在解释通过的命令做出任何声明system。例如,如果您为承载的 shell 编写转义函数,那么这在 Windows 系统或使用不同命令 shell 的系统上可能完全没用。

于 2013-05-16T17:18:33.970 回答