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