此代码中是否存在任何安全漏洞?

时间:2014-07-13 01:34:26

标签: security

它是这样的:

exec("echo '" + param + "' > /etc/test")

请注意,它具有root权限,param已过滤了以下字符:

'
"
;
`
&

2 个答案:

答案 0 :(得分:1)

如果没有更多背景信息,您的问题将无法得到是/否答案。没关系;相反,让我们寻找弱点并突出需要关注的领域。

问题1:避免将不受信任/外部提供的数据传递给shell命令几乎总是更好;如果有人设法用糟糕的输入来破坏你的命令,那么shell会提供危险的权力。在您自己的代码中打开并编写文件,而不是使用shell来执行此操作。

问题2:如果不知道命令行将由哪个shell评估,就不可能说exec()是否安全。

问题3:如果必须通过shell传递数据(但请参见问题1),强大的过滤至关重要。但是根据你对过滤的简短描述,听起来好像是将已知的坏人物列入黑名单 - 这是一种糟糕的方法,将已知良好的角色列入白名单并将其保持在一个非常有限的集合(例如字母数字)中总是更好。 / p>

答案 1 :(得分:0)

如果未指定PATH,则无法确定执行了哪个命令。你也没有说你如何消毒param。有几件事要避免:

  • 为什么要使用exec / echo?任何编程语言都可以直接写入文件。
  • "单个字符串" exec()方法需要处理解析/转义。如果你使用一个使用字符串数组的方法,你不需要关心它。
  • 在你的情况下/ etc是一个安全的目录,但是如果你在一个受保护较少的目录上使用相同的代码,你可能会遵循一个符号链接并销毁攻击者想要的任何东西
  • 您应该知道新创建的文件的内容包含空白分隔文件名,但文件名可以包含空格。因此,恶意攻击者可以生成新的(不存在的)名称。 (事实上​​,除了\ 0之外的所有字符(包括换行符)都可以是文件名的一部分。)
  • 您需要设置干净(即仅添加列入白名单的条目)环境。 LD_PRELOAD,PATH,IFS,CWD / PWD或SHELL都可能受到污染。