刷題[WUSTCTF2020]CV Maker
阿新 • • 發佈:2020-08-02
解題思路
好傢伙,開啟一看像是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
知識點
- 檔案上傳