我正在寻找一种在 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>
你可以在$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;