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

相关推荐
其实防守也摸鱼20 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
我不是QI21 小时前
一、主持人信息(域名 网站资产情报搜集)原理解析
安全·网络安全
lubiii_21 小时前
网络安全法律法规备考速查手册
安全·web安全·网络安全
txg66621 小时前
网络安全领域简报(2026年7月14日—20日)
安全·web安全
2501_916008891 天前
HTTPS 抓包遇到证书绑定怎么办,使用 TraceEagle 解除 App 证书校验
网络协议·计算机网络·http·网络安全·ios·adb·https
treesforest1 天前
你以为只是一串数字?你的IP地址,正在悄悄暴露这些信息
网络·网络协议·tcp/ip·网络安全·ip归属地查询·ip风控
Увидимся вчера1 天前
绿盟堡垒机5611版本—自动改密
网络安全
难寻安逸1 天前
DVWA-使用sqlmap 进行sql注入过程
数据库·sql·网络安全
HackTwoHub1 天前
解锁 AI 红队全新玩法!Claude-Red 攻防 Skill 库,内置 SQLi、XXE、文件上传等 Web 专项 Skill,一键导入快速落地渗透实战
前端·人工智能·web安全·网络安全·自动化·系统安全
见青..2 天前
phpMyAdmin权限提升
web安全·网络安全·phpmyadmin