文件上传漏洞利用与防御

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/htmlHTML格式
application/jsonJSON数据格式
multipart/form-data文件上传(二进制数据)
image/jpegjpg图片格式

1.1.2 MIME用法

  • 客户端使用:

    1.GET请求不需要这个字段。

    2.POST请求头,放在Content Type字段用来指定上传的文件类型,方便服务器解析。放在Accept,告诉服务端允许接收的响应类型。比如只能接收json。

  • 服务端使用:

    放在响应头,Content Type告诉客户端响应的数据类型,方便客户端解析。

1.2 等价扩展名

语言等价扩展名
aspasa,cer,cdx
aspxashx,asmx,ascx
phpphp2,php3,php4,php5,phps,phtml
jspjspx,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

Github项目

Gitee项目

2.2 upload-labs

2.2.1 下载

Github项目

Gitee项目

2.2.2 部署

  1. 安装apache

    下载→此时最新版本为Apache 2.4.53→解压至自定义路径→修改/conf目录下的httpd.conf,将Define SRVRoot修改为Apache24的路径

  2. 安装PHP

    下载选则线程安全的→此时最新版本为PHP8.1.4,推荐PHP7.4→解压至指定路径→配置PHP,将根目录中php.ini-development复制并改名为php.ini→修改php.iniextension_dir="exit"改为ext的实际路径

  3. Apache中添加PHP扩展

    #php support
    LoadModule php7_module php-7.4.22路径\php7apache2_4.dll
    PHPiniDir php-7.4.22路径
    

    模块中需要的功能,取消前面的分号注释。

  4. Apache中添加PHP类型支持

    在#AppType后面添加一行:

    AddType application/x-httpd-php .php .html .htm
    
  5. 修改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

GitHub

Gitee

3.4 连接

4 防御

  • 扩展名(后缀)黑白名单
  • MIME类型校验(image/gif)
  • 文件内容头校验
  • 对文件内容进行二次渲染
  • 对上传的文件重命名,不易被猜测
  • 不要暴露上传文件的位置
  • 禁用上传文件的执行权限
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值