文件上传漏洞
1 漏洞原理
1.1 MIME
1.1.1 MIME介绍
Multipurpose Internet Mail Extensions多用途互联网邮件扩展类型
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
| MIME | 描述 | 
|---|---|
| text/html | HTML格式 | 
| application/json | JSON数据格式 | 
| multipart/form-data | 文件上传(二进制数据) | 
| image/jpeg | jpg图片格式 | 
1.1.2 MIME用法
-  
客户端使用:
1.GET请求不需要这个字段。
2.POST请求头,放在Content Type字段用来指定上传的文件类型,方便服务器解析。放在Accept,告诉服务端允许接收的响应类型。比如只能接收json。
 -  
服务端使用:
放在响应头,Content Type告诉客户端响应的数据类型,方便客户端解析。
 
1.2 等价扩展名
| 语言 | 等价扩展名 | 
|---|---|
| asp | asa,cer,cdx | 
| aspx | ashx,asmx,ascx | 
| php | php2,php3,php4,php5,phps,phtml | 
| jsp | jspx,jspf | 
1.3 .htaccess
Hypertext Access(超文本入口)
<!-- 将"a.jpg"解析成php -->
<FileMatch "a.jpg">
    SetHandler application/x-httpd-php
</FilesMatch>
 
2 靶场搭建
2.1 webshell
Github项目
Gitee项目
2.2 upload-labs
2.2.1 下载
Github项目
Gitee项目
2.2.2 部署
-  
安装apache
下载→此时最新版本为Apache 2.4.53→解压至自定义路径→修改
/conf目录下的httpd.conf,将Define SRVRoot修改为Apache24的路径 -  
安装PHP
下载选则线程安全的→此时最新版本为PHP8.1.4,推荐PHP7.4→解压至指定路径→配置PHP,将根目录中
php.ini-development复制并改名为php.ini→修改php.ini将extension_dir="exit"改为ext的实际路径 -  
Apache中添加PHP扩展
#php support LoadModule php7_module php-7.4.22路径\php7apache2_4.dll PHPiniDir php-7.4.22路径模块中需要的功能,取消前面的分号注释。
 -  
Apache中添加PHP类型支持
在#AppType后面添加一行:
AddType application/x-httpd-php .php .html .htm -  
修改apache端口
修改Listen后面的端口号,避免冲突
 
3 漏洞发现与利用
3.1 找到上传位置
Redis KV 持久化+未授权访问
MySQL读写
开源添加小马
3.2 尝试绕过校验
删除或禁用javascript 修改MIME
等价扩展名 大小写转换
.htaccess 双写、空格、点
::$DATA %00截断,0x00阶段
图片马 条件竞争
3.3 php程序执行函数
-  
eval() 函数把字符串按照 PHP 代码来运行。
<?php @eval($_POST['xxx']);?> -  
system — 执行外部程序,并且显示输出
 -  
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
 -  
escapeshellcmd — shell 元字符转义
 -  
exec — 执行一个外部程序
 -  
passthru — 执行外部程序并且显示原始输出
 -  
proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码
 -  
proc_get_status — 获取由 proc_open 函数打开的进程的信息
 -  
proc_nice — 修改当前进程的优先级
 -  
proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
 -  
proc_terminate — 杀除由 proc_open 打开的进程
 -  
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
 
3.4 获得文件位置fuxploider
GitHub
Gitee
3.4 连接
-  
AntSword-Loader 蚁剑加载器
 -  
antSword 蚁剑主程序
 -  
Behinder 冰蝎
 -  
godzilla 哥斯拉
 -  
weevely
#Kali中的weevely是一个命令行形式的文件上传漏洞利用工具 #1.生成🐎 weevely generate xxx xxx.php #2.上传 #3.连接 weevely IPAddress xxx 
4 防御
- 扩展名(后缀)黑白名单
 - MIME类型校验(image/gif)
 - 文件内容头校验
 - 对文件内容进行二次渲染
 - 对上传的文件重命名,不易被猜测
 - 不要暴露上传文件的位置
 - 禁用上传文件的执行权限
 










