我有一个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(我需要它!)任何提示?
答案 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] );
}
}