Client check
打开靶场尝试直接上传一句话木马发现无法上传
又看到此道题目题名为Client check,猜想是在前端对上传文件进行判断,我们直接禁止使用js,再尝试上传文件,发现上传成功
使用phpinfo()来确认木马的可用性
MIME type
这里我们看到标题是MIME type就可以想到通过更改文件content-type来成功上传小马
成功上传,检验小马的可用性
getimagesize()
直接尝试上传小马发现上传失败
尝试%00截断
也失败了
这里提示上传的是个假图片,应该是对文件内容头部进行了检测,我们在文件内容头部添加"GIF89a?"来绕过检测
成功上传,但文件名后缀为jpg,小马无法直接连上,看了其他的wp才意识到可以利用前面的本地文件包含利用此小马
小马可用,最后看源代码,这里是无法使用%00截断的,因为文件后缀名已经是指定的类型了
1
if(isset($_POST['submit'])){
2
$type=array('jpg','jpeg','png');//指定类型
3
$mime=array('image/jpg','image/jpeg','image/png');
4
$save_path='uploads'.date('/Y/m/d/');//根据当天日期生成一个文件夹
5
$upload=upload('uploadfile','512000',$type,$mime,$save_path);//调用函数
6
if($upload['return']){
7
$html.="<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为:{$upload['save_path']}</p>";
8
}else{
9
$html.="<p class=notice>{$upload['error']}</p>";
10
11
}
12
}
1
function upload($key,$size,$type=array(),$mime=array(),$save_path){
2
3
//获取后缀名,如果不存在后缀名,则将变量设置为空
4
$arr_filename=pathinfo($_FILES[$key]['name']);
5
if(!isset($arr_filename['extension'])){
6
$arr_filename['extension']='';
7
}
8
//先验证后缀名
9
if(!in_array(strtolower($arr_filename['extension']),$type)){//转换成小写,在比较
10
$return_data['error']='上传文件的后缀名不能为空,且必须是'.implode(',',$type).'中的一个';
11
$return_data['return']=false;
12
return $return_data;
13
}
14
15
//验证MIME类型,MIME类型可以被绕过
16
if(!in_array($_FILES[$key]['type'], $mime)){
17
$return_data['error']='你上传的是个假图片,不要欺骗我xxx!';
18
$return_data['return']=false;
19
return $return_data;
20
}
21
//通过getimagesize来读取图片的属性,从而判断是不是真实的图片,还是可以被绕过的
22
if(!getimagesize($_FILES[$key]['tmp_name'])){
23
$return_data['error']='你上传的是个假图片,不要欺骗我!';
24
$return_data['return']=false;
25
return $return_data;
26
}
27
28
}
29