【Pass-12】
分析源码
白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断
抓包上传:
上传成功
【Pass-13】
白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单
抓包上传:
在hex中找到1.php的末尾,改为00
上传成功
【Pass-14】
图片马绕过:
制作图片马(在图片的后面加一行php代码)
上传图片:
利用文件包含漏洞访问
upload/include.php?file=upload/图片名称
【Pass-15】
查看源码:
这一关通过getimagesize函数来获取图片信息,同样可以使用14关的图片码绕过。
function isImage($filename){
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
同样利用文件包含漏洞访问
upload/include.php?file=upload/图片名称
【Pass-16】
查看源码
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块
还是可以使用14关的图片马进行绕过:
【Pass-17】
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话。
上传正常的gif图片马:
下载被渲染后的图片。
使用Fairdell HexCmp进行比对。红色部分为不同内容,白色部分为相同内容。在白色靠下部分插入PHP一句话,上传。
成功上传:
使用文件包含漏洞构造url访问