刷题[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
知识点
- 文件上传