Реализация __toString() с использованием eval() в PHP

Я ищу способ реализовать метод __toString, используя только eval в PHP. Конечная цель - прочитать файл. Обратите внимание, что это часть задачи 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);
    }
}

2 ответа

Вы могли бы 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;

Если вы проверите документ, вы увидите, что 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');"

Другие вопросы по тегам