文件上传漏洞
1 漏洞原理
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。
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(超文本入口)
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。
通过.htaccess文件,可以实现:网页301重定向,自定义404错误页面,改变文件扩展名,允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能。
<!-- 将"a.jpg"解析成php -->
<FileMatch "a.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
2 靶场搭建
2.1 webshell
2.2 upload-labs
2.2.1 下载
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后面的端口号,避免冲突
2.2.3 练习
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
3.4 连接
-
weevely
#Kali中的weevely是一个命令行形式的文件上传漏洞利用工具 #1.生成🐎 weevely generate xxx xxx.php #2.上传 #3.连接 weevely IPAddress xxx
4 防御
- 扩展名(后缀)黑白名单
- MIME类型校验(image/gif)
- 文件内容头校验
- 对文件内容进行二次渲染
- 对上传的文件重命名,不易被猜测
- 不要暴露上传文件的位置
- 禁用上传文件的执行权限