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