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解析漏洞+条件竞争。

相关推荐
缘友一世4 小时前
文件上传漏洞和绕过技术
web安全·网络安全·渗透测试·文件上传漏洞·开发安全
岛屿旅人7 小时前
智库报告美国如何打网络战
网络·人工智能·安全·web安全
网安INF11 小时前
网络攻防技术:拒绝服务攻击
网络·安全·web安全·网络安全
emma羊羊15 小时前
【业务逻辑漏洞】认证漏洞
mysql·网络安全·靶场·业务逻辑漏洞
Forfun_tt16 小时前
xss-labs pass-07
网络安全·xss
拥友LikT17 小时前
计算机网络基础篇——网络安全
计算机网络·网络安全
北京耐用通信17 小时前
打破协议壁垒:耐达讯自动化Modbus转Profinet网关实现光伏逆变器全数据采集
运维·人工智能·物联网·网络安全·自动化·信息与通信
Whoami!18 小时前
⸢ 捌-Ⅱ⸥⤳ 可信纵深防御应用实践:软件供应链、数据滥用、安全加固
网络安全·信息安全·安全实践·纵深防御
cai_huaer1 天前
BugKu Web渗透之 cookiesWEB
前端·web安全