1. 程式人生 > 實用技巧 >刷題[WUSTCTF2020]CV Maker

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

知識點

  • 檔案上傳