我正在尝试将引用另一个变量的变量传递到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()
的十六进制。但就我而言,十六进制未解析,因此无法执行。我做错了吗?
答案 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
);
}