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