PHP中eval()函数内部的嵌套变量引用

时间:2019-05-25 09:21:21

标签: php security

我正在尝试将引用另一个变量的变量传递到PHP的eval()函数中。

bin2hex和大多数其他PHP函数不能使用,因此我不得不依靠(我认为)PHP性质,该特性将十六进制自动解析为ascii字符串。

当我尝试运行此命令时:

<?php
$t = "\x70\x68\x70\x69\x6e\x66\x6f\x28\x29"
eval($t . "();");
?>

phpinfo()被调用并显示在网页上

但是当像这样从超全局变量中引用$t变量时:

<?php

// HTTP request:
// http://myserver.com/debug.php?t=$_GET['s']&s=\x70\x68\x70\x69\x6e\x66\x6f\x28\x29

// Info:
// $_GET['t'] = $_GET['s'];
// $_GET['s'] = \x70\x68\x70\x69\x6e\x66\x6f\x28\x29

eval($_GET['t'] . "();");

?>

十六进制字符串没有被解析(按原样打印)并且没有被执行。

我的目标是通过HTTP查询参数($ _GET)在phpinfo()函数内执行eval(),因为我传递了\x70\x68\x70\x69\x6e\x66\x6f\x28\x29,它是phpinfo()的十六进制。但就我而言,十六进制未解析,因此无法执行。我做错了吗?

1 个答案:

答案 0 :(得分:0)

为什么eval()无法返回方法结果?仅仅是因为您没有在评估部分中返回任何东西。 所以这样做

$phpInfo = decode_code('\x70\x68\x70\x69\x6e\x66\x6f\x28\x29'); // here decode to string
eval('$phpinfoOut ='.$phpInfo.';'); // You can assign variable 
echo $phpinfoOut; // **TESTED IT WORKS** 
function decode_code($code){
    return preg_replace_callback(
        "@\\\(x)?([0-9a-f]{2,3})@",
        function($m){
            return chr($m[1]?hexdec($m[2]):octdec($m[2]));
        },
        $code
    );
}