首页 > 解决方案 > 在 PHP 中使用 eval() 实现 __toString()

问题描述

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

标签: phpctf

解决方案


如果您检查文档,您会看到它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');"


推荐阅读