在 PHP 中使用 eval() 实现 __toString()

  • 本文关键字:toString 实现 eval PHP php ctf
  • 更新时间 :
  • 英文 :


我正在寻找一种在 PHP 中仅使用 eval 实现 __toString 方法的方法。最终目标是能够读取文件。请注意,这是CTF挑战的一部分,而不是现实世界的应用程序。

我得到了以下实现

function __toString(){
     eval($this->var);
}

由于$var在我的控制之下,我可以将 if 设置为任何我想要的东西。到目前为止,我已经尝试了以下方法,但没有成功:

$var = "return file_get_contents('file.txt');"

有什么提示吗?

更新:相关代码如下所示:

class MyClass{
    private $var;
    function __toString(){
        if (isset($this->var) eval($this->var);
    }
}

如果您检查文档,您将看到function __toString()必须返回一个字符串。因此,无论您在 __toString() 方法中执行什么操作,只需确保返回一个字符串即可。很高兴您提到这不适用于现实世界的应用程序。因为 eval(( 可能非常危险,并且可能会产生意想不到的结果。

另外,如果 va 真的在您的控制之下,为什么不做以下事情......

$this->var = file_get_contents('file.txt');
//...
function __toString(){
     return $this->var;
}

最后一个想法...如果你正在做$var = "return file_get_contents('file.txt');",这与做$this->var = "return file_get_contents('file.txt');"<</p>

div class="one_answers">不是一回事,

你可以在$var本身echo

$var = "echo file_get_contents('input.txt');";

如果您不想在屏幕上打印任何内容而只想获取文件内容,则可以使用输出缓冲。我使用了ob_start((和ob_get_clean((。

<?php
$var = "ob_start();echo file_get_contents('input.txt');";
eval($var);// your __toString() function call here.
$file_contents = ob_get_clean();
echo $file_contents;

最新更新