upload-labs pass-19

本关的代码看起来比较复杂,这里创建了一个My_upload类来对文件上传进行处理。

首先,需要注意,这里的上传路径出现了点问题,这里的上传到了upload同级目录里面,需要修改一下源码,使上传目录在upload里面,可以按照下图修改,两个位置选一个改就可以了,图1为myupload.php文件的第103行,或者修改index.php里的第13行内容,

接下来,来审计代码,index.php就是使用MyUpload类来处理上传文件,根据MyUpload类返回的值来打印对应上传状态信息。

接下来,重要的是myupload.php里的内容。

复制代码
//myupload.php
class MyUpload{
......
......
...... 
  var $cls_arr_ext_accepted = array(
      ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
      ".html", ".xml", ".tiff", ".jpeg", ".png" );

......
......
......  
  /** upload()
   **
   ** Method to upload the file.
   ** This is the only method to call outside the class.
   ** @para String name of directory we upload to
   ** @returns void
  **/
  function upload( $dir ){
    
    $ret = $this->isUploadedFile();
    
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->setDir( $dir );
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->checkExtension();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->checkSize();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );    
    }
    
    // if flag to check if the file exists is set to 1
    
    if( $this->cls_file_exists == 1 ){
      
      $ret = $this->checkFileExists();
      if( $ret != 1 ){
        return $this->resultUpload( $ret );    
      }
    }

    // if we are here, we are ready to move the file to destination

    $ret = $this->move();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );    
    }

    // check if we need to rename the file

    if( $this->cls_rename_file == 1 ){
      $ret = $this->renameFile();
      if( $ret != 1 ){
        return $this->resultUpload( $ret );    
      }
    }
    
    // if we are here, everything worked as planned :)

    return $this->resultUpload( "SUCCESS" );
  
  }
......
......
...... 
};

首先,定义后缀白名单,接着处理流程是:是否上传文件**→** 设置上传目录**→** 检查文件后缀**→** 检查文件大小**→** 移动到上传目录**→**修改文件名。

这里观察一下,可以发现,白名单里面的文件几乎都是"非执行文件",大多是静态资源、文档或压缩包。这里"执行文件"可以指能被服务器(或系统)直接执行代码 / 逻辑的文件(比如 .php(PHP 脚本)、.asp(ASP 脚本)、.jspx(Java Web 脚本)、.exe(Windows 可执行程序)等)。

而由于这里作者也没有给予一个文件包含漏洞窗口,即意味着作者设计这关的目的不是让我们上传图片马,这里是可以利用文件包含漏洞上传图片马利用的,因为图片回显在了主页,我们可以获取到文件名,所以这里想其他方法。这里我们的目的就是上传一个"非执行文件",还要让它被当作"可执行文件"来处理。

这里就需要用到Apache的解析漏洞了,在Apache 1.x-2.x版本,存在解析漏洞,也就是Apache在遇到不认识的后缀时,会依次从右向左解析,若都不认识则会暴露源码,也就是说如果这里有一个....\abc.php.abcd 文件,那么由于Apache不认识abcd这个后缀,则会向前解析,也就是解析为abc.php。

httpd.cong这个文件指定了Apache可以执行的文件类型,如图中的".z"、",gz"、",tgz"、".php"等。这里再看一下上面的验证白名单,里面有很多Apache不认识的文件名,我们上传以Apache不认识的后缀进行绕过。

由于这里做了重命名处理,我们尽管上传了如"abc.php.7z"这种文件,但是存在服务端就只剩下"随机数+.7z"的文件名了,不是可执行文件,不可以执行,所以我们需要在文件被重命名之前访问这个文件,利用file_put_contents留下一个php文件,达到稳定连接。这里就和上一关的条件竞争一样了,大量重放两个数据包。

可以看到,留下了我们想要的文件。我们直接访问即可。

**解题点:**Apache解析漏洞+条件竞争。

相关推荐
学逆向的1 小时前
C 悬空指针
c语言·开发语言·网络安全
2301_780789662 小时前
IPv6 洪水猛兽:DDoS 攻击面 3 倍扩张下的精准清洗新战法
运维·安全·web安全·ddos·devops
时代新威powertime16 小时前
时代新威·视角|云计算平台中数据隐私保护机制的研究
网络安全·云计算
dk_tjy20 小时前
迪康加密系统技术解析:驱动层透明加密的机制、策略与工程权衡
运维·安全·网络安全·终端安全管理·数据防泄漏
学逆向的1 天前
C 可变量参数
c语言·开发语言·网络安全
孙克旭_1 天前
文件包含漏洞
网络安全
其实防守也摸鱼1 天前
Cylab在线靶场——挑战图书馆初学者指南
服务器·前端·数据库·chrome·安全·网络安全·靶场
m0_715674431 天前
可视化易用·低误报率·跨区域部署:知源-AI数据分类分级系统在金融行业的落地实践
网络·安全·网络安全
愤怒火龙果2 天前
AI攻防 AIRT03-RAG Exploitation & Vector Database Attacks
数据库·人工智能·网络安全
严谨的麻辣烫2 天前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全