关于 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,否则登录不登录,都可以绕过验证来操作了。