【问题标题】:Implementation of __toString() using eval() in PHP在 PHP 中使用 eval() 实现 __toString()
【发布时间】:2019-09-11 16:28:10
【问题描述】:

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

【问题讨论】:

  • return 从 eval 中返回,也可以试试 return eval($this->var);
  • @vivek_23 我试过没有,到目前为止没有成功。 :-/
  • @AbraCadaver 不幸的是我无法更改该功能。我唯一控制的是 $var。
  • 那你能做的就是echo file_get_contents('file.txt');

标签: php ctf


【解决方案1】:

如果您查看文档,您会看到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');"是不一样的

【讨论】:

  • 感谢您的回答。我所说的拥有控制权的意思是我不能按我的意愿设置 $this->var。但是我无法更改 __toString() 实现。
  • 好的。这是一个艰难的。也许我们需要更多的上下文。
【解决方案2】:

您可以在 $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;

【讨论】:

  • 看起来不错!我在本地尝试过,出现错误,但回显仍然通过,但它在远程服务器上不起作用。经过一番挖掘,我发现远程服务器正在运行 PHP 5.5.9。在挑战中,我得到一个“终端输出”,我可以在其中看到错误
  • @MarcIlunga 你能分享挑战链接吗?另外,PHP 版本应该不是问题。
  • 很遗憾,我不能真正分享挑战链接,因为它是私人的。我不明白的是,它在本地会抛出一个可恢复的错误,但仍会打印该值,而远程它不会打印任何东西
  • @MarcIlunga 如果不亲自查看挑战,我无法告诉您太多信息。此外,我粘贴的代码在我的机器上运行良好。执行代码的服务器可能会关闭输出缓冲功能。
  • 感谢您一直陪伴着我。 ;)。我会将讨论移至聊天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2011-07-07
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多