PHP的Path_info问题-Ti0s's Blog

本文主要讲述和记录PHP中path_info及其产生的安全性问题。

Path_info是什么?

Path_info是PHP的一种路由模式,需要PHP.ini中设置cgi.fix_pathinfo=1才能开启该路由模式。该路由模式的URL格式为http://www.Ti0s.com/index.php/模块/方法

Path_info的运行机制

Apache容器下

PHP的Path_info问题-Ti0s's Blog

那在Apahce容器下,Path_info有什么用呢?

  很多防火墙为了提高效率,遇到js,png,jpg等格式的后缀时,则不检测后面参数中是否有非法数据,因此我们可以构造http://www.Ti0s.com/index.php/aaa.js?id=union select 1,2,3,4来绕过防火墙进行注入,当然也可以绕过防火墙进行代码执行、命令执行等操作,其他的还需要由你自己来开发。

PHP的Path_info问题-Ti0s's Blog
PHP的Path_info问题-Ti0s's Blog

IIS和Nginx容器下

PHP的Path_info问题-Ti0s's Blog

在IIS和Nginx容器下,相比Apache少了一步对文件后缀的检测,因此产生了著名的安全问题CGI解析漏洞(也有称Nginx解析漏洞)。

  其漏洞的利用方式就是上传一个含Webshell的图片,然后在图片地址后面加上/a.php使图片当作PHP解析。

PHP的Path_info问题-Ti0s's Blog

当然,aa.php/aa.js也会把aa.php作为脚本,aa.js作为模块来解析执行的。

PHP的Path_info问题-Ti0s's Blog

  也可以构造aaa.jpg/aa.php/aa.js来用aa.js作为方法,aa.php不存在,因此aa.php作为模块,aaa.jpg被当作脚本来进行解析执行。

说明

  对于Path_info的工作机制的探讨,全部来自黑盒测试,可能与源码实现流程图有出入,但大体原理如此,也有些不能解释的问题,比如:都把Path_info路由模式交给PHP来处理的话,为什么在Apache容器下和在Nginx容器下处理结果会不同呢?(PS:Apache容器下是使用SAPI进行解析PHP的,而Nginx下是CGI模式解析PHP的)