这是我在 C 中的代码:
snprintf(buffer, 1023, "ls -%s", argv[1]);
system(buffer);
如何清理缓冲区,以便除了给出的内容之外没有人可以运行恶意命令?
不幸的是,这是一个非常大的话题,不可能在 SO 问题中涵盖。幸运的是,有一本关于 C 和 C++ 中的安全编码的非凡书籍。那本书被用作我公司安全编码课程的“教科书”,非常好。
有几十种不同的方法来清理输入,而最好的选择几乎完全取决于输入的来源和使用方式。在将它传递给 system() 的地方,您需要深入研究,并且您真的应该让安全工程师审查您的设计。原因是ls
二进制文件中可能存在仅使用标准字符即可触发的可利用漏洞,或者可能存在您不知道的缓冲区溢出漏洞等。
专门针对您的场景,只寻找最简单的攻击,如果您递归删除 all ;
&&
||
$
(
)
,您可以轻松击败我能想到的大部分攻击。请注意,尽管这并不能防止利用您将输入作为 arg 传递给的二进制文件(在本例中为ls
),但它只能防止具有特殊含义并允许执行任意命令。
在一般情况下,这是不可能的。C 标准没有对谁在解释通过的命令做出任何声明system
。例如,如果您为承载的 shell 编写转义函数,那么这在 Windows 系统或使用不同命令 shell 的系统上可能完全没用。