1

我正在寻找一种仅在 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);
    }
}
4

2 回答 2

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');"

于 2019-04-22T13:36:44.603 回答
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;
于 2019-04-22T13:46:24.100 回答