1

我有一个 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");
}

如果在 my 中将 register_globals 设置为 1 php.ini,并且想要在 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 标头,但没有结果

有什么提示吗?

4

2 回答 2

3

刚试site.php?_SESSION[logged]=1了下,果然有效!

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

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

于 2014-01-27T13:13:56.810 回答
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] );
  }
}
于 2018-05-04T05:28:53.830 回答