前言
本文主要针对常见的13个文件上传的场景进行源码审计和绕过分析。 文件上传(File Upload),顾名思义就是上传文件的功能行为,是大部分Web应用都具备的功能,例如用户上传附件、修改头像、分享图片/视频等。正常的文件一般是文档、图片、视频等,Web应用收集之后放入后台存储,需要的时候再调用出来返回。 而文件上传漏洞是程序没有对客户端提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。文件上传漏洞是漏洞中最为简单猖獗的利用形式,一般只要能上传获取地址,可执行文件被解析就可以获取系统WebShell。![24e39378a6695254f55d8deeac48eec5.gif](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/24e39378a6695254f55d8deeac48eec5.gif)
靶场
使用国光表哥搭建的文件上传靶场进行分析和演示,基于docker共13个关卡,覆盖了大部分上传姿势。环境搭建
# 下载文件
git clone https://github.com/sqlsec/upload-labs-docker.git
# 进入项目文件夹
cd upload-labs-docker
# 一键部署运行
docker-compose up -d
1
JS
![c4557181ba2e361c7853ea06cdf189ba.png](https://img-blog.csdnimg.cn/img_convert/c4557181ba2e361c7853ea06cdf189ba.png)
删除/修改js语句
拦截、修改响应包/请求包