关于PHP程序install重复安装漏洞

一般的PHP程序为了方便用户使用,都提供了安装功能。一般通过以下访问安装:

http://xxx/installhttp://xxx/install.php

但是,如果install程序没做好安全防范,我们就有机可趁。为了防止重复安装,一般在执行了install之后,会在目录下生成一个文件,再次访问install的时候,如果目录下存在该文件,则无法安装。

我们看以下代码:

$lockfile = "i.lock";
if(file_exists($lockfile)){
 header("Location: index.php");
 ...
}

如果目录存在i.lock,那么则通过HTTP消息跳转到index.php。但是,在执行header函数后,并没有执行exit函数,所以,后面的代码会继续执行。再看安装代码:

if($_POST['action'] == "install"){//安装提交
if($_POST['mydbhost']!=""&&$_POST['mydbuser']!=""&&$_POST['mydbname']!=""&&$_POST['mydbpre']!=""&&$_POST['site_name']!=""&&$_POST['site_url']!=""&&$_POST['admin']!=""&&$_POST['password']!=""){//检查数据是否为空
$link =
@mysql_connect($_POST['mydbhost'],$_POST['mydbuser'],$_POST['mydbpw']);

这些POST内容都是我们可以控制的。通过Burp suite的Repeater功能,我们可以自己构造这些POST数据。比如数据库可以设置成我们自己搭建的远程数据库,然后就可以覆盖配置信息了。

所以,在使用header函数跳转之后,一定要加exit退出脚本。比如在后台判断session的地方,如果没有登录,就通过header函数跳转到登录页面,这个时候一定要exit,否则登录不登录,都可以绕过验证来操作了。