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/文件名
遇到问题,多想多问。办法总比困难多。