Extract变量覆盖

Extract会将数组中的键值注册为变量。键名为变量名键值为变量值。Extract的选项中extr_skip如果没有使用的话。便会导致变量覆盖漏洞。

如:$_GET本来是一个数组,$GET[a]表示提交的a参数,$_GET[b]表示提交的b参数,当使用了extract($_GET)后,将变成$a$b两个变量,而且这两个变量的值会覆盖之前的同名变量

例1

title

可以看到$a的值已经被覆盖了 用法: 1.覆盖某些做判断的变量 2.覆盖服务器的$_SESSION之类的变量

例2

$flag='xxx'; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo'ctf{xxx}'; 
    }
   else
   { 
    echo'Oh.no';
   } 
   }
file_get_contents:远程获取获取文件,若没有则为空,构造
shiyan= &flag=1

例3

在Beecms V4.0_R_20150708中includes/init.php代码如下:

session_start();
header("Content-type: text/html; charset=utf-8"); 
@include(INC_PATH.'fun.php');
define('IS_MB',is_mb());

unset($HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
if (!get_magic_quotes_gpc())
{
    if (isset($_REQUEST))
    {
        $_REQUEST  = addsl($_REQUEST);
    }
    $_COOKIE   = addsl($_COOKIE);
    $_POST = addsl($_POST);
    $_GET = addsl($_GET);
}
if (isset($_REQUEST)){$_REQUEST  = fl_value($_REQUEST);}
    $_COOKIE   = fl_value($_COOKIE);
    $_GET = fl_value($_GET);
    $a='admin';
    $LANG_PATH='aaa';
@extract($_POST);
@extract($_GET);
@extract($_COOKIE);

session_start()初始化之后又对$_GET$_POST$_REQUESTS进行的extract,存在变量覆盖漏洞 之后来看看他的后台验证方式

function is_login(){
    if($_SESSION['login_in']==1&&$_SESSION['admin']){
        if(time()-$_SESSION['login_time']>3600){
            login_out();
        }else{
            $_SESSION['login_time']=time();
            @session_regenerate_id();
        }
        return 1;
    }else{
        $_SESSION['admin']='';
        $_SESSION['admin_purview']='';
        $_SESSION['admin_id']='';
        $_SESSION['admin_time']='';
        $_SESSION['login_in']='';
        $_SESSION['login_time']='';
        $_SESSION['admin_ip']='';
        return 0;
    }
}
验证session,导致可以覆盖变量进行登录绕过
title 然后就可以随意访问后台页面 title