在php应用程序开发中不正当使用mail()函数引发的血案

在php应用程序开发中不正当使用mail()函数引发的血案_php_web-itnose

首页
asp
php
javascript
iis
apache
html/css
coldfusion
ajax
vbscript
cgi
xml/xsl
跨浏览器开发
ruby/rails
程序员
html5
jquery
seo
jboss
json
angularjs
markdown
nginx
thinkphp
yii
pageadmin
extjs
wampserver
kendo ui
coffeescript
gulp
ecmascript
bootstrap

itnose首页 > web > php >

在php应用程序开发中不正当使用mail()函数引发的血案

2017-05-04 20:14

前言

在我们 挖掘php应用程序漏洞 的过程中,我们向著名的webmail服务提供商 roundcube 提交了一个远程命令执行漏洞( cve-2016-9920 )。该漏洞允许攻击者通过利用roundcube接口发送一个精心构造的电子邮件从而在目标系统上执行任意命令。在我们向厂商提交漏洞,发布了相关的漏洞分析文章后,由于php内联函数mail()导致的类似安全问题在其他的php应用程序中陆续曝出。在这篇文章中,我们将分析一下这些漏洞的共同点,那些安全补丁仍然存在问题,以及如何安全的使用mail()函数。

浅析php的mail()函数

php自带了一个内联函数mail()用于在php应用程序中发送电子邮件。开发者可以通过使用以下五个参数来配置邮件发送。

http://php.net/manual/en/func…

bool mail( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters ]]这个函数的前三个参数这里就不细说了,因为这些参数一般情况下不会受到注入攻击的影响。但是,值得关注的一点是,如果$to参数由用户控制控制的话,那么其可以向任意电子邮件地址发送垃圾邮件。

邮件头注入

在这篇文章中我们重点分析后两个参数。第四个参数$additional_headers的主要功能是规定额外电子邮件报头。比如from、reply-to、cc以及bcc。由于邮件报头由crlf换行符rn分隔。当用户输入可以控制第四个参数,攻击者可以使用这些字符(rn)来增加其他的邮件报头。这种攻击方式称为电子邮件头注入(或短电子邮件注入)。这种攻击可以通过向邮件头注入cc:或bcc:字段造成发送多封垃圾邮件。值得注意的是,某些邮件程序会自动将n替换为rn。

为什么没有正确处理mail()函数的第5个参数会引发安全问题

为了在php中使用mail()函数,必须配置一个电子邮件程序或服务器。在php.ini配置文件中可以使用以下两个选项:

1.配置php连接的smtp服务器的主机名和端口

2.配置php用作邮件传输代理(mta)的邮件程序文件路径

当php配置了第二个选项时,调用mail()函数的将导致执行配置的mta(邮件传输代理)程序。尽管php内部可以调用escapeshellcmd()函数防止恶意用户注入其他的shell命令,mail()函数的第5个参数$additional_parameters允许向mta(邮件传输代理)中添加新的程序参数。因此,攻击者可以在一些mta中附加程序标志,启用创建一个用户可控内容的文件。

漏洞演示代码

mail(“myfriend@example.com”, “subject”, “message”, “”, “-f” . $_get[‘from’]);在上述代码中存在一个远程命令执行漏洞,这个问题容易被没有安全意识的开发人员忽略。get参数完全由用户控制,攻击者可以利用该处输入向邮件程序传递其他额外的参数。举例来说,在发送邮件的过程中可以使用-o参数来配置发送邮件的选项,使用-x参数可以指定日志文件的位置。

概念性验证(poc)

example@example.com -oqueuedirectory=/tmp -x/var/www/html/rce.php这个poc的功能是在web目录中生成一个php webshell。该文件(rce.php)包含受到php代码污染的日志信息。因此,当访问rce.php文件时,攻击者能够在web服务器上执行任意php代码。读者可以在 我们的发布的文章 和 这里 找到更多关于如何利用这个漏洞的相关信息。

最新相关的安全漏洞

在许多现实世界的应用程序中,有很多由于mail()函数的第五个参数使用不当引发的安全问题。最近发现以下广受关注的php应用程序受到此类漏洞的影响(多数漏洞由dawid golunski发现)。

由于一些广泛使用的web应用程序(如 wordpress, joomla和 drupal)部分模块基于以上库开发,所以也会受到该类漏洞的影响。

为什么escapeshellarg()函数没有那么安全?

php提供了 escapeshellcmd() 和 escapeshellarg() 函数用来过滤用户的输入,防止恶意攻击者执行其他的系统命令或参数。直观来讲,下面的php语句看起来很安全,并且防止了-param1参数的中断:

system(escapeshellcmd(“./program -param1 “. escapeshellarg( $_get[‘arg’] )));然而,当此程序有其他可利用参数时,那么这行代码就是不安全的。攻击者可以通过注入”foobar’ -param2 payload “来突破-param1参数的限制。当用户的输入经过两个escapeshell*函数的处理,以下字符串将到达system()函数。

./program -param1 ‘foobar’\” -param2 payload ‘从最终系统执行的命令可以看出,两个嵌套的转义函数混淆了引用并允许附加另一个参数param2。

php的mail()函数在内部使用escapeshellcmd()函数过滤传入的参数,以防止命令注入攻击。这正是为什么escapeshellarg()函数不会阻止mail()函数的第5个参数的攻击。 roundcube和 phpmailer的开发人员率先发布了针对该漏洞的补丁。

为什么filter_validate_email是不安全的?

另一种直接的方法是使用php的电子邮件过滤器(email filter),以确保在mail()函数的第5个参数中只使用有效的电子邮件地址。

filter_var($email, filter_validate_email)但是,并不是所有可能存在安全问题的字符串都会被该过滤器过滤。它允许使用嵌入双引号的转义的空格。

由于函数底层实现正则表达式的原因,filter_var()没有对输入正确的过滤,导致构造的payload被带入执行。

‘a.”‘ -oqueuedirectory=%0d -x/var/www/html/”@a.php对于上文给出的url编码输入,filter_var()函数返回true,将该payload识别为有效的邮件格式。

当开发人员使用该函数验证电子邮件格式作为唯一的安全验证措施,此时仍然是可以被攻击者利用的:与我们之前的攻击方式类似,在php程序发送邮件时,我们精心构造的恶意“电子邮件地址”会将将php webshell生成在web服务根目录下。

/): no such file or directory切记,filter_var()不适合用于对用户输入内容的过滤,因为它对部分字符串的验证是不严格的。

如何安全的使用mail()函数

仔细分析应用程序中传入mail()函数的参数,满足以下条件:

$to 除非可以预期用户的输入内容,否则不直接使用用户输入

$subject 可以安全的使用

$message 可以安全的使用

$additional_headers 过滤r、n字符

$additional_parameters 禁止用户输入

事实上,当把用户的输入作为shell指令执行时,没有什么办法可以保证系统的安全性,千万不要去考验你的运气。

如果在开发您的应用程序过程中第5个参数一定要由用户控制,你可以使用电子邮件过滤器(email filter)将用户输入的合法数据限制为最小字符集,即使它违反了rfc合规性。我们建议不要信任任何转义或引用程序,因为据历史资料表示 这些功能是存在安全问题的,特别是在不同环境中使用时,可能还会暴露出其他安全隐患。paul buonopane研究出了另一种方法去解决这个问题,可以在 这里找到。

总结

许多php应用程序都有向其用户发送电子邮件的功能,例如提醒和通知。 虽然电子邮件头注入是众所周知的安全问题,但是当开发人员使用mail()函数时,往往会忽视不正当的使用有可能导致远程命令执行漏洞。 在这篇文章中,我们主要分析了mail()函数的第5个参数使用不当可能存在的安全风险,以及如何防范这种问题,防止服务器受到攻击。本文由甲爪cpa联盟(www.jiazhua.com)整理编辑!

相关搜索:
java程序员在北京的工资
jsp中的注释
c++中的~
如何利用图表在股市中获利
c语言的应用

相关文章

2017-01-01 01:25 多个php mail函数引发的命令执行漏洞分析
2017-03-11 21:52 php在app开发中的应用
2017-02-15 14:51 确保 php 应用程序的安全
2014-02-09 11:13 json在php中的应用
2016-07-26 20:13 php中的基本函数使用【原创】

更多相关文章>>

最新文章

2017-06-20 01:35 老铁们,有没有可能让php文件同时只能一个人访问
2017-06-20 01:35 怎么禁止图片直接通过url访问
2017-06-20 01:35 求救!启动wamp只能用本机访问,同局域网的其它设备访问不到!搞了大半天t-t
2017-06-19 15:35 nginx下的thinkphp问题
2017-06-19 15:35 php form 文件上传

更多最新文章>>

热门搜索

c++的应用
人工智能中的图表推理
jsp应用开发详解
php程序员
php 数据库开发
数据库应用与开发
html5 移动应用开发
html5开发移动应用
数据库的开发
php程序员和java程序员
spring 3.x企业应用开发实战
j2me技术开发与应用
html5开发手机应用
疯狂的程序员
程序员的爱情

京icp备14022385号-2

©2014 itnose软件编程教程 | 联系我们:email:twobrushes@126.com qq:35155868

Posted in 未分类

发表评论