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;
?>
直接看,不太明朗,调试看看
可以看到,$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']
至于<?=
,总是有用的(哈哈)