upload-labs靶场通关详解:第15-16关
第十五关 getimagesize函数验证
一、分析源代码
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()函数和image_type_to_extension()函数。getimagesize()函数的作用是读取文件的图像详细信息,包括尺寸和文件类型等。在文件上传验证中,如果文件不是有效图像,则返回错误,是有效图像则返回一个数组,这里返回的$info[2]是图像类型代码。image_type_to_extension()函数的作用是读取文件类型代码,转换为对应的文件扩展名。
二、解题思路
这里虽然使用了getimagesize()函数来验证文件是否为有效图像,但是攻击者仍然可以将一段恶意的php代码插入正常的图片中,从而绕过上传验证。
虽然这一关和上一关代码不同,但是做法基本相同。
三、解题步骤
1.准备一张正常的图片和一段木马,将其融合成图片马。
2.成功上传后,找到文件路径,利用文件包含漏洞查看木马是否被成功执行。
第十六关 exif_imagetype函数验证
解题思路
目录
第十五关 getimagesize函数验证
一、分析源代码
二、解题思路
三、解题步骤
第十六关 exif_imagetype函数验证
解题思路
这一关利用的是exif_imagetype()函数,它和getimagesize()函数的区别是:exif_imagetype()函数的功能更单一,仅仅是检测图像类型,但是速度更快。getimagesize()函数可以检测图像的宽度、高度、类型等多种信息。两个函数都需要开启相应的 PHP 扩展:getimagesize() 需要 GD 扩展,exif_imagetype() 需要 EXIF 扩展
和上一关解法相同。
写在后面的话:
断更了一个多月,这段时间的状态不是很好,现在才调整过来。以后会继续写。
写这个靶场笔记的初衷,是为了Y同学,希望能和她一起交流学习。但她还没看到,故事就结局了。
那天在操场跑步的时候,一株蒲公英从天空温柔地飘落。
我和Y同学是春天认识的,Y同学阳光活泼、开朗大方、古灵精怪。我非常闷,和她却很聊得来。
遇见她之前的那段时间,我的生活状态不断向上向好,整个人焕发出蓬勃的生机。
人们说,客观上当你不需要爱情的时候,主观上你就做好了迎接她的准备。我竟然开始相信缘分。
我鼓足勇气,伸出手,向那株蒲公英。
可是没想到,风一吹,就散了。
故事很美好,只是我单方面认为,结局很遗憾。
然后操场下起了瓢泼大雨,我疯狂地跑。
我想对Y同学说一句话,也是她当初对我说的,“你什么样都很好。”
最后雨停了,天空划出一道绚丽的彩虹。