Реализация __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');"