Pass-14
(图片马,判断文件类型)
图片的格式在防护中通常是不会使用后缀进行判断的依据,文件头是文件开头的一段二进制码,不同类型的图片也就会有不同的二进制头。
JPEG (jpg),文件头:FF D8 FF E1
PNG (png),文件头:89 50 4E 47
GIF (gif),文件头:47 49 46 38
查看源码
function getReailFileType($filename){$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin); $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); $fileType = ''; switch($typeCode){ case 255216: $fileType = 'jpg';break;case 13780: $fileType = 'png';break; case 7173: $fileType = 'gif';break;default: $fileType = 'unknown';} return $fileType;
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}
提示:
检查图片内容开头两个字节,所以要想到用图片+php来组成一个图片马,可以直接用notepad打开一个图片在后面添加代码组成图片马,不过可能会出错。也可以使用cmd命令。
(要先进入文件夹内,使用cd)
利用copy命令合成一个图片马使用_copy 图片马-CSDN博客
copy th.jpg /b + phpinfo.php /a 11.php
补充如果是linux那么命令就是
cat th.jpg phinfo.php > 11.php
制作好的图片马想要解析出来这个图片,还得有这个包含漏洞。
网站存在包含漏洞
直接上传含有PHP木马的图片
打开图片获得图片地址,右键可以查看文件路径
upload/3420240411210440.jpg
利用文件包含漏洞upload-labs/include.php?file=upload/文件名
访问文件路径时需要构造URL
include.php?file=upload/3420240411210440.jpg
成功访问
使用图片木马,php5.6以上的版本才能成功解析图片木马
做此题时,phpstudy2018总是无法成功访问,有大佬说是版本问题,尝试使用phpstudy_pro搭建upload-labs环境后,再次尝试,即可成功访问。遇到问题时多加尝试,办法总比困难多。
Pass-15
(图片马,检测是否为图片)
查看源码
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 = "上传出错!";}}
}
提示
关键函数是getimagesize,getimagesize函数会对目标的十六进制的前几个字符串进行读取。比如GIF的文件头问GIF89a,png的文件头为塒NG。尝试读取上传文件(图片)的大小,如果该函数能够成功读取上传文件的大小,就说明该文件是一个图片;如果不能成功读取,那么就说明该文件不是一张图片,是一个恶意文件。
getimagesize()官网
PHP: getimagesize - Manual
与14题类似,还是利用14关的图片马
查看文件路径
构造url
include.php?file=upload/6920240411212612.jpeg
成功访问
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 = "上传出错!";}}
}
提示:
上传文件后,发现页面异常,原因未知
查阅资料后得知
php5.6以上的版本才能成功解析图片木马
需要开启php_exif
模块
看wp,14,15,16三题做法类似,只是考察的函数不一样
函数exif_imagetype()
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
但是这一关要注意:需要开启php_exif模块
更改版本以及配置后,即可成功上传
成功访问文件路径
注释:
三题使用的图片马均为同一个
th.jpg为网上找到的一张图片
phpinfo.php为一句话木马,代码为
<?php
phpinfo();
?>
也可以编写其他一句话木马,使用蚁剑连接
使用cmd命令制作图片马时需要注意文件名
访问文件路径时需要构建url,利用文件包含漏洞upload-labs/include.php?file=upload/文件名
遇到问题,多想多问。办法总比困难多。