php上传图片 $__files没有信息_[RiverSec Lab专栏] 文件上传漏洞源码审计和绕过(上)...

c2ca21336104b97ea181f46a15bbc4c1.gif

前言

本文主要针对常见的13个文件上传的场景进行源码审计和绕过分析。 文件上传(File Upload),顾名思义就是上传文件的功能行为,是大部分Web应用都具备的功能,例如用户上传附件、修改头像、分享图片/视频等。正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储,需要的时候再调用出来返回。 而文件上传漏洞是程序没有对客户端提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。文件上传漏洞是漏洞中最为简单猖獗的利用形式,一般只要能上传获取地址,可执行文件被解析就可以获取系统WebShell。 24e39378a6695254f55d8deeac48eec5.gif

原理

常见web应用结构如LNMP由操作系统、中间件、数据库、开发语言组成,中间件负责解析web请求将本地资源反馈给用户,当后端代码出现缺陷导致用户对资源可控时,便存在恶意代码执行问题,而任意文件上传漏洞是其中之一。

这是一段无任何防护的php处理上传文件代码,首先$_FILES['file']['name']获取客户端文件原名称,再move_uploaded_file()将该文件从临时路径移动至UPLOAD_PATH . $name,可看到$name是用户可控制的,当上传一个php恶意文件时,访问便会执行其中的恶意代码
<?php header("Content-type:text/html;charset=utf-8");error_reporting(0);//设置上传目录define("UPLOAD_PATH",dirname(__FILE__) . "/upload/");define("UPLOAD_URL_PATH",str_replace($_SERVER['DOCUMENT_ROOT'],"",UPLOAD_PATH));$is_upload = false;if(!file_exists(UPLOAD_PATH)) {
        mkdir(UPLOAD_PATH,0755);}if(!empty($_POST['submit'])) {
        if(!$_FILES['file']['size']) {
            echo"    } else {
            $name = basename($_FILES['file']['name']);        if(move_uploaded_file($_FILES['file']['tmp_name'],UPLOAD_PATH . $name)) {
                $is_upload = true;        } else {
                echo"        }    }}?>
24e39378a6695254f55d8deeac48eec5.gif

靶场

使用国光表哥搭建的文件上传靶场进行分析和演示,基于docker共13个关卡,覆盖了大部分上传姿势。

环境搭建

# 下载文件

git clone https://github.com/sqlsec/upload-labs-docker.git


# 进入项目文件夹

cd upload-labs-docker


# 一键部署运行

docker-compose up -d

5bbfd1d09ee305ac6058ec719fb3693a.png

1

JS  

c4557181ba2e361c7853ea06cdf189ba.png 通过前端js限制用户上传是最常见也是最不安全的一种防护措施,常规绕过思路:
  1. 删除/修改js语句

  2. 拦截、修改响应包/请求包

靶站 Upload按钮绑定checkfilesuffix()函数,该函数白名单限制只允许上传jpg、png、gif、jpeg为后缀的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值