点击第十三关,并点击选择显示源码。可以看到,题目要求我们上传一个图片马到服务器:
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 = "上传出错!";
}
}
}
分析代码,我们可以看到服务器首先使用 fopen 和fread函数读取我们的文件:
fopen(file_parh,mode) 打开某个文件。file_path为文件路径;mode为打开模式,r表示以只读模式打开,b表示以二进制的方式打开。
fread(file_handler,len):读取文件的内容。file_handler为文件指针,是fopen的返回值,len表示读取文件的长度。
因为这一关采用读取文件的方式判断文件类型,我们不能简单的提交php木马文件。此时我们可以尝试将一句话木马的内容写进图片中。这里可以使用copy命令,copy命令的语法格式(命令提示符中 copy /? 命令可查看copy命令的用法):
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B] [+ source [/A | /B] [+ ...]] [destination [/A | /B]]
其中各个参数的含义如下:
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D:允许解密要创建的目标文件。
/V:验证新文件写入是否正确。
/N:复制带有非 8dot3 名称的文件时,尽可能使用短文件名。
/Y:不使用确认是否要覆盖现有目标文件的提示。
/-Y:使用确认是否要覆盖现有目标文件的提示。
/Z:用可重新启动模式复制已联网的文件。
/L 如果源是符号链接,请将链接复制到目标而不是源链接指向的实际文件。
其中我们用到一张图片和我们创建的一句话木马文件,再命令提示符(按住 win+r 快捷键,然后输入 cmd 并回车即可打开)中执行命令,然后回车
copy pic_body.png /b + info.php /a myphp.png
这里 /b 表示以二进制的方式打开图片, /a 表示以ascii码的方式打开文件 + 号表示将两个文件进行合并
我们发现文件已经被成功合并,可以用记事本打开图像进行确认,在文件的末尾出现一句话木马的代码:
此时我们上传我们生成的图片马,然后右键单击复制图像地址,然后点击 “文件包含漏洞” 进行测试:
可以看到测试代码,需要我们传一个 file 参数:
那么我们使用刚刚的图像地址构建url并回车,获得目标服务器的php信息:
同样的方式,可以上传jpg和gif的图片马
上一关(网络安全 文件上传漏洞-12 第十二关 Pass-12)
下一关(网络安全 文件上传漏洞-14 第十四关 Pass-14)
标签:网络安全,文件,13,打开,fileType,file,Pass,copy,上传 From: https://blog.csdn.net/weixin_58052886/article/details/139740288