解題思路
好家伙,打開一看像是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
知識點
- 文件上傳