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

相关推荐
X7x51 小时前
筑牢网络安全防线:Web应用防火墙(WAF)全面解析
web安全·网络安全·安全架构·waf
以太浮标1 小时前
华为eNSP模拟器综合实验之- MGRE多点GRE隧道详解
运维·网络·网络协议·网络安全·华为·信息与通信
菩提小狗3 小时前
每日安全情报报告 · 2026-05-03
网络安全·漏洞·cve·安全情报·每日安全
love you joyfully3 小时前
如何随时随地访问你的“进程”?
网络·人工智能·网络安全·远程访问·网络技术
勿忘初心12214 小时前
企业级敏感数据脱敏工具类(Java实现)
网络安全·后端开发·企业级开发·java 工具类·敏感数据脱敏·pipl
Chengbei114 小时前
AI大模型网关存在SQL注入、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·安全·web安全·网络安全·系统安全
liann1196 小时前
3.4_Linux 应急响应排查速查命令表
linux·运维·服务器·安全·网络安全·系统安全
孪生质数-6 小时前
Linux高危漏洞通报Copy Fail - CVE-2026-31431
linux·运维·服务器·ubuntu·网络安全·debian·cve-2026-31431
vortex56 小时前
Villain:新一代轻量级 C2 框架完整使用指南
python·网络安全·kali·c2
汤愈韬6 小时前
Full Cone NAT、行为模式
网络·网络协议·网络安全·security