zoukankan      html  css  js  c++  java
  • 刷题[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

    知识点

    • 文件上传
  • 相关阅读:
    react.js从入门到精通(四)——组件的基本使用
    react.js从入门到精通(二)——变量的定义和初始化、事件的使用
    react.js从入门到精通(三)——生命周期钩子函数的使用
    react.js从入门到精通(一)
    第三篇 12306自动刷票下单-下单
    第二篇 12306自动刷票下单-查票下单
    第一篇 12306自动下单抢票
    DOM
    Html5标签
    在Windows中配置Rsync同步文件的方法
  • 原文地址:https://www.cnblogs.com/karsa/p/13418087.html
Copyright © 2011-2022 走看看