PHP的cgi.fix_pathinfo与安全漏洞

0x01.背景

PHP的配置文件中有一个Boolean参数——cgi.fix_pathinfo,其默认为1,即启用。
这个选项在一些服务器的一些情况下能被不怀好意者利用,具体方法如下

  1. 服务器具有上传点,且检查文件类型仅基于扩展名,而非Mime Type或文件内容。
  2. 骇客上传一个PHP的WebShell或其他恶意程序,但名为malicious.jpg,其被上传至{wwwroot}/upload/malicious.jpg
  3. 骇客访问{domain}/upload/malicious.jpg/not_exist.php(not_exist.php可被替换为*.php)
  4. malicious.jpg中的恶意代码被PHP解析器执行,骇客得手……

0x02.Web应用的防范

经过测试,WordPress的上传检查较为严格,将包含<?php的任何文件改扩展名均无法上传

……

0x03.HTTP服务器的防范

经过测试,在基于Apache/2.4.27+PHP-FPM/7.1.8的平台上该漏洞不可利用(not-exploitable)

首先设置/etc/php/7.1/fpm/php.inicgi.fix_pathinfo = 1,在网站根目录新建如下内容的文件e.jpg:

<?php
echo shell_exec("uptime");
?>

这段PHP代码若被执行,会Print出在Shell中输入uptime所得到的输出内容,形如:

 21:46:54 up 1 day, 52 min,  1 user,  load average: 0.00, 0.00, 0.00

然后访问{domain}/e.jpg/1.php,返回404,此漏洞不可利用.