解题思路

好家伙,打开一看像是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,贴下代码

  1. <?php
  2. function isImage($filename){
  3. $image_type = exif_imagetype($filename);
  4. switch ($image_type) {
  5. case IMAGETYPE_GIF:
  6. return "gif";
  7. break;
  8. case IMAGETYPE_JPEG:
  9. return "jpg";
  10. break;
  11. case IMAGETYPE_PNG:
  12. return "png";
  13. break;
  14. default:
  15. return false;
  16. break;
  17. }
  18. }
  19. if (isset($_POST['submit'])) {
  20. $temp_file = $_FILES['upload_file']['tmp_name'];
  21. if (isImage($temp_file)) {
  22. $name = $_FILES['upload_file']['name'];
  23. $ext = substr(strrchr($name, '.'), 1);
  24. $img_path = 'uploads/'.md5($_COOKIE["_Hz"]).'.'.$ext;
  25. $fn = "uploads/".md5($_COOKIE["_Hz"]).".*";
  26. if (glob($fn)) {
  27. $ffn = glob($fn)[0];
  28. unlink($ffn);
  29. }
  30. if (move_uploaded_file($temp_file, $img_path)){
  31. $is_upload = true;
  32. } else {
  33. $msg = '上传出错!';
  34. }
  35. if ($is_upload) {
  36. echo '<div class="cc-profile-image"><a href="#"><img src="'.$img_path.'" alt="Image"/></a></div></br>';
  37. }else{
  38. echo '<div class="h2 title">'.$msg.'</div>';
  39. }
  40. }else{
  41. echo '<div class="h3 title">exif_imagetype not image!</div>';
  42. }
  43. }else{
  44. $fn = "uploads/".md5($_COOKIE["_Hz"]).".*";
  45. if (glob($fn)) {
  46. echo '<div class="cc-profile-image"><a href="#"><img src="'.glob($fn)[0].'" alt="Image"/></a></div></br>';
  47. }else{
  48. echo '<div class="cc-profile-image"><a href="#"><img src="data:images/anthony.jpg" alt="Image"/></a></div></br>';
  49. }
  50. }
  51. ?>

诶,这么看并没有过滤文件名替换为空。我想的那种情况,那是怎么回事呢。我重新上传一个单纯的php文件,这里思考了一下,直接把GIF89a,加在一句话前面,没有换行。。。。。。

成功了,好吧,之前没有把文件头和一句话放在一行中,没想到这导致无法利用。

这题挺简单的啊,就是不要被buu上的分数,还有打开发现可能是cve复现吓到了就行

总结思路

  • 文件上传bypass

知识点

  • 文件上传

刷题[WUSTCTF2020]CV Maker的更多相关文章

  1. 刷题[WUSTCTF2020]朴实无华

    解题思路 打开是一个这样的页面,查看源码发现什么人间极乐bot,试试是不是robots.txt,查看发现类似flag文件,查看发现是假的flag,但是burp抓包后发现,返回的头部有信息 源码出来了, ...

  2. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  3. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

  4. ife任务刷题总结(一)-css reset与清除浮动

    本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...

  5. 刷题ING...

    我用codeVS刷题.. 努力准备!!

  6. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  7. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  8. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  9. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

随机推荐

  1. openstack-neutron-OVS agent分析

    参考链接: https://blog.csdn.net/sld880311/article/details/77978369 https://github.com/jffree/neutron-cod ...

  2. 计算机网络-应用层(2)FTP协议

    文件传输协议(FTP,File Transfer Protocol)是Internet上使用最广泛的文件传送协议.FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限.它屏蔽了 ...

  3. Mysql锁【转】

    一.概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外. M ...

  4. muduo源码解析7-countdownlatch类

    countdownlatch class countdownlatch:noncopyable { }; 作用: countdownlatch和mutex,condition一样,用于线程之间的同步, ...

  5. 多线程std::cout 深入研究

    1.研究背景 在测试时发现mingw版本的gcc编译出来的程序,一个主程序新建20个线程,每个线程都循环向cout输出信息,几分钟程序就崩了,而用msvc和gcc-linaro版gcc交叉编译器编译出 ...

  6. 两台Linux服务器文件同步

    在给公司或者学校做系统部署的时候,为了数据安全往往我们至少需要两台服务器,接下来请看: 我们要实现的是把客户端(192.168.0.1)的复制到目标服务器(192.168.0.2) 一.目标服务器 1 ...

  7. C#封装定时执行任务类

    a.日常开发中经常会遇到定时去执行一些操作,比如定时更新数据.A类需要做我们写个Timer定时去取数据,这时候B类,C类也需要做这样的事情,是不是需要写三次重复代码? 这时候把timer封装成一个帮助 ...

  8. Istio安全-授权(实操三)

    Istio安全-授权 目录 Istio安全-授权 授权HTTP流量 为使用HTTP流量的负载配置访问控制 卸载 授权TCP流量 部署 配置TCP负载的访问控制 卸载 使用JWT进行授权 部署 使用有效 ...

  9. PostgreSQL在不同的表空间移动数据文件

    一.背景 在工作中,可能会遇到将表从一个表空间移动另一个表空间.例如 * 对数据进行冷处理 * 表空间所在的磁盘空间不足 * 建表时分配错了表空间 以上等等,可能需要你将一个表移动表空间. 二.表空间 ...

  10. linux下P2P协议(BitTorrent)-libtorrent库编译,测试

    1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...