刷题[WUSTCTF2020]CV Maker

解题思路

好家伙,打开一看像是cms,又看名字CV Maker。我以为直接要搜cve打了。搜了一会发现没什么啊。那先正常做把。

注册

注册成功后这里报错,猜测可能有注入点。先放在这里,继续登陆。发现是上传头像,那猜测可能有文件上传漏洞了

文件上传

exif_imagetype函数,很常见的了,判断文件头是否是图片。

那我先传入一个图片马,上传成功。但是发现无论是.htaccess,还是各种格式的都无法上传成功,图片马也无法利用。

这时猜测是否能通过web应用程序解析漏洞绕过。报错网页,发现是apache

由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,jpg等扩展名是apache不能识别的,

因此如果一个文件名为1.php.gif。就会直接将类型识别为php,从而达到了注入php代码的目的

但是这里又无法上传成功,很奇怪。这里测试了一会,发现反着利用就可以了,上传1.jpg.php

看图片链接,发现上传路径/uploads。然后最奇特的一点,jpg好像被过滤成空了,直接是php文件了。那就直接利用。蚁剑连接,在根目录下找到flag

代码审计

这里本该是完了,但是我想看看是如何过滤的,找到profile.php,贴下代码

<?php
			function isImage($filename){
			    $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;
			    }
			}
			if (isset($_POST['submit'])) {
				$temp_file = $_FILES['upload_file']['tmp_name'];
				if (isImage($temp_file)) {
					$name = $_FILES['upload_file']['name'];
					$ext = substr(strrchr($name, '.'), 1);
				    $img_path = 'uploads/'.md5($_COOKIE["_Hz"]).'.'.$ext;
				    $fn = "uploads/".md5($_COOKIE["_Hz"]).".*";
				    if (glob($fn)) {
				    	$ffn = glob($fn)[0];
				    	unlink($ffn);
				    }
				    if (move_uploaded_file($temp_file, $img_path)){
				        $is_upload = true;
				    } else {
				        $msg = '上传出错!';
				    }
				    if ($is_upload) {
				    	echo '<div class="cc-profile-image"><a href="#"><img src="'.$img_path.'" alt="Image"/></a></div></br>';
				    }else{
				    	echo '<div class="h2 title">'.$msg.'</div>';
				    }
				}else{
					echo '<div class="h3 title">exif_imagetype not image!</div>';
				}
			}else{
				$fn = "uploads/".md5($_COOKIE["_Hz"]).".*";
				if (glob($fn)) {
					echo '<div class="cc-profile-image"><a href="#"><img src="'.glob($fn)[0].'" alt="Image"/></a></div></br>';
				}else{
					echo '<div class="cc-profile-image"><a href="#"><img src="images/anthony.jpg" alt="Image"/></a></div></br>';
				}

			}
		?>

诶,这么看并没有过滤文件名替换为空。我想的那种情况,那是怎么回事呢。我重新上传一个单纯的php文件,这里思考了一下,直接把GIF89a,加在一句话前面,没有换行。。。。。。

成功了,好吧,之前没有把文件头和一句话放在一行中,没想到这导致无法利用。

这题挺简单的啊,就是不要被buu上的分数,还有打开发现可能是cve复现吓到了就行

总结思路

  • 文件上传bypass

知识点

  • 文件上传
posted @ 2020-08-02 10:52  kar3a  阅读(1417)  评论(0编辑  收藏  举报