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
感谢两位师傅!!!