register_globals利用会话数组

时间:2014-01-26 19:21:22

标签: php web-applications webserver register-globals

我有一个PHP脚本,它执行一些命令来验证用户是否已被记录。

if (( isset ($password) && $password!="" && auth($password,$hidden_password)==1) || (is_array($_SESSION) && $_SESSION["logged"]==1 ) ){
    $aff=display("you're logged in);
} else {
    $aff=display("you're not logged in");
}

如果我的php.ini中的register_globals设置为1,并希望注入某些内容到URL中以便每次都进行身份验证,无论密码是什么,我该怎么办?

我已经尝试过:

  • site.com/page.php?password=pass&logged=1
  • site.com/page.php?password=pass&_SESSION["logged"]=array("1")
  • site.com/page.php?password=pass&hidden_password=pass ==>返回“你没有登录”,但问题是我不想覆盖Hidden_​​Password(我需要它!)
  • 我还尝试使用Cookie和其他http标头,但没有结果

任何提示?

2 个答案:

答案 0 :(得分:3)

刚试过site.php?_SESSION[logged]=1,它确实有效!

当register_globals设置为1时,您可以使用GET方法修改全局变量。

所以是的,如果你确定的话,不要编辑这个选项;)

答案 1 :(得分:0)

使用此代码,您可以检查register_globals是否设置为1并检查是否有人试图覆盖某些GLOBALS - 如果是,脚本将重置此并退出:

if ( ini_get( 'register_globals' ) ) {
  if ( isset( $_REQUEST['GLOBALS'] ) ) {
    die( '<a href="https://stackoverflow.com/q/21368051/5201919">$GLOBALS overwrite vulnerability</a>');
  }
  $forbidden = array(
    'GLOBALS',
    '_SERVER',
    'HTTP_SERVER_VARS',
    '_GET',
    'HTTP_GET_VARS',
    '_POST',
    'HTTP_POST_VARS',
    '_COOKIE',
    'HTTP_COOKIE_VARS',
    '_FILES',
    'HTTP_POST_FILES',
    '_ENV',
    'HTTP_ENV_VARS',
    '_REQUEST',
    '_SESSION',
    'HTTP_SESSION_VARS'
  );
  foreach ( $_REQUEST as $name => $value ) {
    if( in_array( $name, $forbidden ) ) {
      header( "HTTP/1.x 500 Internal Server Error" );
      die("SECURITY ERROR trying to overwrite superglobals");
    }
    unset( $GLOBALS[$name] );
  }
}