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

相关推荐
twcc_come18 分钟前
渗透第一次作业
安全·web安全
独行soc3 小时前
2026年渗透测试面试题总结-3(题目+回答)
网络·python·安全·web安全·渗透测试
咆哮的黑化肥3 小时前
文件包含漏洞(加DVWA靶场练习)
安全·web安全
heze095 小时前
sqli-labs-Less-19自动化注入方法
mysql·网络安全·自动化
网安CILLE5 小时前
Wireshark 抓包实战演示
linux·网络·python·测试工具·web安全·网络安全·wireshark
运筹vivo@6 小时前
攻防世界:Web_php_unserialize
前端·web安全·php
三七吃山漆7 小时前
[护网杯 2018]easy_tornado
python·web安全·ctf·tornado
芯盾时代7 小时前
航空行业信息网络安全现状和需求
网络·安全·web安全
2301_810970398 小时前
第一次渗透作业
web安全·php
久违 °8 小时前
【安全开发】Nmap主机探测技术详解(一)
网络·安全·网络安全