关于鸡肋文件包含的思考
前言
1 | $file = $_GET['file']; |
一个CMS中出现上面这样的代码,首先想到的应该是php版本小于5.3.4中利用%00
截断包含文件。那么,如果我们正常的区包含一个php文件,又有那些用法呢?
正文
包含shell文件
第一次做CMS审计的时候便遇到了这样的情况,那个CMS采用的是ZendFramework框架,只有根目录下的文件可访问执行,找到一个任意文件写入Shell后却无法访问到,正好看过ph的审计文章,于是我果断去找到了类似这么一处鸡肋文件包含点来帮忙,成功拿下
包含install.php
绝大多数的CMS安装后,均会创建一个锁文件,然后在install.php中写入判断代码防止重装。但是有很多代码是采用的判断锁文件相对路径,类似如下这样:
1 | if(file_exists('./install.lock')){ |
这种情况下,如果我在其他目录下找到一个鸡肋文件包含点,对install.php进行包含,判断锁文件时,以包含点的文件出发,锁文件就被判断为不存在了,导致我们就可以执行后面的安装代码了
相应的操作类似如下这样:
虽说我们绕过了对锁文件的判断,但是实际会收到很大限制,最大问题的就是Install.php文件通常也会使用相对路径载入一些相关文件,文件不存在则会终止掉php脚本,除非引入相关文件使用的是include和include_once
这里拿metinfo的代码做演示:
1 | if(file_exists('../config/install.lock')){ |
如果成功包含该文件,判断锁文件之前是metinfo自己写的很多安装用的函数,不会影响包含后进入下面的代码。install.php中的代码本身就存在很大的风险
就比如这里的配置文件写入,利用*/phpinfo();/*
即可写入一个shell,可惜并没有一个好的方法创建一个完美的config文件夹供代码写入。总之,绕过锁文件后,就可能利用到其中的危险代码
其他
仔细想想,使用上面点还可以有很多骚操作,遇到再补充~
结尾
开发过程中,这样的点最好不要出现,有也得添加限制,另外,install目录这种东西不要出现在线上