刷題[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

知識點

  • 文件上傳


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM