沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

PHP注册全局与伪全局

Register GLobals

从PHP4.2.0版,开始默认为off,自PHP5.3.0起废弃并将自PHP5.4.0起移除

下面是个错误使用的例子

<?php
// 当用户合法的时候,赋值 $authorized = true
if (authenticated_user()) {
    $authorized = true;
}

// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

代码中的变量会被URL中的同名参数给覆盖,从而导致漏洞

伪全局

<?php
foreach($_REQUEST as $key=>$value)
{
    $$key=$value;
}
echo $test;
?>

直接看,不太明朗,调试看看

image-20201015193330004

可以看到,$key等于url中的参数,如果与代码中的变量同名,则$$key就会实现对代码中变量的覆盖。

短标签风格

<? #your code ?>要使用这种风格,必须要打开php.ini中的short_open_tag, 但是这是默认打开的,也就是说PHP的四种代码风格,除了ASP风格需要特别配置外(asp_tags在PHP7被移除,不支持这种风格了),其他三种在默认情况下都可以使用(可能就是文件上传多了种绕过吧)

另外,自PHP5.4.0起,<?=(等同于<? echo)不受short_open_tag的影响,所以无论怎样都可以使用<?=,

利用

一般人应该不会写出这种伪全局的代码的吧(大雾),主要用来写webshell吧,大概,这样就相当于$_GET['key']

至于<?=,总是有用的(哈哈)